From 0d3c62241685a0b76a24ad8a2d11a8d5207fb181 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara Date: Mon, 10 Nov 2025 13:05:07 -0800 Subject: [PATCH 01/26] AI-ASSIST --- backend/app.py | 6 +- backend/config.py | 1 + backend/routes/ai_assistant.py | 77 +++ backend/services/image_generation_service.py | 150 +++++ backend/services/llm_service.py | 514 ++++++++++++++++++ frontend/package-lock.json | 64 ++- frontend/src/components/AI/AIAP.jsx | 224 ++++++++ .../src/components/AI/AIAssistantPanel.jsx | 111 ++++ frontend/src/components/AI/PromptInput.jsx | 98 ++++ .../components/AI/ShapeCompletionOverlay.jsx | 9 + frontend/src/hooks/useAIAssistant.js | 53 ++ frontend/src/styles/ai-assistant.css | 52 ++ 12 files changed, 1347 insertions(+), 12 deletions(-) create mode 100644 backend/routes/ai_assistant.py create mode 100644 backend/services/image_generation_service.py create mode 100644 backend/services/llm_service.py create mode 100644 frontend/src/components/AI/AIAP.jsx create mode 100644 frontend/src/components/AI/AIAssistantPanel.jsx create mode 100644 frontend/src/components/AI/PromptInput.jsx create mode 100644 frontend/src/components/AI/ShapeCompletionOverlay.jsx create mode 100644 frontend/src/hooks/useAIAssistant.js create mode 100644 frontend/src/styles/ai-assistant.css diff --git a/backend/app.py b/backend/app.py index 583632cd..457ffb7a 100644 --- a/backend/app.py +++ b/backend/app.py @@ -28,7 +28,7 @@ from routes.admin import admin_bp from routes.frontend import frontend_bp from routes.analytics import analytics_bp -from routes.export import export_bp +from routes.ai_assistant import ai_assistant_bp from services.db import redis_client from services.canvas_counter import get_canvas_draw_count from services.graphql_service import commit_transaction_via_graphql @@ -170,10 +170,10 @@ def handle_all_exceptions(e): app.register_blueprint(undo_redo_bp) app.register_blueprint(metrics_bp) app.register_blueprint(auth_bp) +app.register_blueprint(ai_assistant_bp) app.register_blueprint(rooms_bp) app.register_blueprint(submit_room_line_bp) app.register_blueprint(admin_bp) -app.register_blueprint(export_bp) # Register versioned API v1 blueprints for external applications from api_v1.auth import auth_v1_bp @@ -181,7 +181,6 @@ def handle_all_exceptions(e): from api_v1.collaborations import collaborations_v1_bp from api_v1.notifications import notifications_v1_bp from api_v1.users import users_v1_bp -from routes.stamps import stamps_bp from api_v1.templates import templates_v1_bp app.register_blueprint(auth_v1_bp) @@ -189,7 +188,6 @@ def handle_all_exceptions(e): app.register_blueprint(collaborations_v1_bp) app.register_blueprint(notifications_v1_bp) app.register_blueprint(users_v1_bp) -app.register_blueprint(stamps_bp, url_prefix='/api') app.register_blueprint(templates_v1_bp) # Frontend serving must be last to avoid route conflicts diff --git a/backend/config.py b/backend/config.py index 0655cd6e..cb99d158 100644 --- a/backend/config.py +++ b/backend/config.py @@ -24,6 +24,7 @@ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") ANALYTICS_COLLECTION_NAME = os.getenv("ANALYTICS_COLLECTION_NAME", "analytics_events") ANALYTICS_AGGREGATES_COLLECTION = os.getenv("ANALYTICS_AGGREGATES_COLLECTION", "analytics_aggregates") +HUGGINGFACE_API_KEY=os.getenv("HUGGINGFACE_API_KEY") JWT_SECRET = os.getenv("JWT_SECRET", "dev-insecure-change-me") JWT_ISSUER = "rescanvas" diff --git a/backend/routes/ai_assistant.py b/backend/routes/ai_assistant.py new file mode 100644 index 00000000..c871b6d4 --- /dev/null +++ b/backend/routes/ai_assistant.py @@ -0,0 +1,77 @@ +from flask import Blueprint, request, jsonify +from services.llm_service import prompt_to_drawings, complete_shape_from_canvas +import logging + +ai_assistant_bp = Blueprint('ai_assistant', __name__) +logger = logging.getLogger(__name__) + + +@ai_assistant_bp.route('/api/ai_assistant/drawing', methods=['POST']) +def text_to_drawings(): + """ + Body: { "prompt": "", canvasState: {json object} } + Returns: parsed drawing JSON (shape/color/size/position/...) or an error payload. + """ + try: + payload = request.get_json(silent=True) or {} + prompt = payload.get("prompt") + canvasState = payload.get("canvasState") or {} + + if not isinstance(prompt, str) or not prompt.strip(): + return jsonify({"error": "bad_request", "detail": "Missing or invalid 'prompt' (string)."}), 400 + + logger.info("AI drawing requested") + result = prompt_to_drawings(prompt.strip(), canvasState) + + # print(f"Model result: {result}") + + # If services returned an error, surface it with 502 (bad upstream) + if isinstance(result, dict) and "error" in result: + logger.warning("AI drawing failed: %s", result) + return jsonify({"error": "upstream_model_error", "detail": result}), 502 + + return jsonify(result), 200 + except Exception as e: + logger.exception("Unhandled error in /drawing") + return jsonify({"error": "server_error", "detail": str(e)}), 500 + + +@ai_assistant_bp.route('/api/ai_assistant/complete', methods=['POST']) +def shape_completion(): + """ + Body: { "canvasState": { ... } } + Returns: { complete, confidence, object{ color, lineWidth, pathData{...} } } or an error payload. + """ + try: + payload = request.get_json(silent=True) or {} + canvas_state = payload.get("canvasState") + if not isinstance(canvas_state, dict): + return jsonify({"error": "bad_request", "detail": "Missing or invalid 'canvas_state' (object)."}), 400 + + logger.info("AI shape completion requested") + suggestion = complete_shape_from_canvas(canvas_state) + + if not isinstance(canvas_state, dict): + return jsonify({ + "error": "bad_request", + "detail": "Missing or invalid 'canvasState' (object)." + }), 400 + + return jsonify(suggestion), 200 + except Exception as e: + logger.exception("Unhandled error in /complete") + return jsonify({"error": "server_error", "detail": str(e)}), 500 + + +@ai_assistant_bp.route('/api/ai_assistant/image', methods=['POST']) +def text_to_image(): + pass + + +@ai_assistant_bp.route('/api/ai_assistant/beautify', methods=['POST']) +def beautify_sketch(): + pass + +# @ai_assistant_bp.route('/api/ai_assistant/inpainting', methods=['POST']) +# def apply_inpainting(): +# pass diff --git a/backend/services/image_generation_service.py b/backend/services/image_generation_service.py new file mode 100644 index 00000000..31d58d35 --- /dev/null +++ b/backend/services/image_generation_service.py @@ -0,0 +1,150 @@ +""" +image_generation_service.py + +Implements: +1) Text → Image generation (Stable Diffusion XL via Hugging Face Inference API) +2) Image → Canvas conversion as SVG (vectorization with potrace; base64 SVG fallback) +3) Style transfer (image-to-image, prompt-driven edits) +4) Sketch beautification (local cleanup + optional refinement) + +Requirements: + pip install huggingface_hub pillow +Optional (for true vectorization): + pip install potrace numpy pixels2svg +""" +from typing import Optional +from PIL import Image, ImageFilter, ImageOps + +from config import HUGGINGFACE_API_KEY +from huggingface_hub import InferenceClient + +# Model choices +HF_IMG_TXT2IMG = "stabilityai/stable-diffusion-xl-base-1.0" # text → image +HF_IMG_EDIT = "timbrooks/instruct-pix2pix" # image → image (edits/style) + + +def _get_hf_client() -> InferenceClient: + """ + Create and return a Hugging Face InferenceClient using HUGGINGFACE_API_KEY + from config or environment. Raises if no token is available. + """ + if not HUGGINGFACE_API_KEY: + raise RuntimeError("HUGGINGFACE_API_KEY not configured. Set in config.py or environment.") + return InferenceClient(token=HUGGINGFACE_API_KEY) + + +def generate_image_from_prompt( + prompt: str, + size: str = "1024x1024", +) -> Optional[Image.Image]: + """ + Generate an image from a natural-language text prompt via Stable Diffusion XL. + + Args: + prompt: Description of the target image. + size: Output resolution as "WxH" (e.g., "512x512", "1024x1024"). + + Returns: + PIL.Image on success, or None on failure. + """ + try: + client = _get_hf_client() + img = client.text_to_image( + model=HF_IMG_TXT2IMG, + prompt=prompt, + size=size, + ) + return img + except Exception as e: + print(f"image_generation: text_to_image failed: {e}") + return None + +def apply_style_transfer( + source_image: Image.Image, + style_prompt: str, + strength: float = 0.6, +) -> Optional[Image.Image]: + """ + Apply a target style to an input image via image-to-image diffusion. + + Args: + source_image: PIL image to restyle. + style_prompt: Text like "watercolor style", "Van Gogh style", etc. + strength: Degree of change (higher → more change). Typical: 0.2–0.8. + + Returns: + PIL.Image on success, or None on failure. + """ + try: + client = _get_hf_client() + edited = client.image_to_image( + model=HF_IMG_EDIT, # instruct-pix2pix + image=source_image, + prompt=style_prompt, + strength=strength, + ) + return edited + except Exception as e: + print(f"image_generation: style transfer failed: {e}") + return None + + +def beautify_sketch( + sketch_image: Image.Image, + level: str = "medium", + refine_with_model: bool = True, + prompt_hint: str = "clean line art, smooth curves, vector-like, high contrast", +) -> Optional[Image.Image]: + """ + Clean and beautify a rough sketch. Performs local denoise/sharpen first, + then optionally refines with an image-to-image edit model. + + Args: + sketch_image: PIL image of a line drawing or rough sketch. + level: 'light' | 'medium' | 'strong' — controls denoise strength. + refine_with_model: If True, run an img2img refinement step. + prompt_hint: Guidance text for the refinement model. + + Returns: + PIL.Image on success, or None on failure. + """ + try: + img = sketch_image.convert("L") # grayscale + img = ImageOps.autocontrast(img) # normalize contrast + + if level == "light": + img = img.filter(ImageFilter.MedianFilter(size=3)) + elif level == "medium": + img = img.filter(ImageFilter.MedianFilter(size=3)).filter( + ImageFilter.GaussianBlur(radius=0.6) + ) + else: # strong + img = img.filter(ImageFilter.MedianFilter(size=5)).filter( + ImageFilter.GaussianBlur(radius=1.0) + ) + + # Re-invert trick to emphasize edges after smoothing + img = ImageOps.invert(ImageOps.autocontrast(ImageOps.invert(img))) + + cleaned_rgb = img.convert("RGB") + + # Optional refinement via HF model + if not refine_with_model: + return cleaned_rgb + + try: + client = _get_hf_client() + refined = client.image_to_image( + model=HF_IMG_EDIT, + image=cleaned_rgb, + prompt=prompt_hint, + strength=0.35 if level == "light" else 0.5 if level == "medium" else 0.65, + ) + return refined + except Exception as e: + print(f"image_generation: beautify refine skipped: {e}") + return cleaned_rgb + + except Exception as e: + print(f"image_generation: beautify failed: {e}") + return None diff --git a/backend/services/llm_service.py b/backend/services/llm_service.py new file mode 100644 index 00000000..34bd4035 --- /dev/null +++ b/backend/services/llm_service.py @@ -0,0 +1,514 @@ +# pip install openai ollama +import json +import typing + +# === text to drawings ========================================================= +# System prompt +SYSTEM_PROMPT = """ +You are a drawing-command generator for a canvas app. + +Inputs you will be given: +- CanvasState: { "drawings": [ ... ], "bounds": { "width": number, "height": number } } +- UserPrompt: a natural-language scene description + +Goal: +Return a SINGLE JSON object with an "objects" array. Each item is a canvas-ready drawing command that our app can render directly. + +Output (JSON ONLY, no comments, no markdown): +{ + "objects": [ + { + "color": "#RRGGBB", + "lineWidth": number, + "pathData": { + "tool": "shape", + "type": "rectangle|circle|line|polygon|text", + // Use one of these geometry encodings (no others): + // circle/rectangle/line: + "start": {"x": number, "y": number}, + "end": {"x": number, "y": number}, + // polygon (including triangles): + "points": [ {"x": number, "y": number}, ... ], + // text: + "text": "string" + } + } + ] +} + +Rules & Defaults (match our canvas code): +- Use ABSOLUTE pixel coordinates with (0,0) at top-left; all points MUST lie within [0, bounds.width] × [0, bounds.height]. +- Color words → hex (e.g., "red"→"#FF0000", "blue"→"#0000FF"). +- Sizes: tiny=20, small=40, medium=80, large=140, huge=220. For circles, represent size by the distance between start and end (radius as line length). +- Relative positions from the prompt (e.g., "center", "top-right") must be converted to absolute: + center=(W/2,H/2), top-left=(0,0), top=(W/2,0), top-right=(W,0), + left=(0,H/2), right=(W,H/2), bottom-left=(0,H), bottom=(W/2,H), bottom-right=(W,H). + +When CanvasState is provided: +- Avoid obvious overlaps with existing content unless the prompt demands it (e.g., “on top of…”). +- Keep new objects visually distinct (slight offsets are OK when crowded). + +Content fidelity: +- Include EVERY explicitly mentioned object; respect counts, colors, sizes, and spatial relations. +- If motion/action is described, suggest simple visual cues (e.g., angled line, small polygon “arrow”, or secondary object) using primitives. +- If ambiguous, choose a common-sense default and continue. + +Constraints: +- Output MUST be valid JSON matching the schema above. Do not include IDs (the app assigns them). +- Keep a modest number of objects (clear but not cluttered). +""" + +# Few-shot to stabilize canvas-native formatting +FEWSHOT_USER_1 = """ +CanvasState: {"drawings":[],"bounds":{"width":3000,"height":2000}} +UserPrompt: draw a small blue circle at the top-right +""" + +FEWSHOT_ASSISTANT_JSON_1 = { + "objects": [ + { + "color": "#0000FF", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 2900, "y": 100}, + "end": {"x": 2940, "y": 100} + } + } + ] +} + +FEWSHOT_USER_2 = """ +CanvasState: +{"drawings":[],"bounds":{"width":3000,"height":2000}} +UserPrompt: +"draw a red car driving in the woods" +""" + +FEWSHOT_ASSISTANT_JSON_2 = { + "objects": [ + # Trees (two) + { + "color": "#228B22", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 600, "y": 1050}, + {"x": 650, "y": 950}, + {"x": 700, "y": 1050} + ] + } + }, + { + "color": "#8B4513", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 645, "y": 1050}, + "end": {"x": 655, "y": 1100} + } + }, + { + "color": "#228B22", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 2300, "y": 1000}, + {"x": 2350, "y": 900}, + {"x": 2400, "y": 1000} + ] + } + }, + { + "color": "#8B4513", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 2345, "y": 1000}, + "end": {"x": 2355, "y": 1050} + } + }, + + # Road (line with slight angle) + { + "color": "#555555", + "lineWidth": 6, + "pathData": { + "tool": "shape", + "type": "line", + "start": {"x": 400, "y": 1400}, + "end": {"x": 2600, "y": 1500} + } + }, + + # Red car on the road + { + "color": "#FF0000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 1450, "y": 1380}, + "end": {"x": 1650, "y": 1450} + } + }, + { + "color": "#FF0000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 1500, "y": 1380}, + {"x": 1600, "y": 1380}, + {"x": 1550, "y": 1340} + ] + } + }, + # Wheels + { + "color": "#000000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 1500, "y": 1450}, + "end": {"x": 1520, "y": 1450} + } + }, + { + "color": "#000000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 1600, "y": 1450}, + "end": {"x": 1620, "y": 1450} + } + }, + # Motion cue (small angled line “speed line”) + { + "color": "#000000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "line", + "start": {"x": 1420, "y": 1415}, + "end": {"x": 1450, "y": 1400} + } + } + ] +} + +FEWSHOT_USER_3 = """ +CanvasState: +{ + "drawings": [ + {"color":"#8B4513","lineWidth":2,"pathData":{"tool":"shape","type":"rectangle","start":{"x":1400,"y":1200},"end":{"x":1600,"y":1270}}}, + {"color":"#FF0000","lineWidth":2,"pathData":{"tool":"shape","type":"polygon","points":[{"x":1400,"y":1200},{"x":1500,"y":1120},{"x":1600,"y":1200}]}} + ], + "bounds":{"width":3000,"height":2000} +} +UserPrompt: +"add a blue window to the right of the house" +""" + +FEWSHOT_ASSISTANT_JSON_3 = { + "objects": [ + { + "color": "#0000FF", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 1650, "y": 1210}, + "end": {"x": 1690, "y": 1245} + } + } + ] +} + +def _get_text_to_drawings_initial_message(prompt: str, canvasState: dict[str, typing.Any]) -> list[dict]: + """ + Build the minimal, few-shot seeded chat message list for the + text→drawing JSON parser. + + Args: + prompt: The end-user natural language description (e.g., "draw a small + blue circle"). + canvasState (dict[str, Any]): + A Python dictionary representing the current state of the canvas. + + Returns: + A list of role/content dicts suitable for OpenAI/Ollama chat APIs: + [system, user(few-shot), assistant(few-shot), user(actual prompt)]. + """ + canvas_json = json.dumps(canvasState, separators=(",", ":")) + + # Combine into a single message for the model + user_prompt = ( + f"CanvasState:\n{canvas_json}\n" + f"UserPrompt:\nDescribe all shapes needed to draw this scene: {prompt}" + ) + + return [ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": FEWSHOT_USER_1}, + {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_1)}, + {"role": "user", "content": FEWSHOT_USER_2}, + {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_2)}, + {"role": "user", "content": user_prompt}, + ] + +def openai_prompt_to_json(prompt: str, canvasState: dict[str, typing.Any]) -> dict: + """ + Convert a natural-language drawing prompt into structured JSON + using the OpenAI GPT-4.1-mini model. + + Args: + prompt: The user's text prompt describing the drawing. + + Returns: + Dict containing parsed drawing attributes or an error payload. + """ + try: + from config import OPENAI_API_KEY + from openai import OpenAI + + client = OpenAI(api_key=OPENAI_API_KEY) + + resp = client.chat.completions.create( + model="gpt-4.1-mini", + response_format={"type": "json_object"}, # forces valid JSON + temperature=0.1, + messages=_get_text_to_drawings_initial_message(prompt, canvasState), + max_tokens=1000, + ) + content = resp.choices[0].message.content + # print("\nAPI response: ", content, "\n") + return json.loads(content) + except Exception as e: + return {"error": "openai_failed", "detail": str(e)} + +def ollama_prompt_to_json(prompt: str, canvasState: dict[str, typing.Any]) -> dict: + """ + Convert a natural-language drawing prompt into structured JSON + using a locally hosted Ollama model as a fallback. + + Args: + prompt: The user's text prompt describing the drawing. + + Returns: + Dict containing parsed drawing attributes or an error payload. + """ + try: + import ollama + + response = ollama.chat( + model="llama3:8b", + messages=_get_text_to_drawings_initial_message(prompt, canvasState) + ) + + return json.loads(response['message']['content']) + except Exception as e: + return {"error": "ollama_failed", "detail": str(e)} + +def prompt_to_drawings(prompt: str, canvasState: dict[str, typing.Any]) -> dict: + """ + Route a drawing prompt to OpenAI first, then fall back to Ollama + if the cloud model fails. Guarantees a dictionary response. + + Args: + prompt: The user's text prompt describing the drawing. + + Returns: + Dict containing parsed drawing attributes or an error payload. + """ + model_output = openai_prompt_to_json(prompt, canvasState) + + # If user setup openai API's properly and no errors + # occured, return the model's output + if "error" not in model_output: + return model_output + + # Fallback + fallback_model_output = ollama_prompt_to_json(prompt, canvasState) + return fallback_model_output + +# === Shape Completion ========================================================= +SHAPE_COMPLETION_SYSTEM = """ +You are a shape-completion engine for a canvas app. + +Inputs you will be given: +- CanvasState: the current canvas (existing drawings + bounds) + +Goal: +Infer the single most likely primitive shape that best fits canvasState, and return it in a canvas-ready format. + +Output (JSON ONLY, no comments, no markdown): +{ + "complete": true|false, + "confidence": number, // 0.0–1.0 + "object": { + "color": "#RRGGBB", + "lineWidth": number, + "pathData": { + "tool": "shape", + "type": "circle|rectangle|line|polygon|text", + // circle/rectangle/line: + "start": {"x": number, "y": number}, + "end": {"x": number, "y": number}, + // polygon (including triangle): + "points": [ {"x": number, "y": number}, ... ], + // text (rare for completion; omit unless clearly indicated): + "text": "string" + } + } +} + +Rules: +- Use ABSOLUTE coordinates within CanvasState.bounds (0,0 = top-left). +- Infer a single primitive that best fits the partial strokes/points. Prefer simpler fits that preserve user intent. +- If uncertainty is high (confidence < 0.4), set "complete": false and return a best-effort "object" anyway (so the UI can show a ghost preview). +- Color default: use the majority/last stroke color if available; otherwise "#000000". +- Snap centers/edges to nearby anchors (guides, bounding-box centers/edges) if within ~6px. +- Output MUST be valid JSON matching the schema above exactly. +""" + +# Few-shots (2 strong, compact) + +SHAPE_COMPLETION_FEWSHOT_USER_1 = """ +CanvasState: +{"drawings":[],"bounds":{"width":1200,"height":800}} +""" + +SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1 = { + "complete": True, + "confidence": 0.86, + "object": { + "color": "#0000FF", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 360, "y": 420}, + "end": {"x": 400, "y": 420} + } + } +} + +SHAPE_COMPLETION_FEWSHOT_USER_2 = """ +CanvasState: +{"drawings":[{}],"bounds":{"width":1200,"height":800}} +""" + +SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2 = { + "complete": True, + "confidence": 0.78, + "object": { + "color": "#333333", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 500, "y": 300}, + "end": {"x": 700, "y": 420} + } + } +} + +def _get_shape_completion_initial_message( + canvas_state: dict[str, typing.Any]) -> list[dict]: + """ + Build the few-shot seeded chat messages for shape completion. + + Args: + canvas_state (dict[str, Any]): + The current canvas state. Expected keys: + - "drawings": list of existing drawings (color, lineWidth, pathData, etc.) + - "bounds": { "width": number, "height": number } + + + Returns: + list[dict]: Chat messages for OpenAI/Ollama APIs: + [system, user(few-shot), assistant(few-shot), user(few-shot), assistant(few-shot), user(actual)] + """ + canvas_json = json.dumps(canvas_state, separators=(",", ":")) + user_msg = f"CanvasState:\n{canvas_json}" + + return [ + {"role": "system", "content": SHAPE_COMPLETION_SYSTEM}, + {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_1}, + {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1)}, + {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_2}, + {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2)}, + {"role": "user", "content": user_msg}, + ] + +def openai_complete_shape(canvas_state: dict) -> dict: + """ + Infer and complete a likely shape from the current partial input using OpenAI. + + Args: + canvas_state (dict): Current canvas (drawings + bounds). + + Returns: + dict: { complete, confidence, object{ color, lineWidth, pathData{...} } } or error payload. + """ + try: + from config import OPENAI_API_KEY + from openai import OpenAI + client = OpenAI(api_key=OPENAI_API_KEY) + + resp = client.chat.completions.create( + model="gpt-4.1-mini", + response_format={"type": "json_object"}, + temperature=0.1, + messages=_get_shape_completion_initial_message(canvas_state), + max_tokens=220, + ) + return json.loads(resp.choices[0].message.content) + except Exception as e: + return {"error": "openai_completion_failed", "detail": str(e)} + +def ollama_complete_shape(canvas_state: dict) -> dict: + """ + Infer and complete a likely shape from the current partial input using Ollama. + + Args: + canvas_state (dict): Current canvas (drawings + bounds). + + Returns: + dict: { complete, confidence, object{ color, lineWidth, pathData{...} } } or error payload. + """ + try: + import ollama + response = ollama.chat( + model="llama3:8b", + messages=_get_shape_completion_initial_message(canvas_state) + ) + return json.loads(response["message"]["content"]) + except Exception as e: + return {"error": "ollama_completion_failed", "detail": str(e)} + +def complete_shape_from_canvas(canvas_state: dict) -> dict: + """ + Perform AI-based shape completion using OpenAI first, then Ollama. + + Args: + canvas_state (dict): Current canvas (drawings + bounds). + + Returns: + dict: Inferred shape completion result. + """ + model_output = openai_complete_shape(canvas_state) + if "error" not in model_output: + return model_output + return ollama_complete_shape(canvas_state) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f1b6a622..f64749d3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -96,6 +96,7 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -715,6 +716,7 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1524,6 +1526,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-module-imports": "^7.25.9", @@ -2327,6 +2330,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2370,6 +2374,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3050,6 +3055,7 @@ "version": "6.4.7", "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.7.tgz", "integrity": "sha512-K65StXUeGAtFJ4ikvHKtmDCO5Ab7g0FZUu2J5VpoKD+O6Y3CjLYzRi+TMlI3kaL4CL158+FccMoOd/eaddmeRQ==", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.4.7", @@ -3719,7 +3725,6 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3738,7 +3743,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -4314,6 +4318,7 @@ "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4437,6 +4442,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4488,6 +4494,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4827,6 +4834,7 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4905,6 +4913,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5713,6 +5722,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -7057,6 +7067,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -7988,6 +7999,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -10816,6 +10828,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -13861,6 +13874,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -14953,6 +14967,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -15296,6 +15311,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -15458,6 +15474,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -15506,6 +15523,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -16296,6 +16314,7 @@ "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -16515,6 +16534,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -18058,6 +18078,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "peer": true, "engines": { "node": ">=10" }, @@ -18597,6 +18618,7 @@ "version": "5.96.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -18664,6 +18686,7 @@ "version": "4.15.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -19062,6 +19085,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19477,6 +19501,7 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -19893,6 +19918,7 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.25.9" } @@ -20384,6 +20410,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "peer": true, "requires": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-module-imports": "^7.25.9", @@ -20897,6 +20924,7 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", + "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -20929,6 +20957,7 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", + "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -21418,6 +21447,7 @@ "version": "6.4.7", "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.7.tgz", "integrity": "sha512-K65StXUeGAtFJ4ikvHKtmDCO5Ab7g0FZUu2J5VpoKD+O6Y3CjLYzRi+TMlI3kaL4CL158+FccMoOd/eaddmeRQ==", + "peer": true, "requires": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.4.7", @@ -21793,7 +21823,6 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -21809,7 +21838,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "peer": true, "requires": { "dequal": "^2.0.3" } @@ -22322,6 +22350,7 @@ "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -22442,6 +22471,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "peer": true, "requires": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -22467,6 +22497,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "peer": true, "requires": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -22723,7 +22754,8 @@ "acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "peer": true }, "acorn-globals": { "version": "6.0.0", @@ -22778,6 +22810,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -23356,6 +23389,7 @@ "version": "4.24.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "peer": true, "requires": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -24267,7 +24301,8 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true }, "d3-shape": { "version": "3.2.0", @@ -24950,6 +24985,7 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -26905,6 +26941,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "peer": true, "requires": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -29020,6 +29057,7 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -29615,6 +29653,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -29865,6 +29904,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -29987,6 +30027,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -30022,7 +30063,8 @@ "react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "peer": true }, "react-router": { "version": "7.0.2", @@ -30565,6 +30607,7 @@ "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "peer": true, "requires": { "fsevents": "~2.3.2" } @@ -30694,6 +30737,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -31869,7 +31913,8 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "peer": true }, "type-is": { "version": "1.6.18", @@ -32245,6 +32290,7 @@ "version": "5.96.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -32313,6 +32359,7 @@ "version": "4.15.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "peer": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -32579,6 +32626,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/frontend/src/components/AI/AIAP.jsx b/frontend/src/components/AI/AIAP.jsx new file mode 100644 index 00000000..8b3158eb --- /dev/null +++ b/frontend/src/components/AI/AIAP.jsx @@ -0,0 +1,224 @@ +// import React from 'react'; +// import PropTypes from 'prop-types'; +import Box from '@mui/material/Box'; +import Drawer from '@mui/material/Drawer'; +import Paper from '@mui/material/Paper'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Divider from '@mui/material/Divider'; +import Stack from '@mui/material/Stack'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import ListItemText from '@mui/material/ListItemText'; +import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; +import Chip from '@mui/material/Chip'; +import CircularProgress from '@mui/material/CircularProgress'; +import Alert from '@mui/material/Alert'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import CloseIcon from '@mui/icons-material/Close'; +import CheckIcon from '@mui/icons-material/Check'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; +import SmartToyIcon from '@mui/icons-material/SmartToy'; +import PromptInput from './PromptInput'; + +export default function AIAssistantPanel({ + open, + onClose, + onSubmitPrompt, + isBusy, + error, + suggestions, + onAcceptSuggestion, + onDiscardSuggestion, + model, + onModelChange, + examplePrompts = [ + 'draw a blue rectangle center', + 'scatter 5 small stars top-right', + 'smooth this sketch into a circle', + ], +}) { + const handleSubmit = (text) => { + if (!text || isBusy) return; + onSubmitPrompt?.(text.trim()); + }; + + const renderSuggestionPreview = (s) => { + if (s?.previewSvg) { + return ( + + ); + } + if (s?.previewUrl) { + return ( + + ); + } + return ( + + No preview + + ); + }; + + return ( + + + + AI Assistant + + + + + + + + + + Model + + + + + + {error && {String(error)}} + + {isBusy && ( + + + Thinking… + + )} + + + + + + + Suggestions + + + + + {(suggestions || []).map((s) => ( + + + {renderSuggestionPreview(s)} + + + + + onAcceptSuggestion?.(s)}> + + + + + onDiscardSuggestion?.(s.id)}> + + + + + + + + ))} + + + {!suggestions?.length && ( + + No suggestions yet — try a prompt above. + + )} + + + ); +} + +// AIAssistantPanel.propTypes = { +// open: PropTypes.bool, +// onClose: PropTypes.func, +// onSubmitPrompt: PropTypes.func, +// isBusy: PropTypes.bool, +// error: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), +// suggestions: PropTypes.arrayOf( +// PropTypes.shape({ +// id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, +// title: PropTypes.string, +// subtitle: PropTypes.string, +// type: PropTypes.string, +// previewSvg: PropTypes.string, +// previewUrl: PropTypes.string, +// payload: PropTypes.any, +// }) +// ), +// onAcceptSuggestion: PropTypes.func, +// onDiscardSuggestion: PropTypes.func, +// model: PropTypes.string, +// onModelChange: PropTypes.func, +// examplePrompts: PropTypes.arrayOf(PropTypes.string), +// }; + + +/* + setAiOpen(false)} + // onSubmitPrompt={handleSubmitPrompt} + isBusy={aiBusy} + error={aiError} + suggestions={aiSuggestions} + // onAcceptSuggestion={handleAcceptSuggestion} + // onDiscardSuggestion={handleDiscardSuggestion} + model={aiModel} + onModelChange={setAiModel} +/> +*/ \ No newline at end of file diff --git a/frontend/src/components/AI/AIAssistantPanel.jsx b/frontend/src/components/AI/AIAssistantPanel.jsx new file mode 100644 index 00000000..0b7391fa --- /dev/null +++ b/frontend/src/components/AI/AIAssistantPanel.jsx @@ -0,0 +1,111 @@ +import React, { useState } from "react"; +import '../../styles/ai-assistant.css'; +import { Tooltip, IconButton } from "@mui/material"; +import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; +import ImageIcon from '@mui/icons-material/Image'; +import RoundedCornerIcon from '@mui/icons-material/RoundedCorner'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; + +export default function AIAssistantPanel({ + open, + onClose, + isBusy, + error, + showPromptInput, +}) { + const [activeButton, setActiveButton] = useState(""); + + const handlePanelItemClick = (itemTitle) => { + // If it's the beautify button, do NOT toggle + if (itemTitle === "Beautify sketch") { + // TODO: call beautify action here + console.log("Beautify action triggered"); + return; + } + + const next = activeButton === itemTitle ? "" : itemTitle; + setActiveButton(next); + + if (next === "Generate sketch") { + showPromptInput(true, { + type: 'drawing', + placeholder: "Describe what to draw…" + }); + } else if (next === "Generate image") { + showPromptInput(true, { + type: 'image', + placeholder: "Describe the image to generate…" + }); + } else { + showPromptInput(false, { + type: '', + placeholder: "" + }); + } + }; + + const renderStyleClass = (itemTitle) => { + // Beautify sketch should never be active + if (itemTitle === "Beautify sketch") { + return "ai-asisstant-panel-item"; + } + + return itemTitle === activeButton + ? "ai-asisstant-panel-item ai-asisstant-panel-item-active" + : "ai-asisstant-panel-item"; + }; + + return ( +
+ +
handlePanelItemClick("Generate sketch")} + aria-pressed={activeButton === "Generate sketch"} + > + + + + + +
+ +
handlePanelItemClick("Generate image")} + aria-pressed={activeButton === "Generate image"} + > + + + + + +
+ +
handlePanelItemClick("Shape auto completion")} + aria-pressed={activeButton === "Shape auto completion"} + > + + + + + +
+ +
handlePanelItemClick("Beautify sketch")} + aria-pressed={false} // Never active + > + + + + + +
+ +
+ ); +} diff --git a/frontend/src/components/AI/PromptInput.jsx b/frontend/src/components/AI/PromptInput.jsx new file mode 100644 index 00000000..3eafb369 --- /dev/null +++ b/frontend/src/components/AI/PromptInput.jsx @@ -0,0 +1,98 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import { Button, TextareaAutosize, Box, CircularProgress } from '@mui/material'; + +export default function PromptInput({ + show=false, + loading=false, + onSubmit=()=>{}, + placeholder = 'Describe what to draw…', +}) { + const [text, setText] = useState(''); + // const [loading, setLoading] = useState(false); + + const handleSubmit = async () => { + if (!text.trim() || loading) return; + + // Do some processing + onSubmit?.(text.trim()); + }; + + const handleKeyDownPress = (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSubmit(); + } else if (e.key === 'Escape') { + e.preventDefault(); + setText(''); + } + }; + + return ( + + setText(e.target.value)} + onKeyDown={handleKeyDownPress} + disabled={loading} + minRows={1} + style={{ + width: 'auto', + minWidth: 450, + resize: 'none', + border: 'none', + outline: 'none', + fontSize: '14px', + padding: '8px', + background: 'transparent', + fontFamily: 'inherit', + }} + /> + + + ); +} + +PromptInput.propTypes = { + onSubmit: PropTypes.func, + loading: PropTypes.bool, + placeholder: PropTypes.string, +}; diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx new file mode 100644 index 00000000..ee006284 --- /dev/null +++ b/frontend/src/components/AI/ShapeCompletionOverlay.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function ShapeCompletionOverlay() { + return ( +
+ +
+ ) +} diff --git a/frontend/src/hooks/useAIAssistant.js b/frontend/src/hooks/useAIAssistant.js new file mode 100644 index 00000000..fc116091 --- /dev/null +++ b/frontend/src/hooks/useAIAssistant.js @@ -0,0 +1,53 @@ +import { useState } from "react"; + +export function useAIAssistant() { + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [result, setResult] = useState(null); + + const callAIAssistant = async (endpoint, body) => { + setLoading(true); + setError(null); + + console.log("Body: ", body); + + try { + const res = await fetch(`http://127.0.0.1:10010/api/ai_assistant/${endpoint}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + + console.log("AI Asisst Response: ", res); + + if (!res.ok) { + throw new Error(`Request failed: ${res.status}`); + } + + const data = await res.json(); + setResult(data); + return data; + } catch (err) { + setError(err.message); + console.error("AI assistant error:", err); + } finally { + setLoading(false); + } + }; + + // Examples of wrapper methods for each route + const textToDrawing = (prompt, canvasState) => callAIAssistant("drawing", { prompt, canvasState }); + const shapeCompletion = (canvasState) => callAIAssistant("complete", { canvasState }); + const textToImage = (prompt) => callAIAssistant("image", { prompt }); + const beautifySketch = (canvasState) => callAIAssistant("beautify", { canvasState }); + + return { + aiAssistLoading: loading, + aiAssistError: error, + aiAssistResult: result, + textToDrawing, + shapeCompletion, + textToImage, + beautifySketch, + }; +} diff --git a/frontend/src/styles/ai-assistant.css b/frontend/src/styles/ai-assistant.css new file mode 100644 index 00000000..81238077 --- /dev/null +++ b/frontend/src/styles/ai-assistant.css @@ -0,0 +1,52 @@ +/* AI Assistant Panel Style */ +.ai-assistant-panel-container { + display: flex; + min-width: 250px; + padding: 0 10px; + margin-top: 10px; + align-items: center; + justify-content: space-between; + background-color: #25D8C5; + border-top-right-radius: 15px; + border-bottom-right-radius: 15px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +.ai-assistant-panel-container-open { + position: absolute; + left: 0; + /* bottom: -50px; */ + top: -75px; + transition-duration: .4s; +} + +.ai-assistant-panel-container-close { + position: absolute; + left: -300px; + /* bottom: -50px; */ + top: -75px; + transition-duration: .4s; +} + +.ai-asisstant-panel-item { + padding: 0 5px; + margin: 5px; + border-radius: 8px; +} + +.ai-asisstant-panel-item-active { + padding: 0 5px; + margin: 5px; + border-radius: 8px; + background-color: rgba(0, 0, 0, .1); +} + +.ai-asisstant-panel-item:hover { + background-color: rgba(0, 0, 0, .05); + transition-duration: .3s; +} + + +/* Prompt Input Component Styles */ + + From 9389ed32faa7a9aabdb5c16d517ab157c40930fe Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:14:28 -0800 Subject: [PATCH 02/26] Update ShapeCompletionOverlay.jsx --- .../components/AI/ShapeCompletionOverlay.jsx | 177 +++++++++++++++++- 1 file changed, 169 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx index ee006284..de907913 100644 --- a/frontend/src/components/AI/ShapeCompletionOverlay.jsx +++ b/frontend/src/components/AI/ShapeCompletionOverlay.jsx @@ -1,9 +1,170 @@ -import React from 'react'; - -export default function ShapeCompletionOverlay() { - return ( -
- -
- ) +import { Box, IconButton } from '@mui/material'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; + +export default function ShapeCompletionOverlay({ + open = false, + suggestion = null, + anchor = null, + panOffset = { x: 0, y: 0 }, + canvasWidth, + canvasHeight, + onAccept = () => {}, + onReject = () => {}, +}) { + if (!open || !suggestion || !suggestion.object || !suggestion.object.pathData) { + return null; + } + + const { object } = suggestion; + const { pathData } = object; + + // Compute bounding box and center from the suggestion.pathData. + // We handle both: + // - Freehand strokes / polygons: pathData.points[] + // - Basic shapes (line/circle/rectangle) with start/end + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + + const updateBounds = (x, y) => { + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + }; + + if (Array.isArray(pathData.points) && pathData.points.length > 0) { + // Stroke or polygon: walk through all points + for (const pt of pathData.points) { + if (!pt) continue; + const px = pt.x ?? 0; + const py = pt.y ?? 0; + updateBounds(px, py); + } + } else if (pathData.start && pathData.end) { + // Basic shape / line / circle using start / end + if (typeof pathData.start.x === 'number' && typeof pathData.start.y === 'number') { + updateBounds(pathData.start.x, pathData.start.y); + } + if (typeof pathData.end.x === 'number' && typeof pathData.end.y === 'number') { + updateBounds(pathData.end.x, pathData.end.y); + } + } + + if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) { + return null; + } + + const shapeWidth = maxX - minX || 1; + const shapeHeight = maxY - minY || 1; + + const shapeCenterX = minX + shapeWidth / 2; + const shapeCenterY = minY + shapeHeight / 2; + + // If we have an anchor (the user's last drag or cursor), try to align around it. + let overlayCenterX = shapeCenterX + panOffset.x; + let overlayCenterY = shapeCenterY + panOffset.y; + + // Clamp inside canvas + const halfBoxW = 120; + const halfBoxH = 40; + + if (typeof canvasWidth === 'number') { + overlayCenterX = Math.max(halfBoxW, Math.min(canvasWidth - halfBoxW, overlayCenterX)); + } + if (typeof canvasHeight === 'number') { + overlayCenterY = Math.max(halfBoxH, Math.min(canvasHeight - halfBoxH, overlayCenterY)); + } + + const overlayLeft = overlayCenterX - halfBoxW; + const overlayTop = overlayCenterY - halfBoxH; + + // Helper: label for the suggestion, e.g. "Complete rectangle" or "Refine stroke" + const getSuggestionLabel = () => { + const tool = pathData.tool; + const type = pathData.type; + + if (tool === 'freehand' || type === 'stroke') { + return 'Refine stroke?'; + } + if (['rectangle', 'circle', 'line', 'polygon'].includes(type)) { + return `Complete ${type}?`; + } + return 'Apply suggestion?'; + }; + + return ( + <> + {/* Outline of the suggested shape area (visual hint) */} + + + {/* Floating confirmation box near the suggestion */} + + + {getSuggestionLabel()} + + + + + + + + + + + ); } From b1be6e065460de4335eac71797a03812ba7ef6de Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:18:59 -0800 Subject: [PATCH 03/26] Update ai-assistant.css --- frontend/src/styles/ai-assistant.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frontend/src/styles/ai-assistant.css b/frontend/src/styles/ai-assistant.css index 81238077..8222c0dc 100644 --- a/frontend/src/styles/ai-assistant.css +++ b/frontend/src/styles/ai-assistant.css @@ -46,7 +46,3 @@ transition-duration: .3s; } - -/* Prompt Input Component Styles */ - - From af1c532dac7dc374288357efe15886d08fe7f831 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:24:35 -0800 Subject: [PATCH 04/26] Update ShapeCompletionOverlay.jsx --- .../components/AI/ShapeCompletionOverlay.jsx | 227 ++++++++++-------- 1 file changed, 121 insertions(+), 106 deletions(-) diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx index de907913..1eb912e3 100644 --- a/frontend/src/components/AI/ShapeCompletionOverlay.jsx +++ b/frontend/src/components/AI/ShapeCompletionOverlay.jsx @@ -1,3 +1,6 @@ +// frontend/src/components/AI/ShapeCompletionOverlay.jsx +import React from 'react'; +import PropTypes from 'prop-types'; import { Box, IconButton } from '@mui/material'; import CheckIcon from '@mui/icons-material/Check'; import CloseIcon from '@mui/icons-material/Close'; @@ -19,131 +22,129 @@ export default function ShapeCompletionOverlay({ const { object } = suggestion; const { pathData } = object; - // Compute bounding box and center from the suggestion.pathData. - // We handle both: - // - Freehand strokes / polygons: pathData.points[] - // - Basic shapes (line/circle/rectangle) with start/end - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - const updateBounds = (x, y) => { - if (x < minX) minX = x; - if (y < minY) minY = y; - if (x > maxX) maxX = x; - if (y > maxY) maxY = y; - }; - - if (Array.isArray(pathData.points) && pathData.points.length > 0) { - // Stroke or polygon: walk through all points - for (const pt of pathData.points) { - if (!pt) continue; - const px = pt.x ?? 0; - const py = pt.y ?? 0; - updateBounds(px, py); + const strokeColor = object.color || '#00A0FF'; + const strokeWidth = object.lineWidth || 2; + const ghostOpacity = 0.25; // lower than user's strokes + + const ax = (anchor?.x ?? canvasWidth / 2) + panOffset.x; + const ay = (anchor?.y ?? canvasHeight / 2) + panOffset.y; + + const renderShape = () => { + const t = pathData.type; + + // Line / circle / rectangle using start / end + if (['line', 'circle', 'rectangle'].includes(t) && pathData.start && pathData.end) { + const { start, end } = pathData; + + if (t === 'line') { + return ( + + ); + } + + if (t === 'circle') { + const cx = (start.x + end.x) / 2; + const cy = (start.y + end.y) / 2; + const dx = end.x - start.x; + const dy = end.y - start.y; + const r = Math.sqrt(dx * dx + dy * dy); + + return ( + + ); + } + + if (t === 'rectangle') { + const x = Math.min(start.x, end.x); + const y = Math.min(start.y, end.y); + const w = Math.abs(end.x - start.x); + const h = Math.abs(end.y - start.y); + + return ( + + ); + } } - } else if (pathData.start && pathData.end) { - // Basic shape / line / circle using start / end - if (typeof pathData.start.x === 'number' && typeof pathData.start.y === 'number') { - updateBounds(pathData.start.x, pathData.start.y); - } - if (typeof pathData.end.x === 'number' && typeof pathData.end.y === 'number') { - updateBounds(pathData.end.x, pathData.end.y); + + // Polygon (e.g., star, triangle) + if (t === 'polygon' && Array.isArray(pathData.points) && pathData.points.length > 1) { + const pointsAttr = pathData.points.map(p => `${p.x},${p.y}`).join(' '); + return ( + + ); } - } - if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) { + // Fallback: nothing return null; - } - - const shapeWidth = maxX - minX || 1; - const shapeHeight = maxY - minY || 1; - - const shapeCenterX = minX + shapeWidth / 2; - const shapeCenterY = minY + shapeHeight / 2; - - // If we have an anchor (the user's last drag or cursor), try to align around it. - let overlayCenterX = shapeCenterX + panOffset.x; - let overlayCenterY = shapeCenterY + panOffset.y; - - // Clamp inside canvas - const halfBoxW = 120; - const halfBoxH = 40; - - if (typeof canvasWidth === 'number') { - overlayCenterX = Math.max(halfBoxW, Math.min(canvasWidth - halfBoxW, overlayCenterX)); - } - if (typeof canvasHeight === 'number') { - overlayCenterY = Math.max(halfBoxH, Math.min(canvasHeight - halfBoxH, overlayCenterY)); - } - - const overlayLeft = overlayCenterX - halfBoxW; - const overlayTop = overlayCenterY - halfBoxH; - - // Helper: label for the suggestion, e.g. "Complete rectangle" or "Refine stroke" - const getSuggestionLabel = () => { - const tool = pathData.tool; - const type = pathData.type; - - if (tool === 'freehand' || type === 'stroke') { - return 'Refine stroke?'; - } - if (['rectangle', 'circle', 'line', 'polygon'].includes(type)) { - return `Complete ${type}?`; - } - return 'Apply suggestion?'; }; return ( <> - {/* Outline of the suggested shape area (visual hint) */} - + > + {renderShape()} + - {/* Floating confirmation box near the suggestion */} + {/* Small accept / reject controls near the shape anchor */} - - {getSuggestionLabel()} - - ); } + +ShapeCompletionOverlay.propTypes = { + open: PropTypes.bool, + suggestion: PropTypes.object, + anchor: PropTypes.object, + panOffset: PropTypes.shape({ + x: PropTypes.number, + y: PropTypes.number, + }), + canvasWidth: PropTypes.number.isRequired, + canvasHeight: PropTypes.number.isRequired, + onAccept: PropTypes.func, + onReject: PropTypes.func, +}; From c6dc692824b4ee53b7e814d5c32b1e1d2846a000 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:27:56 -0800 Subject: [PATCH 05/26] Update ShapeCompletionOverlay.jsx --- .../src/components/AI/ShapeCompletionOverlay.jsx | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx index 1eb912e3..997488a1 100644 --- a/frontend/src/components/AI/ShapeCompletionOverlay.jsx +++ b/frontend/src/components/AI/ShapeCompletionOverlay.jsx @@ -169,17 +169,3 @@ export default function ShapeCompletionOverlay({ ); } - -ShapeCompletionOverlay.propTypes = { - open: PropTypes.bool, - suggestion: PropTypes.object, - anchor: PropTypes.object, - panOffset: PropTypes.shape({ - x: PropTypes.number, - y: PropTypes.number, - }), - canvasWidth: PropTypes.number.isRequired, - canvasHeight: PropTypes.number.isRequired, - onAccept: PropTypes.func, - onReject: PropTypes.func, -}; From 3e8a6de3f0aa8b2b1ab7be726104c552bf0b3ef0 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:30:42 -0800 Subject: [PATCH 06/26] Delete frontend/src/components/AI/ShapeCompletionOverlay.jsx --- .../components/AI/ShapeCompletionOverlay.jsx | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 frontend/src/components/AI/ShapeCompletionOverlay.jsx diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx deleted file mode 100644 index 997488a1..00000000 --- a/frontend/src/components/AI/ShapeCompletionOverlay.jsx +++ /dev/null @@ -1,171 +0,0 @@ -// frontend/src/components/AI/ShapeCompletionOverlay.jsx -import React from 'react'; -import PropTypes from 'prop-types'; -import { Box, IconButton } from '@mui/material'; -import CheckIcon from '@mui/icons-material/Check'; -import CloseIcon from '@mui/icons-material/Close'; - -export default function ShapeCompletionOverlay({ - open = false, - suggestion = null, - anchor = null, - panOffset = { x: 0, y: 0 }, - canvasWidth, - canvasHeight, - onAccept = () => {}, - onReject = () => {}, -}) { - if (!open || !suggestion || !suggestion.object || !suggestion.object.pathData) { - return null; - } - - const { object } = suggestion; - const { pathData } = object; - - const strokeColor = object.color || '#00A0FF'; - const strokeWidth = object.lineWidth || 2; - const ghostOpacity = 0.25; // lower than user's strokes - - const ax = (anchor?.x ?? canvasWidth / 2) + panOffset.x; - const ay = (anchor?.y ?? canvasHeight / 2) + panOffset.y; - - const renderShape = () => { - const t = pathData.type; - - // Line / circle / rectangle using start / end - if (['line', 'circle', 'rectangle'].includes(t) && pathData.start && pathData.end) { - const { start, end } = pathData; - - if (t === 'line') { - return ( - - ); - } - - if (t === 'circle') { - const cx = (start.x + end.x) / 2; - const cy = (start.y + end.y) / 2; - const dx = end.x - start.x; - const dy = end.y - start.y; - const r = Math.sqrt(dx * dx + dy * dy); - - return ( - - ); - } - - if (t === 'rectangle') { - const x = Math.min(start.x, end.x); - const y = Math.min(start.y, end.y); - const w = Math.abs(end.x - start.x); - const h = Math.abs(end.y - start.y); - - return ( - - ); - } - } - - // Polygon (e.g., star, triangle) - if (t === 'polygon' && Array.isArray(pathData.points) && pathData.points.length > 1) { - const pointsAttr = pathData.points.map(p => `${p.x},${p.y}`).join(' '); - return ( - - ); - } - - // Fallback: nothing - return null; - }; - - return ( - <> - {/* Ghost shape overlay – aligned with main canvas */} - - {renderShape()} - - - {/* Small accept / reject controls near the shape anchor */} - - - - - - - - - - ); -} From 8bf869098ec84f946f5870f2088af5433b6138c5 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:31:10 -0800 Subject: [PATCH 07/26] Add files via upload --- .../components/AI/ShapeCompletionOverlay.jsx | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 frontend/src/components/AI/ShapeCompletionOverlay.jsx diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx new file mode 100644 index 00000000..925c9ecf --- /dev/null +++ b/frontend/src/components/AI/ShapeCompletionOverlay.jsx @@ -0,0 +1,168 @@ +import { Box, IconButton } from '@mui/material'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; + +export default function ShapeCompletionOverlay({ + open = false, + suggestion = null, + anchor = null, + panOffset = { x: 0, y: 0 }, + canvasWidth, + canvasHeight, + onAccept = () => {}, + onReject = () => {}, +}) { + if (!open || !suggestion || !suggestion.object || !suggestion.object.pathData) { + return null; + } + + const { object } = suggestion; + const { pathData } = object; + + const strokeColor = object.color || '#00A0FF'; + const strokeWidth = object.lineWidth || 2; + const ghostOpacity = 0.25; // lower than user's strokes + + const ax = (anchor?.x ?? canvasWidth / 2) + panOffset.x; + const ay = (anchor?.y ?? canvasHeight / 2) + panOffset.y; + + const renderShape = () => { + const t = pathData.type; + + // Line / circle / rectangle using start / end + if (['line', 'circle', 'rectangle'].includes(t) && pathData.start && pathData.end) { + const { start, end } = pathData; + + if (t === 'line') { + return ( + + ); + } + + if (t === 'circle') { + const cx = (start.x + end.x) / 2; + const cy = (start.y + end.y) / 2; + const dx = end.x - start.x; + const dy = end.y - start.y; + const r = Math.sqrt(dx * dx + dy * dy); + + return ( + + ); + } + + if (t === 'rectangle') { + const x = Math.min(start.x, end.x); + const y = Math.min(start.y, end.y); + const w = Math.abs(end.x - start.x); + const h = Math.abs(end.y - start.y); + + return ( + + ); + } + } + + // Polygon (e.g., star, triangle) + if (t === 'polygon' && Array.isArray(pathData.points) && pathData.points.length > 1) { + const pointsAttr = pathData.points.map(p => `${p.x},${p.y}`).join(' '); + return ( + + ); + } + + // Fallback: nothing + return null; + }; + + return ( + <> + {/* Ghost shape overlay – aligned with main canvas */} + + {renderShape()} + + + {/* Small accept / reject controls near the shape anchor */} + + + + + + + + + + ); +} \ No newline at end of file From 97dfc57fa4ea65e696e6e8389024d6a1a2a69c88 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:31:48 -0800 Subject: [PATCH 08/26] Delete frontend/src/components/Canvas.js --- frontend/src/components/Canvas.js | 4454 ----------------------------- 1 file changed, 4454 deletions(-) delete mode 100644 frontend/src/components/Canvas.js diff --git a/frontend/src/components/Canvas.js b/frontend/src/components/Canvas.js deleted file mode 100644 index c08dbbeb..00000000 --- a/frontend/src/components/Canvas.js +++ /dev/null @@ -1,4454 +0,0 @@ -import React, { useRef, useState, useEffect } from "react"; -import "../styles/Canvas.css"; -import { - Box, - Fade, - Paper, - Button, - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, - IconButton, - TextField, - Typography, - CircularProgress, -} from '@mui/material'; -import SafeSnackbar from './SafeSnackbar'; -import CommandPalette from './CommandPalette'; -import KeyboardShortcutsHelp from './KeyboardShortcutsHelp'; -import { KeyboardShortcutManager } from '../services/KeyboardShortcuts'; -import { commandRegistry } from '../services/CommandRegistry'; -import { DEFAULT_SHORTCUTS } from '../config/shortcuts'; -import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; -import ChevronRightIcon from '@mui/icons-material/ChevronRight'; -import Toolbar from './Toolbar'; -import { useCanvasSelection } from '../hooks/useCanvasSelection'; -import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; -import useBrushEngine from "../hooks/useBrushEngine"; -import { - submitToDatabase, - refreshCanvas as backendRefreshCanvas, - clearBackendCanvas, - undoAction, - redoAction, - checkUndoRedoAvailability -} from '../services/canvasBackendJWT'; -import { Drawing } from '../lib/drawing'; -import { getSocket, setSocketToken } from '../services/socket'; -import { handleAuthError } from '../utils/authUtils'; -import { getUsername } from '../utils/getUsername'; -import { getAuthUser } from '../utils/getAuthUser'; -import { resetMyStacks } from '../api/rooms'; -import { TEMPLATE_LIBRARY } from '../data/templates'; - -class UserData { - constructor(userId, username) { - this.userId = userId; - this.username = username; - this.drawings = []; - } - - addDrawing(drawing) { - this.drawings.push(drawing); - } - - clearDrawings() { - this.drawings = []; - } -} - -const DEFAULT_CANVAS_WIDTH = 3000; -const DEFAULT_CANVAS_HEIGHT = 2000; - -function Canvas({ - auth, - setUserList, - selectedUser, - setSelectedUser, - currentRoomId, - canvasRefreshTrigger = 0, - currentRoomName = "Master (not in a room)", - onExitRoom = () => { }, - onOpenSettings = null, - viewOnly = false, - isOwner = false, - roomType = "public", - walletConnected = false, - templateId = null, -}) { - const canvasRef = useRef(null); - const snapshotRef = useRef(null); - const tempPathRef = useRef([]); - const clamp = (value, min, max) => Math.min(max, Math.max(min, value)); - - const currentUserRef = useRef(null); - if (currentUserRef.current === null) { - try { - const uname = - getUsername(auth) || - `anon_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`; - currentUserRef.current = `${uname}|${Date.now()}`; - } catch (e) { - currentUserRef.current = `anon_${Date.now()}_${Math.random() - .toString(36) - .substr(2, 5)}`; - } - } - const currentUser = currentUserRef.current; - - const [drawing, setDrawing] = useState(false); - const [color, setColor] = useState("#000000"); - const [lineWidth, setLineWidth] = useState(5); - const [drawMode, setDrawMode] = useState("freehand"); - const [shapeType, setShapeType] = useState("circle"); - const [brushStyle] = useState("round"); - const [shapeStart, setShapeStart] = useState(null); - - const brushEngine = useBrushEngine(); - const [currentBrushType, setCurrentBrushType] = useState("normal"); - const [brushParams, setBrushParams] = useState({}); - const [selectedStamp, setSelectedStamp] = useState(null); - const [stampSettings, setStampSettings] = useState({ - size: 50, - rotation: 0, - opacity: 100, - }); - const [backendStamps, setBackendStamps] = useState([]); - const [stampPreview, setStampPreview] = useState(null); // { x, y, stamp, settings } - const stampPreviewRef = useRef(null); - const [activeFilter, setActiveFilter] = useState(null); - const [filterParams, setFilterParams] = useState({}); - const [isFilterPreview, setIsFilterPreview] = useState(false); - const filterCanvasRef = useRef(null); - const originalCanvasDataRef = useRef(null); // For preview mode undo - const preFilterCanvasStateRef = useRef(null); - - const [showColorPicker, setShowColorPicker] = useState(false); - const [isRefreshing, setIsRefreshing] = useState(false); - const [previousColor, setPreviousColor] = useState(null); - const [clearDialogOpen, setClearDialogOpen] = useState(false); - const [undoStack, setUndoStack] = useState([]); - const [redoStack, setRedoStack] = useState([]); - const [undoAvailable, setUndoAvailable] = useState(false); - const [redoAvailable, setRedoAvailable] = useState(false); - const [hasFilters, setHasFilters] = useState(false); // Track if filters exist for UI updates - - const [templateObjects, setTemplateObjects] = useState([]); - const templateObjectsRef = useRef([]); - - useEffect(() => { - templateObjectsRef.current = templateObjects; - }, [templateObjects]); - - const canvasWidth = DEFAULT_CANVAS_WIDTH; - const canvasHeight = DEFAULT_CANVAS_HEIGHT; - - const [panOffset, setPanOffset] = useState({ x: 0, y: 0 }); - const [isPanning, setIsPanning] = useState(false); - const panStartRef = useRef({ x: 0, y: 0 }); - const panOriginRef = useRef({ x: 0, y: 0 }); - const PAN_REFRESH_COOLDOWN_MS = 2000; - const panLastRefreshRef = useRef(0); - const panRefreshSkippedRef = useRef(false); - const panEndRefreshTimerRef = useRef(null); - const pendingPanRefreshRef = useRef(false); - const [pendingDrawings, setPendingDrawings] = useState([]); - const refreshTimerRef = useRef(null); - const submissionQueueRef = useRef([]); - const isSubmittingRef = useRef(false); - const confirmedStrokesRef = useRef(new Set()); - const lastDrawnStateRef = useRef(null); // Track last drawn state to avoid redundant redraws - const isDrawingInProgressRef = useRef(false); // Prevent concurrent drawing operations - const offscreenCanvasRef = useRef(null); // Offscreen canvas for flicker free rendering - const forceNextRedrawRef = useRef(false); // Force next redraw even if signature matches for undo redo - const [historyMode, setHistoryMode] = useState(false); - const [historyRange, setHistoryRange] = useState(null); // {start, end} in epoch ms - const [historyDialogOpen, setHistoryDialogOpen] = useState(false); - const [historyStartInput, setHistoryStartInput] = useState(""); - const [historyEndInput, setHistoryEndInput] = useState(""); - const [isLoading, setIsLoading] = useState(false); - - const [localSnack, setLocalSnack] = useState({ - open: false, - message: "", - duration: 4000, - }); - const [confirmDestructiveOpen, setConfirmDestructiveOpen] = useState(false); - const [destructiveConfirmText, setDestructiveConfirmText] = useState(""); - const showLocalSnack = (msg, duration = 4000) => - setLocalSnack({ open: true, message: String(msg), duration }); - - // editingEnabled controls whether the user can perform mutating actions. - // When historyMode is active, a specific user is selected for replay, or - // when viewOnly is true (room is archived or user is a viewer), editing - // should be disabled. - // For secure rooms, wallet must be connected to allow editing. - const editingEnabled = !( - historyMode || - (selectedUser && selectedUser !== "") || - viewOnly || - (roomType === "secure" && !walletConnected) - ); - const closeLocalSnack = () => - setLocalSnack({ open: false, message: "", duration: 4000 }); - - // Keyboard shortcuts state - const [commandPaletteOpen, setCommandPaletteOpen] = useState(false); - const [shortcutsHelpOpen, setShortcutsHelpOpen] = useState(false); - const shortcutManagerRef = useRef(null); - - const roomUiRef = useRef({}); - const previousSelectedUserRef = useRef(null); // Track previous selectedUser to detect changes - const isRefreshingSelectedUserRef = useRef(false); // Prevent concurrent refreshes - const selectedUserRefreshQueueRef = useRef(null); // Queue the next refresh target - const selectedUserAbortControllerRef = useRef(null); // Cancel pending operations - const roomStacksRef = useRef({}); - const roomClipboardRef = useRef({}); - const roomClearedAtRef = useRef({}); - const drawAllDrawingsRef = useRef(null); // Store reference to drawAllDrawings function - - useEffect(() => { - if (!currentRoomId) return; - const ui = - roomUiRef.current[currentRoomId] || - JSON.parse( - localStorage.getItem(`rescanvas:toolbar:${currentRoomId}`) || "null" - ) || - {}; - if (ui.color) setColor(ui.color); - if (ui.lineWidth) setLineWidth(ui.lineWidth); - if (ui.drawMode) setDrawMode(ui.drawMode); - if (ui.shapeType) setShapeType(ui.shapeType); - if (ui.previousColor !== undefined) setPreviousColor(ui.previousColor); - if (ui.selectedStamp) setSelectedStamp(ui.selectedStamp); - if (ui.stampSettings) setStampSettings(ui.stampSettings); - if (ui.currentBrushType) { - setCurrentBrushType(ui.currentBrushType); - brushEngine.setBrushType(ui.currentBrushType); - } - if (ui.brushParams) { - setBrushParams(ui.brushParams); - brushEngine.setBrushParams(ui.brushParams); - } - roomUiRef.current[currentRoomId] = { - color: ui.color ?? color, - lineWidth: ui.lineWidth ?? lineWidth, - drawMode: ui.drawMode ?? drawMode, - shapeType: ui.shapeType ?? shapeType, - previousColor: ui.previousColor ?? previousColor, - selectedStamp: ui.selectedStamp ?? selectedStamp, - stampSettings: ui.stampSettings ?? stampSettings, - currentBrushType: ui.currentBrushType ?? currentBrushType, - brushParams: ui.brushParams ?? brushParams, - }; - const stacks = roomStacksRef.current[currentRoomId] || { - undo: [], - redo: [], - }; - setUndoStack(stacks.undo); - setRedoStack(stacks.redo); - const clip = roomClipboardRef.current[currentRoomId] || null; - if (setCutImageData) setCutImageData(clip); - }, [currentRoomId]); - - // Load template objects when templateId changes - useEffect(() => { - - if (!templateId) { - setTemplateObjects([]); - return; - } - - const template = TEMPLATE_LIBRARY.find(t => t.id === templateId); - - if (template && template.canvas && template.canvas.objects) { - setTemplateObjects(template.canvas.objects); - } else { - setTemplateObjects([]); - } - }, [templateId, currentRoomId]); - - // Force redraw whenever templateObjects change (ensures templates appear immediately) - useEffect(() => { - if (!templateObjects || templateObjects.length === 0) return; - - const timer = setTimeout(() => { - if (drawAllDrawingsRef.current) { - lastDrawnStateRef.current = null; // Force redraw by clearing cache - drawAllDrawingsRef.current(); - } else { - console.warn('drawAllDrawingsRef not ready yet'); - } - }, 100); - - return () => clearTimeout(timer); - }, [templateObjects]); - - useEffect(() => { - if (!currentRoomId) return; - const ui = { color, lineWidth, drawMode, shapeType, previousColor, selectedStamp, stampSettings, currentBrushType, brushParams }; - roomUiRef.current[currentRoomId] = ui; - try { - localStorage.setItem( - `rescanvas:toolbar:${currentRoomId}`, - JSON.stringify(ui) - ); - } catch { } - }, [currentRoomId, color, lineWidth, drawMode, shapeType, previousColor, selectedStamp, stampSettings, currentBrushType, brushParams]); - - useEffect(() => { - if (!currentRoomId) return; - const cur = roomStacksRef.current[currentRoomId] || { undo: [], redo: [] }; - cur.undo = undoStack; - roomStacksRef.current[currentRoomId] = cur; - }, [currentRoomId, undoStack]); - useEffect(() => { - if (!currentRoomId) return; - const cur = roomStacksRef.current[currentRoomId] || { undo: [], redo: [] }; - cur.redo = redoStack; - roomStacksRef.current[currentRoomId] = cur; - }, [currentRoomId, redoStack]); - - useEffect(() => { - const handleMouseUp = () => { - setIsPanning(false); - panOriginRef.current = { ...panOffset }; - try { - if (panEndRefreshTimerRef.current) { - clearTimeout(panEndRefreshTimerRef.current); - panEndRefreshTimerRef.current = null; - } - if (panRefreshSkippedRef.current) { - panRefreshSkippedRef.current = false; - mergedRefreshCanvas("pan-mouseup-skipped").finally(() => { - try { - setIsLoading(false); - } catch (e) { } - }); - } - if (pendingPanRefreshRef.current) { - pendingPanRefreshRef.current = false; - mergedRefreshCanvas("pan-mouseup-pending").finally(() => { - try { - setIsLoading(false); - } catch (e) { } - }); - } - } catch (e) { } - }; - document.addEventListener("mouseup", handleMouseUp); - return () => document.removeEventListener("mouseup", handleMouseUp); - }, [panOffset]); - - // Process submission queue to ensure strokes are submitted sequentially - const processSubmissionQueue = async () => { - if (isSubmittingRef.current || submissionQueueRef.current.length === 0) { - return; - } - - isSubmittingRef.current = true; - - while (submissionQueueRef.current.length > 0) { - const submission = submissionQueueRef.current.shift(); - try { - await submission(); - } catch (error) { - console.error("Error processing queued submission:", error); - } - } - - isSubmittingRef.current = false; - - // After processing all queued submissions, schedule a refresh to sync with backend - if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); - refreshTimerRef.current = setTimeout(() => { - mergedRefreshCanvas("post-queue").catch((e) => - console.error("Error during post-queue refresh:", e) - ); - refreshTimerRef.current = null; - }, 500); - }; - - useEffect(() => { - if (!auth?.token || !currentRoomId) return; - try { - setSocketToken(auth.token); - } catch (e) { } - - const socket = getSocket(auth.token); - - try { - socket.emit("join_room", { roomId: currentRoomId, token: auth?.token }); - } catch (e) { - socket.emit("join_room", { roomId: currentRoomId }); - } - - const scheduleRefresh = (delay = 300) => { - try { - if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); - } catch (e) { } - refreshTimerRef.current = setTimeout(() => { - mergedRefreshCanvas().catch((e) => - console.error("Error during scheduled refresh:", e) - ); - refreshTimerRef.current = null; - }, delay); - }; - - const handleNewStroke = (data) => { - try { - const myName = getUsername(auth); - if (data.user === myName) { - // This is confirmation of our own stroke - const stroke = data.stroke; - if (stroke && stroke.drawingId) { - confirmedStrokesRef.current.add(stroke.drawingId); - } - return; - } - } catch (e) { - try { - const user = getAuthUser(auth) || {}; - if (data.user === user.username) { - // This is confirmation of our own stroke - const stroke = data.stroke; - if (stroke && stroke.drawingId) { - confirmedStrokesRef.current.add(stroke.drawingId); - } - return; - } - } catch (e2) { } - } - - const stroke = data.stroke; - - // Extract metadata for advanced features (stamps, brushes, filters) - const metadata = { - brushStyle: stroke.brushStyle, - brushType: stroke.brushType, - brushParams: stroke.brushParams, - drawingType: stroke.drawingType, - stampData: stroke.stampData, - stampSettings: stroke.stampSettings, - filterType: stroke.filterType, - filterParams: stroke.filterParams, - }; - - const drawing = new Drawing( - stroke.drawingId || - `remote_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`, - stroke.color || "#000000", - stroke.lineWidth || 5, - stroke.pathData || [], - stroke.ts || stroke.timestamp || Date.now(), - stroke.user || "Unknown", - metadata - ); - - try { - const clearedAt = roomClearedAtRef.current[currentRoomId]; - if ( - clearedAt && - (drawing.timestamp || drawing.ts || Date.now()) < clearedAt - ) { - return; - } - } catch (e) { } - - setPendingDrawings((prev) => [...prev, drawing]); - - // If this is a custom stamp, add it to the stamp panel - if (drawing.drawingType === "stamp" && drawing.stampData && drawing.stampData.image) { - setBackendStamps((prevStamps) => { - const imageKey = drawing.stampData.image.substring(0, 100); - const alreadyExists = prevStamps.some(s => - s.image && s.image.substring(0, 100) === imageKey - ); - - if (!alreadyExists) { - console.log('Adding new custom stamp from Socket.IO:', drawing.stampData.name || 'Custom Stamp'); - return [...prevStamps, { - id: `stamp-${Date.now()}-${prevStamps.length}`, - name: drawing.stampData.name || 'Custom Stamp', - category: drawing.stampData.category || 'custom', - image: drawing.stampData.image, - emoji: drawing.stampData.emoji - }]; - } - return prevStamps; - }); - } - - // Use requestAnimationFrame for smoother rendering - requestAnimationFrame(() => { - drawAllDrawings(); - }); - - scheduleRefresh(350); - }; - - const handleUserJoined = (data) => { - try { - if (!data) return; - if (data.roomId !== currentRoomId) return; - console.debug("socket user_joined event", data); - if (data.username) { - showLocalSnack(`${data.username} joined the canvas.`); - } - } catch (e) { } - }; - - const handleUserLeft = (data) => { - try { - if (!data) return; - if (data.roomId !== currentRoomId) return; - console.debug("socket user_left event", data); - if (data.username) { - showLocalSnack(`${data.username} left the canvas.`); - } - } catch (e) { } - }; - - const handleStrokeUndone = (data) => { - console.log("Stroke undone event received:", data); - - forceNextRedrawRef.current = true; - lastDrawnStateRef.current = null; - - // Schedule refresh instead of immediate refresh to avoid flicker - if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); - refreshTimerRef.current = setTimeout(() => { - mergedRefreshCanvas("undo-event"); - refreshTimerRef.current = null; - }, 100); - - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - }; - - const handleCanvasCleared = (data) => { - console.log("Canvas cleared event received:", data); - const clearedAt = data && data.clearedAt ? data.clearedAt : Date.now(); - if (currentRoomId) roomClearedAtRef.current[currentRoomId] = clearedAt; - - // Clear local authoritative drawings and pending drawings that predate the clear - try { - userData.clearDrawings(); - } catch (e) { } - setPendingDrawings([]); - serverCountRef.current = 0; - - setUndoStack([]); - setRedoStack([]); - setUndoAvailable(false); - setRedoAvailable(false); - try { - if (currentRoomId) { - roomStacksRef.current[currentRoomId] = { undo: [], redo: [] }; - roomClipboardRef.current[currentRoomId] = null; - } - } catch (e) { } - - clearCanvasForRefresh(); - drawAllDrawings(); - - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - }; - - socket.on("new_stroke", handleNewStroke); - socket.on("stroke_undone", handleStrokeUndone); - socket.on("canvas_cleared", handleCanvasCleared); - socket.on("user_joined", handleUserJoined); - socket.on("user_left", handleUserLeft); - socket.on("user_joined_debug", (d) => { - console.debug("socket user_joined_debug", d); - }); - - return () => { - socket.off("new_stroke", handleNewStroke); - socket.off("stroke_undone", handleStrokeUndone); - socket.off("canvas_cleared", handleCanvasCleared); - socket.off("user_joined", handleUserJoined); - socket.off("user_left", handleUserLeft); - try { - socket.emit("leave_room", { - roomId: currentRoomId, - token: auth?.token, - }); - } catch (e) { - socket.emit("leave_room", { roomId: currentRoomId }); - } - try { - if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); - } catch (e) { } - }; - }, [auth?.token, currentRoomId, auth?.user?.username]); - - useEffect(() => { - (async () => { - try { - setUndoStack([]); - setRedoStack([]); - setUndoAvailable(false); - setRedoAvailable(false); - if (currentRoomId) { - roomStacksRef.current[currentRoomId] = { undo: [], redo: [] }; - } - - // Reset selectedUser tracking when room changes - previousSelectedUserRef.current = null; - isRefreshingSelectedUserRef.current = false; - selectedUserRefreshQueueRef.current = null; - - if (auth?.token && currentRoomId) { - try { - await resetMyStacks(auth.token, currentRoomId); - } catch (e) { } - } - - if (currentRoomId) { - try { - await checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } catch (e) { } - } - } catch (e) { } - })(); - }, [auth?.token, currentRoomId]); - - useEffect(() => { - try { - setUndoStack([]); - setRedoStack([]); - if (currentRoomId) { - roomStacksRef.current[currentRoomId] = { undo: [], redo: [] }; - } - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ).catch(() => { }); - } - } catch (e) { } - }, [auth?.token, currentRoomId]); - - // Force full refresh when selectedUser changes (drawing history selection/deselection) - useEffect(() => { - if (!currentRoomId || !auth?.token) return; - - // Serialize selectedUser for comparison (handles both string and object) - const serializeSelectedUser = (user) => { - if (!user || user === "") return ""; - if (typeof user === "string") return user; - if (typeof user === "object") - return JSON.stringify({ - user: user.user, - periodStart: user.periodStart, - }); - return String(user); - }; - - const currentSerialized = serializeSelectedUser(selectedUser); - const previousSerialized = previousSelectedUserRef.current; - - // Only refresh if selectedUser actually changed - if (currentSerialized === previousSerialized) { - return; - } - - // If a refresh is in progress, queue this change for execution after current one completes - if (isRefreshingSelectedUserRef.current) { - console.debug( - "[selectedUser] Refresh in progress, queuing new selection:", - currentSerialized - ); - selectedUserRefreshQueueRef.current = currentSerialized; - return; - } - - const performRefresh = async (targetSerialized) => { - isRefreshingSelectedUserRef.current = true; - - try { - setIsLoading(true); - - // Update the ref to mark this as the last processed value - previousSelectedUserRef.current = targetSerialized; - - // Force complete refresh from backend - userData.drawings = []; - setPendingDrawings([]); - serverCountRef.current = 0; - lastDrawnStateRef.current = null; - - const isDeselect = !selectedUser || selectedUser === ""; - const logLabel = isDeselect - ? "selectedUser-deselect" - : "selectedUser-select"; - console.debug(`[selectedUser] Performing full refresh: ${logLabel}`, { - to: targetSerialized, - }); - - await clearCanvasForRefresh(); - await mergedRefreshCanvas(logLabel); - await drawAllDrawings(); - } catch (error) { - console.error("Error refreshing on selectedUser change:", error); - } finally { - setIsLoading(false); - isRefreshingSelectedUserRef.current = false; - - // Check if there's a queued refresh waiting - if (selectedUserRefreshQueueRef.current !== null) { - const queuedTarget = selectedUserRefreshQueueRef.current; - selectedUserRefreshQueueRef.current = null; - - // Only process queued refresh if it's different from what we just processed - if (queuedTarget !== targetSerialized) { - console.debug( - "[selectedUser] Processing queued selection:", - queuedTarget - ); - // Use setTimeout to break out of the current call stack - setTimeout(() => performRefresh(queuedTarget), 0); - } - } - } - }; - - // Start the refresh - performRefresh(currentSerialized); - }, [selectedUser, currentRoomId]); - - const clearCanvasForRefresh = async () => { - const canvas = canvasRef.current; - if (!canvas) return; // Guard against null ref during tests - - const context = canvas.getContext("2d"); - if (!context) return; // Guard against null context during tests - - context.clearRect(0, 0, canvasWidth, canvasHeight); - setUserData(initializeUserData()); - setPendingDrawings([]); - serverCountRef.current = 0; - - // Clear selection overlay artifacts - setSelectionRect(null); - setSelectionStart(null); - - // Reset draw mode to freehand if in select mode - if (drawMode === "select") { - setDrawMode("freehand"); - } - }; - - const refreshCanvasButtonHandler = async () => { - if (isRefreshing) return; - setIsRefreshing(true); - setIsLoading(true); - try { - // Force full refresh from backend by clearing local state - userData.drawings = []; - setPendingDrawings([]); - serverCountRef.current = 0; - lastDrawnStateRef.current = null; - - await clearCanvasForRefresh(); - await mergedRefreshCanvas("refresh-button"); - await drawAllDrawings(); - updateFilterState(); // Update filter state after refresh - } catch (error) { - console.error("Error during canvas refresh:", error); - handleAuthError(error); - } finally { - setIsRefreshing(false); - setIsLoading(false); - } - }; - - const initializeUserData = () => { - const uniqueUserId = - auth?.user?.id || - `user_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`; - const username = auth?.user?.username || "MainUser"; - return new UserData(uniqueUserId, username); - }; - const [userData, setUserData] = useState(() => initializeUserData()); - const generateId = () => - `drawing_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`; - const serverCountRef = useRef(0); - - // Helper function to update filter state - const updateFilterState = () => { - // Use setUserData callback to read current state accurately - setUserData((currentUserData) => { - const filterExists = currentUserData.drawings.some((d) => d.drawingType === "filter"); - const filterCount = currentUserData.drawings.filter((d) => d.drawingType === "filter").length; - console.log(`[updateFilterState] filterExists=${filterExists}, filterCount=${filterCount}`); - setHasFilters(filterExists); - return currentUserData; - }); - }; - - // Advanced Brush/Stamp/Filter Functions - const handleBrushSelect = (brushType) => { - console.log("handleBrushSelect called with:", brushType); - setCurrentBrushType(brushType); - brushEngine.setBrushType(brushType); - setDrawMode("freehand"); - console.log("Current brush type set to:", brushType); - }; - - const handleBrushParamsChange = (params) => { - setBrushParams(params); - brushEngine.setBrushParams(params); - }; - - const placeStamp = async (x, y, stamp, settings) => { - const canvas = canvasRef.current; - if (!canvas || !stamp) return; - - const context = canvas.getContext("2d"); - - // Render stamp immediately using proper context management - if (stamp.emoji) { - context.save(); - context.globalAlpha = settings.opacity / 100; - context.translate(x, y); - context.rotate((settings.rotation * Math.PI) / 180); - - const size = settings.size; - context.font = `${size}px serif`; - context.textAlign = "center"; - context.textBaseline = "middle"; - context.fillText(stamp.emoji, 0, 0); - - context.restore(); - } else if (stamp.image) { - // For image stamps, load and render synchronously using async/await - try { - const img = await new Promise((resolve, reject) => { - const image = new Image(); - image.onload = () => resolve(image); - image.onerror = () => reject(new Error("Failed to load image")); - image.src = stamp.image; - }); - - context.save(); - context.globalAlpha = settings.opacity / 100; - context.translate(x, y); - context.rotate((settings.rotation * Math.PI) / 180); - - const size = settings.size; - context.drawImage(img, -size / 2, -size / 2, size, size); - - context.restore(); - } catch (error) { - console.error("Failed to load stamp image:", stamp.image?.substring(0, 100), error); - } - } - - // Create drawing record for stamp - const stampDrawing = new Drawing( - generateId(), - color, - lineWidth, - [{ x, y }], - Date.now(), - currentUser, - { - drawingType: "stamp", - stampData: stamp, - stampSettings: settings, - } - ); - - stampDrawing.roomId = currentRoomId; - - userData.addDrawing(stampDrawing); - setPendingDrawings((prev) => [...prev, stampDrawing]); - - // Add to undo stack - setUndoStack((prev) => [...prev, stampDrawing]); - setRedoStack([]); - - // Use submission queue to ensure stamps are submitted in order - try { - const submitTask = async () => { - try { - console.log("Submitting queued stamp:", { - drawingId: stampDrawing.drawingId, - stampData: stampDrawing.stampData, - }); - - await submitToDatabase( - stampDrawing, - auth, - { roomId: currentRoomId, roomType }, - setUndoAvailable, - setRedoAvailable - ); - - console.log("Stamp submitted successfully:", stampDrawing.drawingId); - - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - } catch (error) { - console.error("Error during queued stamp submission:", error); - setPendingDrawings((prev) => - prev.filter((d) => d.drawingId !== stampDrawing.drawingId) - ); - handleAuthError(error); - showLocalSnack("Failed to save stamp. Please try again."); - } - }; - - submissionQueueRef.current.push(submitTask); - processSubmissionQueue(); - } catch (error) { - console.error("Error preparing stamp submission:", error); - handleAuthError(error); - showLocalSnack("Failed to prepare stamp. Please try again."); - } - }; - - const handleStampSelect = (stamp, settings) => { - setSelectedStamp(stamp); - setStampSettings(settings); - setDrawMode("stamp"); - }; - - const handleStampChange = (stamp, settings) => { - setSelectedStamp(stamp); - setStampSettings(settings); - }; - - const applyFilter = async (filterType, params) => { - if (!canvasRef.current) return; - - // Always cancel preview mode first and clean up state - if (isFilterPreview) { - setIsFilterPreview(false); - } - preFilterCanvasStateRef.current = null; - originalCanvasDataRef.current = null; - - // Check if we already have a filter of this type applied - const existingFilterIndex = userData.drawings.findIndex( - (d) => d.drawingType === "filter" && d.filterType === filterType - ); - - let filterDrawing; - let isReplacement = existingFilterIndex !== -1; - - if (isReplacement) { - const existingFilter = userData.drawings[existingFilterIndex]; - existingFilter.filterParams = { ...params }; // Clone params - existingFilter.timestamp = Date.now(); - filterDrawing = existingFilter; - - // Update React state to reflect the filter parameter change - const newUserData = new UserData(userData.userId, userData.username); - newUserData.drawings = [...userData.drawings]; // Clone the array to trigger state update - setUserData(newUserData); - - // Force a complete redraw with the updated filter parameters - // This will redraw all strokes first, then apply the filter - lastDrawnStateRef.current = null; - forceNextRedrawRef.current = true; - await drawAllDrawings(); - - showLocalSnack(`Updated ${filterType} filter`); - updateFilterState(); - - // For filter updates, we need to submit the UPDATE to backend - // The backend should handle this as an update, not a new drawing - try { - await submitToDatabase( - filterDrawing, - auth, - { - roomId: currentRoomId, - roomType, - }, - setUndoAvailable, - setRedoAvailable - ); - - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - } catch (error) { - console.error("Error submitting filter update:", error); - handleAuthError(error); - } - - return; // Exit early for updates - } - - // Create NEW filter record for new filter type - filterDrawing = new Drawing( - generateId(), - "#000000", - 0, - [], - Date.now(), - currentUser, - { - drawingType: "filter", - filterType, - filterParams: { ...params }, // Clone params - } - ); - - // Set filter properties directly on the drawing object - filterDrawing.drawingType = "filter"; - filterDrawing.filterType = filterType; - filterDrawing.filterParams = { ...params }; - filterDrawing.roomId = currentRoomId; - - userData.addDrawing(filterDrawing); - - // Update React state so components know about the new filter - const newUserData = new UserData(userData.userId, userData.username); - newUserData.drawings = [...userData.drawings]; // Clone array with new filter - setUserData(newUserData); - - setPendingDrawings((prev) => [...prev, filterDrawing]); - - setUndoStack((prev) => [...prev, filterDrawing]); - setRedoStack([]); - - // Force complete redraw this will render all strokes THEN apply filter - lastDrawnStateRef.current = null; - forceNextRedrawRef.current = true; - await drawAllDrawings(); - - showLocalSnack(`Applied ${filterType} filter`); - updateFilterState(); - - try { - await submitToDatabase( - filterDrawing, - auth, - { - roomId: currentRoomId, - roomType, - }, - setUndoAvailable, - setRedoAvailable - ); - - // Check undo/redo availability after filter submission - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - } catch (error) { - console.error("Error submitting filter:", error); - // On error, remove the failed filter from pending - setPendingDrawings((prev) => - prev.filter((d) => d.drawingId !== filterDrawing.drawingId) - ); - handleAuthError(error); - } - }; - - const previewFilter = async (filterType, params) => { - const canvas = canvasRef.current; - if (!canvas) return; - - // If already in preview mode, first restore to base state - if (isFilterPreview && preFilterCanvasStateRef.current) { - const img = new Image(); - img.onload = async () => { - const context = canvas.getContext("2d"); - context.clearRect(0, 0, canvas.width, canvas.height); - context.drawImage(img, 0, 0); - - // Now apply the new preview - await applyPreviewFilter(canvas, filterType, params); - }; - img.src = preFilterCanvasStateRef.current; - return; - } - - // Store the current canvas state before preview (only once) - if (!preFilterCanvasStateRef.current) { - preFilterCanvasStateRef.current = canvas.toDataURL(); - } - - await applyPreviewFilter(canvas, filterType, params); - }; - - const applyPreviewFilter = async (canvas, filterType, params) => { - // Check if this filter type already exists in the drawings - const existingFilterIndex = userData.drawings.findIndex( - (d) => d.drawingType === "filter" && d.filterType === filterType - ); - - if (existingFilterIndex !== -1) { - // Temporarily remove this filter, redraw, then apply preview - const originalDrawings = [...userData.drawings]; - userData.drawings = userData.drawings.filter((d, i) => i !== existingFilterIndex); - - lastDrawnStateRef.current = null; - forceNextRedrawRef.current = true; - await drawAllDrawings(); - - // Restore drawings array - userData.drawings = originalDrawings; - } - - // Apply the preview filter on top of current canvas - const context = canvas.getContext("2d"); - const imageData = context.getImageData(0, 0, canvas.width, canvas.height); - const filteredImageData = applyImageFilter(imageData, filterType, params); - context.putImageData(filteredImageData, 0, 0); - - setIsFilterPreview(true); - }; - - const undoFilter = async () => { - // If in preview mode, restore from saved canvas state - if (isFilterPreview && preFilterCanvasStateRef.current) { - const canvas = canvasRef.current; - if (!canvas) return; - - const context = canvas.getContext("2d"); - const img = new Image(); - img.onload = async () => { - context.clearRect(0, 0, canvas.width, canvas.height); - context.drawImage(img, 0, 0); - setIsFilterPreview(false); - preFilterCanvasStateRef.current = null; - originalCanvasDataRef.current = null; - }; - img.src = preFilterCanvasStateRef.current; - return; - } - - // If not in preview mode, use regular undo (which properly syncs with backend) - if (!editingEnabled) { - showLocalSnack("Undo is disabled in view-only mode."); - return; - } - - if (undoStack.length === 0) { - showLocalSnack("No actions to undo."); - return; - } - - // Simply call the regular undo function, which will undo the last action - // This properly coordinates with the backend's undo system - await undo(); - }; - - const clearAllFilters = async () => { - // Clear preview state if active - if (isFilterPreview) { - setIsFilterPreview(false); - preFilterCanvasStateRef.current = null; - originalCanvasDataRef.current = null; - } - - if (!editingEnabled) { - showLocalSnack("Clear filters is disabled in view-only mode."); - return; - } - - // Find all filter drawings in userData (not just undo stack) - // Use setUserData callback to get the latest state - let filterDrawings = []; - setUserData((currentUserData) => { - const allDrawings = currentUserData.drawings || []; - filterDrawings = allDrawings.filter( - (drawing) => drawing.drawingType === "filter" - ); - console.log(`[clearAllFilters] Found ${filterDrawings.length} filters to clear`, filterDrawings); - return currentUserData; - }); - - if (filterDrawings.length === 0) { - showLocalSnack("No filters to clear."); - return; - } - - if (isRefreshing) { - showLocalSnack("Please wait for the canvas to refresh."); - return; - } - - try { - showLocalSnack(`Clearing ${filterDrawings.length} filter(s)...`); - - // Get filter IDs before removing from local state - const filterIds = filterDrawings.map(f => f.drawingId).filter(id => id); - - // Remove all filter drawings from local state immediately using proper state update - setUserData((currentUserData) => { - const newUserData = new UserData(currentUserData.userId, currentUserData.username); - newUserData.drawings = currentUserData.drawings.filter( - (d) => d.drawingType !== "filter" - ); - console.log(`[clearAllFilters] Removed ${filterDrawings.length} filters, ${newUserData.drawings.length} drawings remain`); - return newUserData; - }); - - // Remove from pendingDrawings - setPendingDrawings((prev) => - prev.filter((d) => d.drawingType !== "filter") - ); - - // Remove from undo stack (if present) - setUndoStack((prev) => - prev.filter((d) => d.drawingType !== "filter") - ); - - // Force a complete redraw immediately to show filters are gone - lastDrawnStateRef.current = null; - forceNextRedrawRef.current = true; - await drawAllDrawings(); - - showLocalSnack(`Cleared ${filterDrawings.length} filter(s).`); - updateFilterState(); // Update filter state for UI - - // Now sync with backend - create undo markers for each filter - if (filterIds.length > 0) { - try { - // Import the API function - const { markStrokesAsUndone } = await import('../api/rooms'); - - try { - await markStrokesAsUndone(auth.token, currentRoomId, filterIds); - console.log(`Marked ${filterIds.length} filters as undone in backend`); - } catch (apiError) { - // If the API doesn't exist, fall back to calling undo multiple times - console.warn("markStrokesAsUndone API not available, using fallback"); - - // Fallback: call regular undo endpoint for each filter - const { undoRoomAction } = await import('../api/rooms'); - for (let i = 0; i < Math.min(filterDrawings.length, 10); i++) { - try { - const result = await undoRoomAction(auth.token, currentRoomId); - if (result.status === "noop") break; - await new Promise(resolve => setTimeout(resolve, 50)); - } catch (e) { - console.warn("Error calling undoRoomAction:", e); - break; - } - } - } - - await checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } catch (e) { - console.error("Error syncing filter removal with backend:", e); - } - } - } catch (error) { - console.error("Error clearing all filters:", error); - showLocalSnack("Failed to clear all filters. Refreshing canvas..."); - // Refresh to restore state - await refreshCanvasButtonHandler(); - } - }; - - const applyImageFilter = (imageData, filterType, params) => { - const data = imageData.data; - const filtered = new ImageData( - new Uint8ClampedArray(data), - imageData.width, - imageData.height - ); - - switch (filterType) { - case "blur": - return applyBlurFilter(filtered, params.intensity || 5); - case "hueShift": - return applyHueShiftFilter( - filtered, - params.hue || 0, - params.saturation || 0 - ); - case "chalk": - return applyChalkFilter( - filtered, - params.roughness || 50, - params.opacity || 80 - ); - case "fade": - return applyFadeFilter(filtered, params.amount || 30); - case "vintage": - return applyVintageFilter( - filtered, - params.sepia || 60, - params.vignette || 40 - ); - case "neon": - return applyNeonFilter( - filtered, - params.intensity || 15, - params.color || 180 - ); - default: - return filtered; - } - }; - - const applyBlurFilter = (imageData, intensity) => { - // Optimized separable box blur - O(n) instead of O(n²) - // This is much faster and won't crash even with higher intensity values - const data = imageData.data; - const width = imageData.width; - const height = imageData.height; - - const radius = Math.max(1, Math.floor(intensity)); - const temp = new Uint8ClampedArray(data); - const result = new Uint8ClampedArray(data); - - // Horizontal pass - for (let y = 0; y < height; y++) { - let r = 0, g = 0, b = 0, a = 0; - let count = 0; - - // Initialize window - for (let x = -radius; x <= radius; x++) { - if (x >= 0 && x < width) { - const idx = (y * width + x) * 4; - r += data[idx]; - g += data[idx + 1]; - b += data[idx + 2]; - a += data[idx + 3]; - count++; - } - } - - // Slide window across row - for (let x = 0; x < width; x++) { - const idx = (y * width + x) * 4; - temp[idx] = r / count; - temp[idx + 1] = g / count; - temp[idx + 2] = b / count; - temp[idx + 3] = a / count; - - // Remove left pixel - const leftX = x - radius; - if (leftX >= 0) { - const leftIdx = (y * width + leftX) * 4; - r -= data[leftIdx]; - g -= data[leftIdx + 1]; - b -= data[leftIdx + 2]; - a -= data[leftIdx + 3]; - count--; - } - - // Add right pixel - const rightX = x + radius + 1; - if (rightX < width) { - const rightIdx = (y * width + rightX) * 4; - r += data[rightIdx]; - g += data[rightIdx + 1]; - b += data[rightIdx + 2]; - a += data[rightIdx + 3]; - count++; - } - } - } - - // Vertical pass - for (let x = 0; x < width; x++) { - let r = 0, g = 0, b = 0, a = 0; - let count = 0; - - // Initialize window - for (let y = -radius; y <= radius; y++) { - if (y >= 0 && y < height) { - const idx = (y * width + x) * 4; - r += temp[idx]; - g += temp[idx + 1]; - b += temp[idx + 2]; - a += temp[idx + 3]; - count++; - } - } - - // Slide window down column - for (let y = 0; y < height; y++) { - const idx = (y * width + x) * 4; - result[idx] = r / count; - result[idx + 1] = g / count; - result[idx + 2] = b / count; - result[idx + 3] = a / count; - - // Remove top pixel - const topY = y - radius; - if (topY >= 0) { - const topIdx = (topY * width + x) * 4; - r -= temp[topIdx]; - g -= temp[topIdx + 1]; - b -= temp[topIdx + 2]; - a -= temp[topIdx + 3]; - count--; - } - - // Add bottom pixel - const bottomY = y + radius + 1; - if (bottomY < height) { - const bottomIdx = (bottomY * width + x) * 4; - r += temp[bottomIdx]; - g += temp[bottomIdx + 1]; - b += temp[bottomIdx + 2]; - a += temp[bottomIdx + 3]; - count++; - } - } - } - - return new ImageData(result, width, height); - }; - - const applyHueShiftFilter = (imageData, hueShift, saturationShift) => { - const data = imageData.data; - - for (let i = 0; i < data.length; i += 4) { - const r = data[i]; - const g = data[i + 1]; - const b = data[i + 2]; - - // Convert RGB to HSL - const max = Math.max(r, g, b) / 255; - const min = Math.min(r, g, b) / 255; - const diff = max - min; - const sum = max + min; - - let h = 0; - const l = sum / 2; - const s = diff === 0 ? 0 : l > 0.5 ? diff / (2 - sum) : diff / sum; - - if (diff !== 0) { - switch (max) { - case r / 255: - h = (g - b) / 255 / diff + (g < b ? 6 : 0); - break; - case g / 255: - h = (b - r) / 255 / diff + 2; - break; - case b / 255: - h = (r - g) / 255 / diff + 4; - break; - } - h /= 6; - } - - // Apply shifts - h = (h + hueShift / 360) % 1; - const newS = Math.max(0, Math.min(1, s + saturationShift / 100)); - - // Convert back to RGB - const hue2rgb = (p, q, t) => { - if (t < 0) t += 1; - if (t > 1) t -= 1; - if (t < 1 / 6) return p + (q - p) * 6 * t; - if (t < 1 / 2) return q; - if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; - return p; - }; - - let newR, newG, newB; - - if (newS === 0) { - newR = newG = newB = l; - } else { - const q = l < 0.5 ? l * (1 + newS) : l + newS - l * newS; - const p = 2 * l - q; - newR = hue2rgb(p, q, h + 1 / 3); - newG = hue2rgb(p, q, h); - newB = hue2rgb(p, q, h - 1 / 3); - } - - data[i] = Math.round(newR * 255); - data[i + 1] = Math.round(newG * 255); - data[i + 2] = Math.round(newB * 255); - } - - return imageData; - }; - - const applyChalkFilter = (imageData, roughness, opacity) => { - const data = imageData.data; - - for (let i = 0; i < data.length; i += 4) { - const noise = (Math.random() - 0.5) * (roughness / 100) * 255; - const opacityFactor = opacity / 100; - - data[i] = Math.max(0, Math.min(255, data[i] + noise)) * opacityFactor; - data[i + 1] = - Math.max(0, Math.min(255, data[i + 1] + noise)) * opacityFactor; - data[i + 2] = - Math.max(0, Math.min(255, data[i + 2] + noise)) * opacityFactor; - data[i + 3] = data[i + 3] * opacityFactor; - } - - return imageData; - }; - - const applyFadeFilter = (imageData, amount) => { - const data = imageData.data; - const fadeAmount = 1 - amount / 100; - - for (let i = 0; i < data.length; i += 4) { - data[i + 3] = data[i + 3] * fadeAmount; - } - - return imageData; - }; - - const applyVintageFilter = (imageData, sepia, vignette) => { - const data = imageData.data; - const width = imageData.width; - const height = imageData.height; - const sepiaAmount = sepia / 100; - - for (let i = 0; i < data.length; i += 4) { - const r = data[i]; - const g = data[i + 1]; - const b = data[i + 2]; - - // Apply sepia - data[i] = Math.min( - 255, - (r * 0.393 + g * 0.769 + b * 0.189) * sepiaAmount + - r * (1 - sepiaAmount) - ); - data[i + 1] = Math.min( - 255, - (r * 0.349 + g * 0.686 + b * 0.168) * sepiaAmount + - g * (1 - sepiaAmount) - ); - data[i + 2] = Math.min( - 255, - (r * 0.272 + g * 0.534 + b * 0.131) * sepiaAmount + - b * (1 - sepiaAmount) - ); - - // Apply vignette - const x = (i / 4) % width; - const y = Math.floor(i / 4 / width); - const centerX = width / 2; - const centerY = height / 2; - const distance = Math.sqrt((x - centerX) ** 2 + (y - centerY) ** 2); - const maxDistance = Math.sqrt(centerX ** 2 + centerY ** 2); - const vignetteAmount = 1 - (distance / maxDistance) * (vignette / 100); - - data[i] *= vignetteAmount; - data[i + 1] *= vignetteAmount; - data[i + 2] *= vignetteAmount; - } - - return imageData; - }; - - const applyNeonFilter = (imageData, intensity, hue) => { - const data = imageData.data; - const width = imageData.width; - const height = imageData.height; - const glowIntensity = intensity / 25; // More aggressive scaling (max 50 -> 2.0) - - // Create a copy for the glow effect - const result = new Uint8ClampedArray(data); - - // Generate neon color based on hue using proper HSL to RGB conversion - const hueNormalized = hue / 360; - const neonR = Math.abs(Math.sin((hueNormalized) * Math.PI * 2)) * 255; - const neonG = Math.abs(Math.sin((hueNormalized + 0.333) * Math.PI * 2)) * 255; - const neonB = Math.abs(Math.sin((hueNormalized + 0.666) * Math.PI * 2)) * 255; - - for (let i = 0; i < data.length; i += 4) { - const alpha = data[i + 3]; - - // Only apply effect to visible pixels (any stroke) - if (alpha > 5) { - const r = data[i]; - const g = data[i + 1]; - const b = data[i + 2]; - - // Calculate brightness - const brightness = (r + g + b) / 3; - - // Apply aggressive neon glow with color tinting - const alphaFactor = alpha / 255; - const colorFactor = glowIntensity * alphaFactor; - - // Mix original color with neon color and boost brightness - const boost = 1 + (glowIntensity * 0.8); - result[i] = Math.min(255, (r * boost) + (neonR * colorFactor * 0.7)); - result[i + 1] = Math.min(255, (g * boost) + (neonG * colorFactor * 0.7)); - result[i + 2] = Math.min(255, (b * boost) + (neonB * colorFactor * 0.7)); - - // Ensure the effect is visible even on dark strokes - const minBrightness = 60 * glowIntensity; - const currentBrightness = (result[i] + result[i + 1] + result[i + 2]) / 3; - if (currentBrightness < minBrightness) { - const brightnessFactor = minBrightness / Math.max(currentBrightness, 1); - result[i] = Math.min(255, result[i] * brightnessFactor); - result[i + 1] = Math.min(255, result[i + 1] * brightnessFactor); - result[i + 2] = Math.min(255, result[i + 2] * brightnessFactor); - } - } - } - - return new ImageData(result, width, height); - }; - - const drawAllDrawings = async () => { - const currentTemplateObjects = templateObjectsRef.current || []; - - if (isDrawingInProgressRef.current) { - console.log('Drawing already in progress, skipping drawAllDrawings call'); - return; - } - - isDrawingInProgressRef.current = true; - - // Save current brush state - const savedBrushType = brushEngine ? brushEngine.brushType : null; - const savedBrushParams = brushEngine ? brushEngine.brushParams : null; - - try { - setIsLoading(true); - const canvas = canvasRef.current; - if (!canvas) { - setIsLoading(false); - isDrawingInProgressRef.current = false; - return; - } - const context = canvas.getContext("2d"); - if (!context) { - setIsLoading(false); - isDrawingInProgressRef.current = false; - return; - } - - // Include any locally-pending drawings (e.g. received via socket but - // not yet reflected by a backend refresh) so they render immediately. - const userDrawingIds = new Set((userData.drawings || []).map(d => d.drawingId)); - const uniquePendingDrawings = (pendingDrawings || []).filter( - pd => !userDrawingIds.has(pd.drawingId) - ); - - const combined = [ - ...(userData.drawings || []), - ...uniquePendingDrawings, - ]; - - // Create a state signature to detect if we need to redraw - // Include filter information to ensure redraw when filters change - const filterSignature = combined - .filter(d => d.drawingType === "filter") - .map(f => `${f.drawingId}:${f.filterType}`) - .join(','); - - const stateSignature = JSON.stringify({ - drawingCount: combined.length, - drawingIds: combined.map(d => d.drawingId).sort().join(','), - pendingCount: pendingDrawings.length, - templateCount: currentTemplateObjects?.length || 0, - templateIds: currentTemplateObjects?.map(t => `${t.type}:${t.x || t.x1 || t.cx}:${t.y || t.y1 || t.cy}`).join(',') || '', - filters: filterSignature - }); - - if (lastDrawnStateRef.current === stateSignature) { - console.log('State unchanged, skipping redraw'); - setIsLoading(false); - isDrawingInProgressRef.current = false; - return; - } - - // Clear force flag after checking it - forceNextRedrawRef.current = false; - lastDrawnStateRef.current = stateSignature; - - // for flicker free rendering - if (!offscreenCanvasRef.current || - offscreenCanvasRef.current.width !== canvasWidth || - offscreenCanvasRef.current.height !== canvasHeight - ) { - offscreenCanvasRef.current = document.createElement("canvas"); - offscreenCanvasRef.current.width = canvasWidth; - offscreenCanvasRef.current.height = canvasHeight; - } - - const offscreenContext = offscreenCanvasRef.current.getContext("2d"); - offscreenContext.imageSmoothingEnabled = false; - offscreenContext.clearRect(0, 0, canvasWidth, canvasHeight); - - // This avoids async rendering issues with image stamps - const stampsToRender = []; - - // Create and render template layer separately so it stays below all drawings - let templateCanvas = null; - if (currentTemplateObjects && currentTemplateObjects.length > 0) { - templateCanvas = document.createElement('canvas'); - templateCanvas.width = canvasWidth; - templateCanvas.height = canvasHeight; - const templateContext = templateCanvas.getContext('2d'); - templateContext.imageSmoothingEnabled = false; - - templateContext.save(); - templateContext.globalAlpha = 0.5; - - let renderedCount = 0; - for (const obj of currentTemplateObjects) { - try { - if (obj.type === 'line') { - templateContext.beginPath(); - templateContext.moveTo(obj.x1, obj.y1); - templateContext.lineTo(obj.x2, obj.y2); - templateContext.strokeStyle = obj.color || '#333'; - templateContext.lineWidth = obj.lineWidth || 2; - templateContext.stroke(); - renderedCount++; - } else if (obj.type === 'rectangle') { - templateContext.strokeStyle = obj.stroke || '#333'; - templateContext.lineWidth = obj.lineWidth || 2; - if (obj.fill && obj.fill !== 'transparent') { - templateContext.fillStyle = obj.fill; - templateContext.fillRect(obj.x, obj.y, obj.width, obj.height); - } - templateContext.strokeRect(obj.x, obj.y, obj.width, obj.height); - renderedCount++; - } else if (obj.type === 'circle') { - templateContext.beginPath(); - templateContext.arc(obj.cx, obj.cy, obj.radius, 0, Math.PI * 2); - templateContext.strokeStyle = obj.stroke || '#333'; - templateContext.lineWidth = obj.lineWidth || 2; - if (obj.fill && obj.fill !== 'transparent') { - templateContext.fillStyle = obj.fill; - templateContext.fill(); - } - templateContext.stroke(); - renderedCount++; - } else if (obj.type === 'ellipse') { - templateContext.beginPath(); - templateContext.ellipse(obj.cx, obj.cy, obj.rx, obj.ry, 0, 0, Math.PI * 2); - templateContext.strokeStyle = obj.stroke || '#333'; - templateContext.lineWidth = obj.lineWidth || 2; - if (obj.fill && obj.fill !== 'transparent') { - templateContext.fillStyle = obj.fill; - templateContext.fill(); - } - templateContext.stroke(); - renderedCount++; - } else if (obj.type === 'text') { - templateContext.fillStyle = obj.color || '#333'; - templateContext.font = `${obj.bold ? 'bold ' : ''}${obj.fontSize || 16}px Arial`; - templateContext.fillText(obj.text || '', obj.x, obj.y); - renderedCount++; - } else { - console.warn('Unknown template object type:', obj.type); - } - } catch (e) { - console.warn('Failed to render template object:', obj, e); - } - } - templateContext.restore(); - } else { - console.log('No template objects to render'); - } - - if (templateCanvas) { - offscreenContext.drawImage(templateCanvas, 0, 0); - } - - const cutOriginalIds = new Set(); - try { - combined.forEach((d) => { - if ( - d && - d.pathData && - d.pathData.tool === "cut" && - Array.isArray(d.pathData.originalStrokeIds) - ) { - d.pathData.originalStrokeIds.forEach((id) => - cutOriginalIds.add(id) - ); - } - }); - } catch (e) { } - - const sortedDrawings = combined.sort((a, b) => { - const orderA = - a.order !== undefined ? a.order : a.timestamp || a.ts || 0; - const orderB = - b.order !== undefined ? b.order : b.timestamp || b.ts || 0; - return orderA - orderB; - }); - - // Separate filter drawings from regular drawings - const regularDrawings = []; - const filterDrawings = []; - for (const drawing of sortedDrawings) { - if (drawing.drawingType === "filter") { - filterDrawings.push(drawing); - } else { - regularDrawings.push(drawing); - } - } - - // Pre-load all image stamps to ensure they render in correct z-order - const imageStampCache = new Map(); - const imageStampPromises = []; - - for (const drawing of regularDrawings) { - if (drawing.drawingType === "stamp" && drawing.stampData && drawing.stampData.image && !drawing.stampData.emoji) { - const imageUrl = drawing.stampData.image; - if (!imageStampCache.has(imageUrl)) { - const promise = new Promise((resolve) => { - const img = new Image(); - img.onload = () => { - imageStampCache.set(imageUrl, img); - resolve(); - }; - img.onerror = () => { - console.error("[drawAllDrawings] Failed to pre-load stamp image:", imageUrl.substring(0, 100)); - resolve(); // Continue even if image fails - }; - img.src = imageUrl; - }); - imageStampPromises.push(promise); - } - } - } - - // Wait for all stamp images to load before rendering - if (imageStampPromises.length > 0) { - console.log("[drawAllDrawings] Pre-loading", imageStampPromises.length, "stamp images"); - await Promise.all(imageStampPromises); - console.log("[drawAllDrawings] All stamp images loaded"); - } - - // Render drawings in chronological order. When a 'cut' record appears - // we immediately apply a destination-out erase so it removes prior content - // but does not erase strokes that are drawn after the cut. - const maskedOriginals = new Set(); - let seenAnyCut = false; - - for (const drawing of regularDrawings) { - // If this is a cut record, apply the erase to the canvas now. - if (drawing && drawing.pathData && drawing.pathData.tool === "cut") { - seenAnyCut = true; - try { - if (Array.isArray(drawing.pathData.originalStrokeIds)) { - drawing.pathData.originalStrokeIds.forEach((id) => - maskedOriginals.add(id) - ); - } - } catch (e) { } - - if (drawing.pathData && drawing.pathData.rect) { - const r = drawing.pathData.rect; - offscreenContext.save(); - try { - offscreenContext.globalCompositeOperation = "destination-out"; - offscreenContext.fillStyle = "rgba(0,0,0,1)"; - // Expand rect slightly to avoid hairline due to subpixel antialiasing - offscreenContext.fillRect( - Math.floor(r.x) - 2, - Math.floor(r.y) - 2, - Math.ceil(r.width) + 4, - Math.ceil(r.height) + 4 - ); - } finally { - offscreenContext.restore(); - } - - // Restore template layer in the cut region so templates remain visible - if (templateCanvas) { - offscreenContext.drawImage( - templateCanvas, - Math.floor(r.x) - 2, - Math.floor(r.y) - 2, - Math.ceil(r.width) + 4, - Math.ceil(r.height) + 4, - Math.floor(r.x) - 2, - Math.floor(r.y) - 2, - Math.ceil(r.width) + 4, - Math.ceil(r.height) + 4 - ); - } - } - - continue; - } - - // Skip originals that have been masked by a cut - if ( - drawing && - drawing.drawingId && - (cutOriginalIds.has(drawing.drawingId) || - maskedOriginals.has(drawing.drawingId)) - ) { - continue; - } - - // Skip temporary white "erase" helper strokes when we've seen a cut - // record; destination-out masking is authoritative and drawing white - // strokes can produce hairlines. - try { - if ( - seenAnyCut && - drawing && - drawing.color && - typeof drawing.color === "string" && - drawing.color.toLowerCase() === "#ffffff" - ) { - continue; - } - } catch (e) { } - - // Draw the drawing normally - offscreenContext.globalAlpha = 1.0; - let viewingUser = null; - let viewingPeriodStart = null; - if (selectedUser) { - if (typeof selectedUser === "string") viewingUser = selectedUser; - else if (typeof selectedUser === "object") { - viewingUser = selectedUser.user; - viewingPeriodStart = selectedUser.periodStart; - } - } - if (viewingUser && drawing.user !== viewingUser) { - offscreenContext.globalAlpha = 0.1; - } else if (viewingPeriodStart !== null) { - const ts = drawing.timestamp || drawing.order || 0; - if ( - ts < viewingPeriodStart || - ts >= viewingPeriodStart + 5 * 60 * 1000 - ) { - offscreenContext.globalAlpha = 0.1; - } - } - - // Stamps have pathData as array but need special rendering - render inline to preserve z-order - if (drawing.drawingType === "stamp" && drawing.stampData && drawing.stampSettings && Array.isArray(drawing.pathData) && drawing.pathData.length > 0) { - const stamp = drawing.stampData; - const settings = drawing.stampSettings; - const position = drawing.pathData[0]; - - try { - offscreenContext.save(); - offscreenContext.translate(position.x, position.y); - offscreenContext.rotate(((settings.rotation || 0) * Math.PI) / 180); - - const size = settings.size || 50; - - if (stamp.emoji) { - // Render emoji stamp - offscreenContext.font = `${size}px serif`; - offscreenContext.textAlign = "center"; - offscreenContext.textBaseline = "middle"; - offscreenContext.fillText(stamp.emoji, 0, 0); - console.log("[drawAllDrawings] Rendered emoji stamp inline:", stamp.emoji); - } else if (stamp.image) { - // Render image stamp using pre-loaded image - const img = imageStampCache.get(stamp.image); - if (img) { - offscreenContext.globalAlpha = (settings.opacity || 100) / 100 * offscreenContext.globalAlpha; - offscreenContext.drawImage(img, -size / 2, -size / 2, size, size); - console.log("[drawAllDrawings] Rendered image stamp inline"); - } else { - console.warn("[drawAllDrawings] Image stamp not in cache:", stamp.image?.substring(0, 100)); - } - } - - offscreenContext.restore(); - } catch (error) { - offscreenContext.restore(); - console.error("[drawAllDrawings] Error rendering stamp:", error); - } - } else if (drawing.drawingType === "stamp") { - console.warn("[drawAllDrawings] Stamp NOT rendered - missing requirements:", { - drawingId: drawing.drawingId, - drawingType: drawing.drawingType, - hasStampData: !!drawing.stampData, - hasStampSettings: !!drawing.stampSettings, - pathDataIsArray: Array.isArray(drawing.pathData), - pathDataLength: drawing.pathData ? drawing.pathData.length : 0, - pathDataType: typeof drawing.pathData, - pathDataValue: drawing.pathData, - fullDrawing: drawing - }); - } else if (Array.isArray(drawing.pathData)) { - const pts = drawing.pathData; - if (pts.length > 0) { - // Check if this is an advanced brush drawing - if (drawing.brushType && drawing.brushType !== "normal" && brushEngine) { - console.log("Rendering advanced brush in drawAllDrawings:", { - id: drawing.drawingId, - brushType: drawing.brushType, - pointCount: pts.length - }); - - // Use brush engine to render advanced brush strokes - offscreenContext.save(); - brushEngine.updateContext(offscreenContext); - - // Start the stroke at the first point - offscreenContext.beginPath(); - offscreenContext.moveTo(pts[0].x, pts[0].y); - - // Render the stroke using the brush engine with explicit brush type - brushEngine.startStroke(pts[0].x, pts[0].y); - for (let i = 1; i < pts.length; i++) { - // Use drawWithType instead of draw to bypass state dependency - brushEngine.drawWithType( - pts[i].x, - pts[i].y, - drawing.lineWidth, - drawing.color, - drawing.brushType // Pass brush type directly - ); - } - offscreenContext.restore(); - } else { - if (drawing.brushType && drawing.brushType !== "normal") { - console.log("Advanced brush found but no brushEngine:", { - id: drawing.drawingId, - brushType: drawing.brushType, - hasBrushEngine: !!brushEngine - }); - } - // Default rendering for normal brush - offscreenContext.beginPath(); - offscreenContext.moveTo(pts[0].x, pts[0].y); - for (let i = 1; i < pts.length; i++) - offscreenContext.lineTo(pts[i].x, pts[i].y); - offscreenContext.strokeStyle = drawing.color; - offscreenContext.lineWidth = drawing.lineWidth; - offscreenContext.lineCap = drawing.brushStyle || "round"; - offscreenContext.lineJoin = drawing.brushStyle || "round"; - offscreenContext.stroke(); - } - } - } else if (drawing.pathData && drawing.pathData.tool === "shape") { - if (drawing.pathData.points) { - const pts = drawing.pathData.points; - offscreenContext.save(); - offscreenContext.beginPath(); - offscreenContext.moveTo(pts[0].x, pts[0].y); - for (let i = 1; i < pts.length; i++) - offscreenContext.lineTo(pts[i].x, pts[i].y); - offscreenContext.closePath(); - offscreenContext.fillStyle = drawing.color; - offscreenContext.fill(); - offscreenContext.restore(); - } else { - const { - type, - start, - end, - brushStyle: storedBrush, - } = drawing.pathData; - offscreenContext.save(); - offscreenContext.fillStyle = drawing.color; - offscreenContext.lineWidth = drawing.lineWidth; - if (type === "circle") { - const radius = Math.sqrt( - (end.x - start.x) ** 2 + (end.y - start.y) ** 2 - ); - offscreenContext.beginPath(); - offscreenContext.arc(start.x, start.y, radius, 0, Math.PI * 2); - offscreenContext.fill(); - } else if (type === "rectangle") { - offscreenContext.fillRect( - start.x, - start.y, - end.x - start.x, - end.y - start.y - ); - } else if (type === "hexagon") { - const radius = Math.sqrt( - (end.x - start.x) ** 2 + (end.y - start.y) ** 2 - ); - offscreenContext.beginPath(); - for (let i = 0; i < 6; i++) { - const angle = (Math.PI / 3) * i; - const xPoint = start.x + radius * Math.cos(angle); - const yPoint = start.y + radius * Math.sin(angle); - if (i === 0) offscreenContext.moveTo(xPoint, yPoint); - else offscreenContext.lineTo(xPoint, yPoint); - } - offscreenContext.closePath(); - offscreenContext.fill(); - } else if (type === "line") { - offscreenContext.beginPath(); - offscreenContext.moveTo(start.x, start.y); - offscreenContext.lineTo(end.x, end.y); - offscreenContext.strokeStyle = drawing.color; - offscreenContext.lineWidth = drawing.lineWidth; - const cap = storedBrush || drawing.brushStyle || "round"; - offscreenContext.lineCap = cap; - offscreenContext.lineJoin = cap; - offscreenContext.stroke(); - } - offscreenContext.restore(); - } - } else if (drawing.pathData && drawing.pathData.tool === "image") { - const { image, x, y, width, height } = drawing.pathData; - let img = new Image(); - img.src = image; - img.onload = () => { - offscreenContext.drawImage(img, x, y, width, height); - }; - } - } - if (!selectedUser) { - // Group users by 5-minute intervals - // Use both committed drawings and pending drawings so the UI's - // user/time-group list reflects the strokes the user currently sees. - const groupMap = {}; - const groupingSource = [ - ...(userData.drawings || []), - ...(pendingDrawings || []), - ]; - groupingSource.forEach((d) => { - try { - const ts = d.timestamp || d.order || 0; - const periodStart = - Math.floor(ts / (5 * 60 * 1000)) * (5 * 60 * 1000); - if (!groupMap[periodStart]) groupMap[periodStart] = new Set(); - if (d.user) groupMap[periodStart].add(d.user); - } catch (e) { } - }); - const groups = Object.keys(groupMap).map((k) => ({ - periodStart: parseInt(k), - users: Array.from(groupMap[k]), - })); - groups.sort((a, b) => b.periodStart - a.periodStart); - if (selectedUser && selectedUser !== "") { - let stillExists = false; - if (typeof selectedUser === "string") { - for (const g of groups) { - if (g.users.includes(selectedUser)) { - stillExists = true; - break; - } - } - } else if (typeof selectedUser === "object" && selectedUser.user) { - for (const g of groups) { - if ( - g.periodStart === selectedUser.periodStart && - g.users.includes(selectedUser.user) - ) { - stillExists = true; - break; - } - } - } - - if (!stillExists) { - try { - setSelectedUser(""); - } catch (e) { - /* swallow if setter changed */ - } - } - } - - setUserList(groups); - } - - // Apply filters as post-processing after all regular drawings are rendered - if (filterDrawings.length > 0) { - console.log("[drawAllDrawings] Applying", filterDrawings.length, "filter(s)"); - for (const filterDrawing of filterDrawings) { - try { - if (filterDrawing.filterType && filterDrawing.filterParams) { - const imageData = offscreenContext.getImageData(0, 0, canvasWidth, canvasHeight); - const filteredImageData = applyImageFilter( - imageData, - filterDrawing.filterType, - filterDrawing.filterParams - ); - offscreenContext.putImageData(filteredImageData, 0, 0); - console.log("[drawAllDrawings] Applied filter:", filterDrawing.filterType); - } - } catch (e) { - console.error("[drawAllDrawings] Error applying filter:", filterDrawing.filterType, e); - } - } - } - - // Copy offscreen canvas to visible canvas atomically - console.log("[drawAllDrawings] Copying offscreen canvas to visible canvas. Total strokes rendered:", regularDrawings.length, "filters:", filterDrawings.length); - context.imageSmoothingEnabled = false; - context.clearRect(0, 0, canvasWidth, canvasHeight); - context.drawImage(offscreenCanvasRef.current, 0, 0); - console.log("[drawAllDrawings] Canvas update complete"); - } catch (e) { - console.error("Error in drawAllDrawings:", e); - } finally { - // Restore current brush state - if (brushEngine && savedBrushType) { - brushEngine.setBrushType(savedBrushType); - if (savedBrushParams) { - brushEngine.setBrushParams(savedBrushParams); - } - } - setIsLoading(false); - isDrawingInProgressRef.current = false; - } - }; - - drawAllDrawingsRef.current = drawAllDrawings; - - const undo = async () => { - if (!editingEnabled) { - showLocalSnack("Undo is disabled in view-only mode."); - return; - } - if (undoStack.length === 0) return; - if (isRefreshing) { - showLocalSnack( - "Please wait for the canvas to refresh before undoing again." - ); - return; - } - try { - await undoAction({ - auth, - currentUser: auth?.username || "anonymous", - undoStack, - setUndoStack, - setRedoStack, - userData, - drawAllDrawings, - refreshCanvasButtonHandler: refreshCanvasButtonHandler, - roomId: currentRoomId, - }); - // After undo completes, refresh undo/redo availability from server - try { - await checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } catch (e) { } - updateFilterState(); // Update filter state after undo - } catch (error) { - console.error("Error during undo:", error); - } - }; - - const redo = async () => { - if (!editingEnabled) { - showLocalSnack("Redo is disabled in view-only mode."); - return; - } - if (redoStack.length === 0) return; - if (isRefreshing) { - showLocalSnack( - "Please wait for the canvas to refresh before redoing again." - ); - return; - } - try { - await redoAction({ - auth, - currentUser: auth?.username || "anonymous", - redoStack, - setRedoStack, - setUndoStack, - userData, - drawAllDrawings, - refreshCanvasButtonHandler: refreshCanvasButtonHandler, - roomId: currentRoomId, - }); - // After redo completes, refresh undo/redo availability from server - try { - await checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } catch (e) { } - updateFilterState(); // Update filter state after redo - } catch (error) { - console.error("Error during redo:", error); - } - }; - - // Register keyboard shortcuts and commands - useEffect(() => { - // Initialize shortcut manager - if (!shortcutManagerRef.current) { - shortcutManagerRef.current = new KeyboardShortcutManager(); - } - - const manager = shortcutManagerRef.current; - - // Register all commands with the command registry - const commands = [ - // Command Palette & Help - { - id: 'commands.palette', - label: 'Open Command Palette', - description: 'Quick access to all commands', - keywords: ['palette', 'search', 'find'], - category: 'Commands', - action: () => setCommandPaletteOpen(true), - shortcut: { key: 'k', modifiers: { ctrl: true } } - }, - { - id: 'commands.shortcuts', - label: 'Show Keyboard Shortcuts', - description: 'View all available keyboard shortcuts', - keywords: ['help', 'shortcuts', 'keys'], - category: 'Commands', - action: () => setShortcutsHelpOpen(true), - shortcut: { key: '/', modifiers: { ctrl: true } } - }, - { - id: 'commands.cancel', - label: 'Cancel / Escape', - description: 'Cancel current action or close dialogs', - keywords: ['cancel', 'escape', 'close'], - category: 'Commands', - action: () => { - if (commandPaletteOpen) setCommandPaletteOpen(false); - else if (shortcutsHelpOpen) setShortcutsHelpOpen(false); - else if (drawing) setDrawing(false); - }, - shortcut: { key: 'Escape', modifiers: {} } - }, - - // Edit Operations - { - id: 'edit.undo', - label: 'Undo', - description: 'Undo the last action', - keywords: ['undo', 'revert'], - category: 'Edit', - action: undo, - shortcut: { key: 'z', modifiers: { ctrl: true } }, - enabled: () => editingEnabled && undoStack.length > 0 - }, - { - id: 'edit.redo', - label: 'Redo', - description: 'Redo the last undone action', - keywords: ['redo', 'repeat'], - category: 'Edit', - action: redo, - shortcut: { key: 'z', modifiers: { ctrl: true, shift: true } }, - enabled: () => editingEnabled && redoStack.length > 0 - }, - - // Canvas Operations - { - id: 'canvas.clear', - label: 'Clear Canvas', - description: 'Remove all strokes from canvas', - keywords: ['clear', 'delete', 'reset'], - category: 'Canvas', - action: () => { - if (editingEnabled) { - setClearDialogOpen(true); - } else { - showLocalSnack('Canvas clearing is disabled in view-only mode'); - } - }, - shortcut: { key: 'k', modifiers: { ctrl: true, shift: true } }, - enabled: () => editingEnabled - }, - { - id: 'canvas.refresh', - label: 'Refresh Canvas', - description: 'Reload canvas from server', - keywords: ['refresh', 'reload'], - category: 'Canvas', - action: refreshCanvasButtonHandler, - shortcut: { key: 'r', modifiers: { ctrl: true } } - }, - { - id: 'canvas.settings', - label: 'Canvas Settings', - description: 'Open canvas settings', - keywords: ['settings', 'preferences'], - category: 'Canvas', - action: () => { - if (onOpenSettings) onOpenSettings(); - }, - shortcut: { key: ',', modifiers: { ctrl: true } }, - visible: () => !!onOpenSettings - }, - - // Tools - { - id: 'tool.pen', - label: 'Select Pen Tool', - description: 'Switch to freehand drawing', - keywords: ['pen', 'draw', 'brush'], - category: 'Tools', - action: () => { - if (editingEnabled) { - setDrawMode('freehand'); - showLocalSnack('Pen tool selected'); - } - }, - shortcut: { key: 'p', modifiers: {} }, - enabled: () => editingEnabled - }, - { - id: 'tool.eraser', - label: 'Select Eraser', - description: 'Switch to eraser mode', - keywords: ['eraser', 'erase', 'remove'], - category: 'Tools', - action: () => { - if (editingEnabled) { - setDrawMode('eraser'); - showLocalSnack('Eraser selected'); - } - }, - shortcut: { key: 'e', modifiers: {} }, - enabled: () => editingEnabled - }, - { - id: 'tool.rectangle', - label: 'Select Rectangle Tool', - description: 'Draw rectangles and squares', - keywords: ['rectangle', 'rect', 'square'], - category: 'Tools', - action: () => { - if (editingEnabled) { - setDrawMode('shape'); - setShapeType('rectangle'); - showLocalSnack('Rectangle tool selected'); - } - }, - shortcut: { key: 'r', modifiers: {} }, - enabled: () => editingEnabled - }, - { - id: 'tool.circle', - label: 'Select Circle Tool', - description: 'Draw circles and ellipses', - keywords: ['circle', 'oval', 'ellipse'], - category: 'Tools', - action: () => { - if (editingEnabled) { - setDrawMode('shape'); - setShapeType('circle'); - showLocalSnack('Circle tool selected'); - } - }, - shortcut: { key: 'c', modifiers: {} }, - enabled: () => editingEnabled - }, - { - id: 'tool.line', - label: 'Select Line Tool', - description: 'Draw straight lines', - keywords: ['line', 'straight'], - category: 'Tools', - action: () => { - if (editingEnabled) { - setDrawMode('shape'); - setShapeType('line'); - showLocalSnack('Line tool selected'); - } - }, - shortcut: { key: 'l', modifiers: {} }, - enabled: () => editingEnabled - } - ]; - - // Register commands with command registry - // Clear first to ensure clean state - commandRegistry.clear(); - - // Register each command (allowOverwrite for React re-renders) - commands.forEach(cmd => { - commandRegistry.register(cmd, { allowOverwrite: true }); - }); - - // Register keyboard shortcuts - manager.clear(); - commands.forEach(cmd => { - if (cmd.shortcut) { - manager.register( - cmd.shortcut.key, - cmd.shortcut.modifiers, - () => { - // Check if command is enabled before executing - if (cmd.enabled && !cmd.enabled()) { - return; - } - cmd.action(); - }, - cmd.label, - cmd.category - ); - } - }); - - // Add global keyboard event listener - const handleKeyDown = (event) => manager.handleKeyDown(event); - document.addEventListener('keydown', handleKeyDown); - - // Cleanup - return () => { - document.removeEventListener('keydown', handleKeyDown); - manager.clear(); - }; - }, [ - editingEnabled, - undoStack, - redoStack, - undo, - redo, - refreshCanvasButtonHandler, - onOpenSettings, - commandPaletteOpen, - shortcutsHelpOpen, - drawing - ]); - - const { - selectionStart, - setSelectionStart, - selectionRect, - setSelectionRect, - cutImageData, - setCutImageData, - handleCutSelection, - } = useCanvasSelection( - canvasRef, - currentUser, - userData, - generateId, - drawAllDrawings, - currentRoomId, - setUndoAvailable, - setRedoAvailable, - auth, - roomType, - showLocalSnack - ); - - // Draw a preview of a shape (for shape mode) - const drawShapePreview = (start, end, shape, color, lineWidth) => { - if (!start || !end) return; - - const canvas = canvasRef.current; - const context = canvas.getContext("2d"); - context.save(); - context.strokeStyle = color; - context.lineWidth = lineWidth; - context.setLineDash([5, 3]); - - if (shape === "circle") { - const radius = Math.sqrt((end.x - start.x) ** 2 + (end.y - start.y) ** 2); - context.beginPath(); - context.arc(start.x, start.y, radius, 0, Math.PI * 2); - context.stroke(); - } else if (shape === "rectangle") { - context.strokeRect(start.x, start.y, end.x - start.x, end.y - start.y); - } else if (shape === "hexagon") { - const radius = Math.sqrt((end.x - start.x) ** 2 + (end.y - start.y) ** 2); - context.beginPath(); - - for (let i = 0; i < 6; i++) { - const angle = (Math.PI / 3) * i; - const xPoint = start.x + radius * Math.cos(angle); - const yPoint = start.y + radius * Math.sin(angle); - - if (i === 0) context.moveTo(xPoint, yPoint); - else context.lineTo(xPoint, yPoint); - } - context.closePath(); - context.stroke(); - } else if (shape === "line") { - context.beginPath(); - context.moveTo(start.x, start.y); - context.lineTo(end.x, end.y); - context.lineCap = brushStyle; - context.lineJoin = brushStyle; - context.stroke(); - } - - context.restore(); - }; - - // Handle paste action for cut selection - const handlePaste = async (e) => { - if (!editingEnabled) { - showLocalSnack("Editing is disabled in view-only mode."); - setDrawMode("freehand"); - return; - } - if ( - !cutImageData || - !Array.isArray(cutImageData) || - cutImageData.length === 0 - ) { - showLocalSnack("No cut selection available to paste."); - setDrawMode("freehand"); - return; - } - - const canvas = canvasRef.current; - const rectCanvas = canvas.getBoundingClientRect(); - const scaleX = canvas.width / rectCanvas.width; - const scaleY = canvas.height / rectCanvas.height; - const pasteX = (e.clientX - rectCanvas.left) * scaleX; - const pasteY = (e.clientY - rectCanvas.top) * scaleY; - - let minX = Infinity, - minY = Infinity; - - cutImageData.forEach((drawing) => { - if (Array.isArray(drawing.pathData)) { - drawing.pathData.forEach((pt) => { - minX = Math.min(minX, pt.x); - minY = Math.min(minY, pt.y); - }); - } else if (drawing.pathData && drawing.pathData.tool === "shape") { - if (drawing.pathData.points && Array.isArray(drawing.pathData.points)) { - drawing.pathData.points.forEach((pt) => { - minX = Math.min(minX, pt.x); - minY = Math.min(minY, pt.y); - }); - } else if (drawing.pathData.type === "line") { - if (drawing.pathData.start) { - minX = Math.min(minX, drawing.pathData.start.x); - minY = Math.min(minY, drawing.pathData.start.y); - } - if (drawing.pathData.end) { - minX = Math.min(minX, drawing.pathData.end.x); - minY = Math.min(minY, drawing.pathData.end.y); - } - } - } - }); - - if (minX === Infinity || minY === Infinity) { - showLocalSnack("Invalid cut data."); - return; - } - - const offsetX = pasteX - minX; - const offsetY = pasteY - minY; - let pastedDrawings = []; - - const newDrawings = cutImageData - .map((originalDrawing) => { - let newPathData; - if (Array.isArray(originalDrawing.pathData)) { - newPathData = originalDrawing.pathData.map((pt) => ({ - x: pt.x + offsetX, - y: pt.y + offsetY, - })); - } else if ( - originalDrawing.pathData && - originalDrawing.pathData.tool === "shape" - ) { - if ( - originalDrawing.pathData.points && - Array.isArray(originalDrawing.pathData.points) - ) { - const newPoints = originalDrawing.pathData.points.map((pt) => ({ - x: pt.x + offsetX, - y: pt.y + offsetY, - })); - newPathData = { ...originalDrawing.pathData, points: newPoints }; - } else if (originalDrawing.pathData.type === "line") { - const newStart = { - x: originalDrawing.pathData.start.x + offsetX, - y: originalDrawing.pathData.start.y + offsetY, - }; - const newEnd = { - x: originalDrawing.pathData.end.x + offsetX, - y: originalDrawing.pathData.end.y + offsetY, - }; - newPathData = { - ...originalDrawing.pathData, - start: newStart, - end: newEnd, - }; - } - } else { - return null; - } - - // Preserve all metadata from original drawing - const metadata = { - brushStyle: originalDrawing.brushStyle, - brushType: originalDrawing.brushType, - brushParams: originalDrawing.brushParams, - drawingType: originalDrawing.drawingType, - stampData: originalDrawing.stampData, - stampSettings: originalDrawing.stampSettings, - filterType: originalDrawing.filterType, - filterParams: originalDrawing.filterParams, - }; - - return new Drawing( - generateId(), - originalDrawing.color, - originalDrawing.lineWidth, - newPathData, - Date.now(), - currentUser, - metadata - ); - }) - .filter(Boolean); - - setIsRefreshing(true); - setRedoStack([]); - - const pasteRecordId = generateId(); - showLocalSnack(`Pasting ${newDrawings.length} item(s)... Please wait.`); - console.log("[handlePaste] Starting paste operation:", { - pasteRecordId, - drawingCount: newDrawings.length, - drawingTypes: newDrawings.map(d => d.drawingType || "stroke") - }); - - // Attach parentPasteId to each new drawing so the backend/read path can filter them - for (const nd of newDrawings) { - nd.roomId = currentRoomId; - nd.parentPasteId = pasteRecordId; - if (!nd.pathData) nd.pathData = {}; - nd.pathData.parentPasteId = pasteRecordId; - } - console.log("[handlePaste] Attached parentPasteId to all drawings:", pasteRecordId); - - // Submit all pasted drawings as replacement/child strokes but DO NOT add each to the undo stack - let submittedCount = 0; - for (const newDrawing of newDrawings) { - try { - userData.addDrawing(newDrawing); - - await submitToDatabase( - newDrawing, - auth, - { roomId: currentRoomId, roomType, skipUndoStack: true }, - setUndoAvailable, - setRedoAvailable - ); - pastedDrawings.push(newDrawing); - submittedCount++; - - showLocalSnack(`Pasting... ${submittedCount}/${newDrawings.length} items saved.`); - } catch (error) { - console.error("Failed to save drawing:", newDrawing, error); - handleAuthError(error); - } - } - - const pastedIds = pastedDrawings.map((d) => d.drawingId); - const pasteRecord = new Drawing( - pasteRecordId, - "#FFFFFF", - 1, - { tool: "paste", cut: false, pastedDrawingIds: pastedIds }, - Date.now(), - currentUser - ); - console.log("[handlePaste] Created paste record:", { - pasteRecordId, - pastedCount: pastedIds.length, - pastedIds: pastedIds.join(',') - }); - try { - // Submit the single paste-record (counts as one backend undo operation) - await submitToDatabase( - pasteRecord, - auth, - { roomId: currentRoomId, roomType }, - setUndoAvailable, - setRedoAvailable - ); - console.log("[handlePaste] Paste record submitted successfully"); - setUndoStack((prev) => [ - ...prev, - { type: "paste", pastedDrawings: pastedDrawings, backendCount: 1 }, - ]); - } catch (error) { - console.error("Failed to save paste record:", pasteRecord, error); - showLocalSnack("Paste failed to persist. Some strokes may be missing."); - } - - setIsRefreshing(false); - - // Update undo/redo availability after paste operations - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - - tempPathRef.current = []; - if (pastedDrawings.length === newDrawings.length) { - drawAllDrawings(); - setCutImageData([]); - setDrawMode("freehand"); - showLocalSnack(`Paste completed! ${pastedDrawings.length} item(s) pasted successfully.`); - } else { - showLocalSnack(`Paste partially completed. ${pastedDrawings.length}/${newDrawings.length} items pasted.`); - } - }; - - const mergedRefreshCanvas = async (sourceLabel = undefined) => { - try { - if (sourceLabel) { - console.log('mergedRefreshCanvas called from:', sourceLabel, '==='); - console.debug('mergedRefreshCanvas called from:', sourceLabel); - } else { - console.log('mergedRefreshCanvas called (no label) ==='); - console.debug('mergedRefreshCanvas called'); - } - } catch (e) { } - // If currently panning, defer refresh until pan ends to avoid races and frequent backend calls. - try { - if (isPanning) { - console.debug( - "[mergedRefreshCanvas] deferring because isPanning=true, marking pendingPanRefreshRef" - ); - pendingPanRefreshRef.current = true; - return; - } - } catch (e) { } - - if (sourceLabel === "undo-event" || sourceLabel === "redo-event") { - console.log("[mergedRefreshCanvas] Forcing complete state reset for undo/redo"); - lastDrawnStateRef.current = null; - } - - setIsLoading(true); - const backendCount = await backendRefreshCanvas( - serverCountRef.current, - userData, - drawAllDrawings, - historyRange ? historyRange.start : undefined, - historyRange ? historyRange.end : undefined, - { - roomId: currentRoomId, - auth, - clearLastDrawnState: () => { - console.log("[mergedRefreshCanvas] Clearing lastDrawnStateRef to force redraw"); - lastDrawnStateRef.current = null; - } - } - ); - - const pendingSnapshot = [...pendingDrawings]; - - // Don't clear all pending drawings, only mark confirmed ones for removal - - serverCountRef.current = backendCount; - // Re-append any pending drawings that the backend didn't return. - const drawingMatches = (a, b) => { - if (!a || !b) return false; - if (a.drawingId && b.drawingId && a.drawingId === b.drawingId) - return true; - - try { - const sameUser = a.user === b.user; - const tsA = a.timestamp || a.ts || 0; - const tsB = b.timestamp || b.ts || 0; - const tsClose = Math.abs(tsA - tsB) < 1000; - const lenA = Array.isArray(a.pathData) - ? a.pathData.length - : a.pathData && a.pathData.points - ? a.pathData.points.length - : 0; - const lenB = Array.isArray(b.pathData) - ? b.pathData.length - : b.pathData && b.pathData.points - ? b.pathData.points.length - : 0; - const lenClose = Math.abs(lenA - lenB) <= 1; - return sameUser && tsClose && lenClose; - } catch (e) { - return false; - } - }; - - try { - const cutOriginalIds = new Set(); - (userData.drawings || []).forEach((d) => { - if ( - d.pathData && - d.pathData.tool === "cut" && - Array.isArray(d.pathData.originalStrokeIds) - ) { - d.pathData.originalStrokeIds.forEach((id) => cutOriginalIds.add(id)); - } - }); - - if (cutOriginalIds.size > 0) { - userData.drawings = (userData.drawings || []).filter( - (d) => !cutOriginalIds.has(d.drawingId) - ); - } - } catch (e) { - // best-effort - } - - // Re-append pending drawings that the backend didn't return, but - // skip any pending items older than the authoritative clearedAt timestamp - const clearedAt = currentRoomId - ? roomClearedAtRef.current[currentRoomId] - : null; - const stillPending = []; - - pendingSnapshot.forEach((pd) => { - try { - const pdTs = pd.timestamp || pd.ts || 0; - if (clearedAt && pdTs < clearedAt) { - // This pending drawing was created before a server clear; ignore it - return; - } - } catch (e) { } - - const exists = userData.drawings.find((d) => drawingMatches(d, pd)); - if (!exists) { - // Backend doesn't have it yet, keep it pending - userData.drawings.push(pd); - stillPending.push(pd); - } else { - // If pending drawing has stampData but backend version doesn't, use pending version - if (pd.drawingType === "stamp" && pd.stampData) { - const backendMatch = exists; - if (!backendMatch.stampData || !backendMatch.stampData.image && pd.stampData.image) { - console.warn("Backend stamp missing stampData, using pending version:", { - drawingId: pd.drawingId, - pendingHasStampData: !!pd.stampData, - backendHasStampData: !!backendMatch.stampData, - pendingImageLength: pd.stampData.image ? pd.stampData.image.length : 0, - backendImageLength: backendMatch.stampData && backendMatch.stampData.image ? backendMatch.stampData.image.length : 0 - }); - - // Replace backend version with pending version that has complete data - const idx = userData.drawings.findIndex((d) => drawingMatches(d, pd)); - if (idx !== -1) { - userData.drawings[idx] = pd; - } - } - } - - // Backend has it, mark as confirmed and remove from pending - if (pd.drawingId) { - confirmedStrokesRef.current.add(pd.drawingId); - } - } - }); - - // Update pending drawings to only include those still not confirmed by backend - setPendingDrawings(stillPending); - - // CRITICAL: Deduplicate filters - only keep the LATEST of each filter type - // This prevents stacking when backend returns duplicates - const filtersByType = new Map(); - const nonFilterDrawings = []; - - (userData.drawings || []).forEach((drawing) => { - if (drawing.drawingType === "filter" && drawing.filterType) { - const existing = filtersByType.get(drawing.filterType); - // Keep the one with the latest timestamp - if (!existing || (drawing.timestamp || 0) > (existing.timestamp || 0)) { - filtersByType.set(drawing.filterType, drawing); - } - } else { - nonFilterDrawings.push(drawing); - } - }); - - // Rebuild drawings array with deduplicated filters - const deduplicatedDrawings = [ - ...nonFilterDrawings, - ...Array.from(filtersByType.values()) - ]; - - console.log(`[mergedRefreshCanvas] Deduplicated filters. Filter count: ${filtersByType.size}, Total drawings: ${deduplicatedDrawings.length}`); - - // CRITICAL: Update both the mutable userData object AND React state - // Update userData in place so the closure reference works - userData.drawings = deduplicatedDrawings; - - // Also update React state to trigger re-renders - const newUserData = new UserData(userData.userId, userData.username); - newUserData.drawings = deduplicatedDrawings; - setUserData(newUserData); - - // Extract custom stamps from all drawings and update stamp panel - extractCustomStamps(); - - // Use requestAnimationFrame for smoother rendering - requestAnimationFrame(() => { - drawAllDrawings(); - setIsLoading(false); - updateFilterState(); // Update filter state after loading drawings - }); - }; - - // Extract custom stamps from backend drawings and update StampPanel - const extractCustomStamps = () => { - try { - const customStamps = []; - const seenStamps = new Map(); // Deduplicate by image content or emoji - - (userData.drawings || []).forEach((drawing) => { - if (drawing.drawingType === "stamp" && drawing.stampData) { - const stamp = drawing.stampData; - - // Skip default emoji stamps (they're already in StampPanel) - if (stamp.emoji && !stamp.image) { - return; - } - - // For custom image stamps, create a unique key based on image content - if (stamp.image) { - const imageKey = stamp.image.substring(0, 100); // Use first 100 chars as key - - if (!seenStamps.has(imageKey)) { - seenStamps.set(imageKey, true); - customStamps.push({ - id: `stamp-${Date.now()}-${customStamps.length}`, - name: stamp.name || 'Custom Stamp', - category: stamp.category || 'custom', - image: stamp.image, - emoji: stamp.emoji - }); - } - } - } - }); - - if (customStamps.length > 0) { - console.log('Extracted custom stamps from backend:', customStamps.length); - setBackendStamps(customStamps); - } - } catch (error) { - console.error('Error extracting custom stamps:', error); - } - }; - - const startDrawingHandler = (e) => { - const canvas = canvasRef.current; - const rect = canvas.getBoundingClientRect(); - const x = e.clientX - rect.left; - const y = e.clientY - rect.top; - - if (e.button === 1) { - // Middle mouse button: start panning - setIsPanning(true); - panStartRef.current = { x: e.clientX, y: e.clientY }; - panOriginRef.current = { ...panOffset }; - setIsLoading(true); - // Throttle pan-triggered refreshes: if we recently refreshed, defer until pan end - try { - const now = Date.now(); - const diff = now - panLastRefreshRef.current; - console.debug( - `[pan] now=${now} lastRefresh=${panLastRefreshRef.current} diff=${diff} cooldown=${PAN_REFRESH_COOLDOWN_MS}` - ); - if (diff > PAN_REFRESH_COOLDOWN_MS) { - panLastRefreshRef.current = now; - console.debug("[pan] triggering immediate mergedRefreshCanvas"); - mergedRefreshCanvas("pan-start").finally(() => setIsLoading(false)); - } else { - // Mark that we skipped the immediate refresh and schedule a deferred refresh on mouseup - panRefreshSkippedRef.current = true; - console.debug( - "[pan] skipped immediate refresh; scheduling deferred refresh on mouseup" - ); - if (panEndRefreshTimerRef.current) - clearTimeout(panEndRefreshTimerRef.current); - panEndRefreshTimerRef.current = setTimeout(() => { - if (panRefreshSkippedRef.current) { - panRefreshSkippedRef.current = false; - panLastRefreshRef.current = Date.now(); - console.debug("[pan] deferred timer firing mergedRefreshCanvas"); - mergedRefreshCanvas("pan-deferred").finally(() => - setIsLoading(false) - ); - } - panEndRefreshTimerRef.current = null; - }, Math.max(200, PAN_REFRESH_COOLDOWN_MS - diff)); - setIsLoading(false); - } - } catch (e) { - mergedRefreshCanvas().finally(() => setIsLoading(false)); - } - return; - } - - if (!editingEnabled) return; - - if (drawMode === "eraser" || drawMode === "freehand") { - const context = canvas.getContext("2d"); - context.strokeStyle = color; - context.lineWidth = lineWidth; - context.lineCap = brushStyle; - context.lineJoin = brushStyle; - - // Initialize brush engine for advanced brushes - if (brushEngine) { - brushEngine.updateContext(context); - brushEngine.startStroke(x, y); - - // For normal brush, we still need the standard path setup - if (currentBrushType === "normal") { - context.beginPath(); - context.moveTo(x, y); - } - } else { - // Fallback if no brush engine - context.beginPath(); - context.moveTo(x, y); - } - - tempPathRef.current = [{ x, y }]; - setDrawing(true); - } else if (drawMode === "shape") { - setShapeStart({ x, y }); - setDrawing(true); - - const dataURL = canvas.toDataURL(); - let snapshotImg = new Image(); - - snapshotImg.src = dataURL; - snapshotRef.current = snapshotImg; - } else if (drawMode === "select") { - setSelectionStart({ x, y }); - setSelectionRect(null); - setDrawing(true); - - const dataURL = canvas.toDataURL(); - let snapshotImg = new Image(); - - snapshotImg.src = dataURL; - snapshotRef.current = snapshotImg; - } else if (drawMode === "paste") { - handlePaste(e); - } else if (drawMode === "stamp") { - // Start stamp preview on mousedown (will place on mouseup) - if (selectedStamp && stampSettings) { - setStampPreview({ x, y, stamp: selectedStamp, settings: stampSettings }); - stampPreviewRef.current = { x, y, stamp: selectedStamp, settings: stampSettings }; - setDrawing(true); // Enable dragging - } - } - }; - - const handlePan = (e) => { - if (!isPanning) return; - - // If the middle button is no longer pressed, stop panning. - if (!(e.buttons & 4)) { - setIsPanning(false); - panOriginRef.current = { ...panOffset }; - return; - } - - const deltaX = e.clientX - panStartRef.current.x; - const deltaY = e.clientY - panStartRef.current.y; - let newX = panOriginRef.current.x + deltaX; - let newY = panOriginRef.current.y + deltaY; - const containerWidth = window.innerWidth; - const containerHeight = window.innerHeight; - - // Calculate minimum allowed offsets so that the canvas edge is not exceeded. - // Our canvas is fixed at canvasWidth and canvasHeight. - const minX = containerWidth - canvasWidth; // This will be negative if canvasWidth > containerWidth - const minY = containerHeight - canvasHeight; - - newX = clamp(newX, minX, 0); - newY = clamp(newY, minY, 0); - - setPanOffset({ - x: newX, - y: newY, - }); - }; - - const drawHandler = (e) => { - if (isPanning) { - handlePan(e); - return; - } - if (!editingEnabled) return; // prevent drawing but allow other handlers like panning to proceed - if (!drawing) return; - - const canvas = canvasRef.current; - const rect = canvas.getBoundingClientRect(); - const x = e.clientX - rect.left; - const y = e.clientY - rect.top; - - console.log( - "Drawing with brush type:", - currentBrushType, - "drawMode:", - drawMode - ); - - // Update stamp preview position during drag - if (drawMode === "stamp" && stampPreviewRef.current) { - setStampPreview({ ...stampPreviewRef.current, x, y }); - stampPreviewRef.current = { ...stampPreviewRef.current, x, y }; - return; - } - - if (drawMode === "eraser" || drawMode === "freehand") { - const context = canvas.getContext("2d"); - - // Use advanced brush engine if available - if (brushEngine && currentBrushType !== "normal") { - console.log("Drawing with advanced brush engine:", currentBrushType); - // Ensure context is up to date - brushEngine.updateContext(context); - - // Ensure brush engine has current state - if (brushEngine.brushType !== currentBrushType) { - brushEngine.setBrushType(currentBrushType); - } - if ( - JSON.stringify(brushEngine.brushParams) !== - JSON.stringify(brushParams) - ) { - brushEngine.setBrushParams(brushParams); - } - - brushEngine.draw(x, y, lineWidth, color); - } else { - console.log("Drawing with normal brush"); - // Default drawing behavior - context.lineTo(x, y); - context.stroke(); - context.beginPath(); - context.moveTo(x, y); - } - - tempPathRef.current.push({ x, y }); - } else if (drawMode === "shape" && drawing) { - // update shape preview with adjusted coordinates - if (snapshotRef.current && snapshotRef.current.complete) { - const context = canvas.getContext("2d"); - context.clearRect(0, 0, canvasWidth, canvasHeight); - context.drawImage(snapshotRef.current, 0, 0); - } - - drawShapePreview(shapeStart, { x, y }, shapeType, color, lineWidth); - } else if (drawMode === "select" && drawing) { - setSelectionRect({ start: selectionStart, end: { x, y } }); - - if (snapshotRef.current && snapshotRef.current.complete) { - const context = canvas.getContext("2d"); - context.clearRect(0, 0, canvasWidth, canvasHeight); - context.drawImage(snapshotRef.current, 0, 0); - } - - const context = canvas.getContext("2d"); - context.save(); - context.strokeStyle = "blue"; - context.lineWidth = 1; - context.setLineDash([6, 3]); - - const s = selectionStart; - const selX = Math.min(s.x, x); - const selY = Math.min(s.y, y); - const selWidth = Math.abs(x - s.x); - const selHeight = Math.abs(y - s.y); - - context.strokeRect(selX, selY, selWidth, selHeight); - context.restore(); - } - }; - - const stopDrawingHandler = async (e) => { - if (isPanning && e.button === 1) { - setIsPanning(false); - return; - } - if (!drawing) return; - setDrawing(false); - - if (!editingEnabled) { - tempPathRef.current = []; - return; - } - - snapshotRef.current = null; - const canvas = canvasRef.current; - const rect = canvas.getBoundingClientRect(); - const finalX = e.clientX - rect.left; - const finalY = e.clientY - rect.top; - - if (drawMode === "eraser" || drawMode === "freehand") { - const newDrawing = new Drawing( - `drawing_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, - color, - lineWidth, - tempPathRef.current, - Date.now(), - currentUser, - { - brushStyle: brushStyle, - brushType: currentBrushType, - brushParams: brushParams, - drawingType: "stroke", - } - ); - newDrawing.roomId = currentRoomId; - newDrawing.brushType = currentBrushType; - newDrawing.brushParams = brushParams; - - setUndoStack((prev) => [...prev, newDrawing]); - setRedoStack([]); - - try { - userData.addDrawing(newDrawing); - // Add to pending drawings for immediate display (optimistic UI) - setPendingDrawings((prev) => [...prev, newDrawing]); - - // Use requestAnimationFrame for immediate, smooth redraw - requestAnimationFrame(() => { - drawAllDrawings(); - }); - - // Queue the submission instead of submitting immediately - const submitTask = async () => { - try { - console.log("Submitting queued stroke:", { - drawingId: newDrawing.drawingId, - pathLength: tempPathRef.current.length, - }); - - await submitToDatabase( - newDrawing, - auth, - { - roomId: currentRoomId, - roomType, - }, - setUndoAvailable, - setRedoAvailable - ); - - // Don't remove from pending here - let mergedRefreshCanvas or socket confirmation handle it - - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - } catch (error) { - console.error("Error during queued freehand submission:", error); - // On error, remove the failed stroke from pending - setPendingDrawings((prev) => - prev.filter((d) => d.drawingId !== newDrawing.drawingId) - ); - handleAuthError(error); - } - }; - - submissionQueueRef.current.push(submitTask); - processSubmissionQueue(); - } catch (error) { - console.error("Error preparing freehand stroke:", error); - handleAuthError(error); - } finally { - setIsRefreshing(false); - } - tempPathRef.current = []; - } else if (drawMode === "shape") { - if (!shapeStart) { - return; - } - - const finalEnd = { x: finalX, y: finalY }; - const context = canvas.getContext("2d"); - - context.save(); - context.fillStyle = color; - context.lineWidth = lineWidth; - context.setLineDash([]); - if (shapeType === "circle") { - const radius = Math.sqrt( - (finalEnd.x - shapeStart.x) ** 2 + (finalEnd.y - shapeStart.y) ** 2 - ); - - context.beginPath(); - context.arc(shapeStart.x, shapeStart.y, radius, 0, Math.PI * 2); - context.fill(); - } else if (shapeType === "rectangle") { - context.fillRect( - shapeStart.x, - shapeStart.y, - finalEnd.x - shapeStart.x, - finalEnd.y - shapeStart.y - ); - } else if (shapeType === "hexagon") { - const radius = Math.sqrt( - (finalEnd.x - shapeStart.x) ** 2 + (finalEnd.y - shapeStart.y) ** 2 - ); - context.beginPath(); - for (let i = 0; i < 6; i++) { - const angle = (Math.PI / 3) * i; - const xPoint = shapeStart.x + radius * Math.cos(angle); - const yPoint = shapeStart.y + radius * Math.sin(angle); - - if (i === 0) context.moveTo(xPoint, yPoint); - else context.lineTo(xPoint, yPoint); - } - - context.closePath(); - context.fill(); - } else if (shapeType === "line") { - context.beginPath(); - context.moveTo(shapeStart.x, shapeStart.y); - context.lineTo(finalEnd.x, finalEnd.y); - context.strokeStyle = color; - context.lineWidth = lineWidth; - context.lineCap = brushStyle; - context.lineJoin = brushStyle; - context.stroke(); - } - context.restore(); - - const shapeDrawingData = { - tool: "shape", - type: shapeType, - start: shapeStart, - end: finalEnd, - brushStyle: shapeType === "line" ? brushStyle : undefined, - }; - - const newDrawing = new Drawing( - `drawing_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, - color, - lineWidth, - shapeDrawingData, - Date.now(), - currentUser, - { - brushStyle: shapeType === "line" ? brushStyle : "round", - brushType: currentBrushType, - brushParams: brushParams, - drawingType: "shape", - } - ); - newDrawing.roomId = currentRoomId; - - userData.addDrawing(newDrawing); - setPendingDrawings((prev) => [...prev, newDrawing]); - - // Use requestAnimationFrame for smooth shape rendering - requestAnimationFrame(() => { - drawAllDrawings(); - }); - - setUndoStack((prev) => [...prev, newDrawing]); - setRedoStack([]); - - // Queue the submission - const submitTask = async () => { - try { - await submitToDatabase( - newDrawing, - auth, - { - roomId: currentRoomId, - roomType, - }, - setUndoAvailable, - setRedoAvailable - ); - - // Don't remove from pending here - let mergedRefreshCanvas or socket confirmation handle it - - // Update undo/redo availability after shape submission - if (currentRoomId) { - checkUndoRedoAvailability( - auth, - setUndoAvailable, - setRedoAvailable, - currentRoomId - ); - } - } catch (error) { - console.error("Error during queued shape submission:", error); - // On error, remove the failed stroke from pending - setPendingDrawings((prev) => - prev.filter((d) => d.drawingId !== newDrawing.drawingId) - ); - handleAuthError(error); - } - }; - - submissionQueueRef.current.push(submitTask); - processSubmissionQueue(); - - setShapeStart(null); - } else if (drawMode === "select") { - setDrawing(false); - - try { - await mergedRefreshCanvas(); - } catch (error) { - console.error("Error during select submission or refresh:", error); - } finally { - setIsRefreshing(false); - } - - mergedRefreshCanvas(); - } else if (drawMode === "stamp" && stampPreviewRef.current) { - // Place stamp at final position on mouseup - const { x, y, stamp, settings } = stampPreviewRef.current; - await placeStamp(x, y, stamp, settings); - - // Clear preview - setStampPreview(null); - stampPreviewRef.current = null; - } - }; - - const openHistoryDialog = () => { - setSelectedUser(""); - setHistoryDialogOpen(true); - }; - - const handleApplyHistory = async (startMs, endMs) => { - // startMs and endMs are epoch ms. If not provided, read from inputs. - const start = - startMs !== undefined - ? startMs - : historyStartInput - ? new Date(historyStartInput).getTime() - : NaN; - const end = - endMs !== undefined - ? endMs - : historyEndInput - ? new Date(historyEndInput).getTime() - : NaN; - - if (isNaN(start) || isNaN(end)) { - showLocalSnack( - "Please select both start and end date/time before applying History Recall." - ); - return; - } - if (start > end) { - showLocalSnack("Invalid time range selected. Make sure start <= end."); - return; - } - - // Deselect any selected user when entering history recall - setSelectedUser(""); - setHistoryRange({ start, end }); - setIsLoading(true); - - // Try to load drawings for the requested time range - await clearCanvasForRefresh(); - // set a temporary historyRange so mergedRefreshCanvas will use it - setHistoryRange({ start, end }); - try { - const backendCount = await backendRefreshCanvas( - serverCountRef.current, - userData, - drawAllDrawings, - start, - end, - { roomId: currentRoomId, auth } - ); - serverCountRef.current = backendCount; - // If no drawings loaded, inform user and rollback historyRange - if (!userData.drawings || userData.drawings.length === 0) { - setHistoryRange(null); - showLocalSnack( - "No drawings were found in that date/time range. Please select another range or exit history recall mode." - ); - return; - } - setHistoryMode(true); - setHistoryDialogOpen(false); - } catch (e) { - console.error("Error applying history range:", e); - setHistoryRange(null); - showLocalSnack( - "An error occurred while loading history. See console for details." - ); - } finally { - setIsLoading(false); - } - }; - - // Auto-refresh when the active room changes - useEffect(() => { - // wipe local cache so we don't flash previous room's strokes - userData.drawings = []; - setIsRefreshing(true); - - // clear what's on screen immediately - try { - if (canvasRef.current) { - const ctx = canvasRef.current.getContext("2d"); - if (ctx) { - ctx.clearRect( - 0, - 0, - canvasRef.current.width, - canvasRef.current.height - ); - } - drawAllDrawings(); - } - } catch { } - - // reload for the new room - (async () => { - try { - await mergedRefreshCanvas(); // already room-aware - } finally { - setIsRefreshing(false); - } - })(); - }, [currentRoomId, canvasRefreshTrigger]); - - const exitHistoryMode = async () => { - // Deselect any selected user when leaving history mode - setSelectedUser(""); - setHistoryMode(false); - setHistoryRange(null); - setIsLoading(true); - try { - await clearCanvasForRefresh(); - serverCountRef.current = await backendRefreshCanvas( - serverCountRef.current, - userData, - drawAllDrawings, - undefined, - undefined, - { roomId: currentRoomId, auth } - ); - } finally { - setIsLoading(false); - } - }; - - const clearCanvas = async () => { - if (!editingEnabled) { - showLocalSnack("Cannot clear canvas in view-only mode."); - return; - } - const canvas = canvasRef.current; - const context = canvas.getContext("2d"); - - context.clearRect(0, 0, canvasWidth, canvasHeight); - - setUserData(initializeUserData()); - setUndoStack([]); - setRedoStack([]); - setPendingDrawings([]); - serverCountRef.current = 0; - }; - - const handleExportCanvas = async () => { - if (!currentRoomId) { - showLocalSnack("Cannot export: not in a room"); - return; - } - - try { - setIsLoading(true); - showLocalSnack("Exporting canvas data..."); - - const { exportRoomCanvas } = await import('../api/rooms'); - console.log('[Export] Calling API with roomId:', currentRoomId); - console.log('[Export] Auth token present:', !!auth?.token); - - const exportData = await exportRoomCanvas(auth?.token, currentRoomId); - - console.log('[Export] Received exportData:', { - exists: !!exportData, - type: typeof exportData, - keys: exportData ? Object.keys(exportData) : [], - hasStrokes: exportData ? !!exportData.strokes : false, - strokeCount: exportData ? exportData.strokeCount : 'N/A' - }); - - if (!exportData) { - console.error('[Export] exportData is null or undefined'); - showLocalSnack("Export failed: no data returned from server"); - return; - } - - if (!exportData.strokes) { - console.error('[Export] exportData.strokes is missing:', exportData); - showLocalSnack(`Export failed: no strokes in response (got ${exportData.strokeCount || 0} count)`); - return; - } - - // Create a downloadable JSON file - const dataStr = JSON.stringify(exportData, null, 2); - const dataBlob = new Blob([dataStr], { type: 'application/json' }); - const url = URL.createObjectURL(dataBlob); - const link = document.createElement('a'); - link.href = url; - link.download = `${exportData.roomName || 'canvas'}_export_${Date.now()}.json`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - URL.revokeObjectURL(url); - - showLocalSnack(`Exported ${exportData.strokeCount} strokes successfully`); - console.log('[Export] Success - downloaded file'); - } catch (error) { - console.error("[Export] Error caught:", error); - console.error("[Export] Error stack:", error.stack); - showLocalSnack(`Export failed: ${error.message || 'Unknown error'}`); - } finally { - setIsLoading(false); - } - }; - - const handleImportCanvas = async () => { - if (!currentRoomId) { - showLocalSnack("Cannot import: not in a room"); - return; - } - - if (!editingEnabled) { - showLocalSnack("Cannot import in view-only mode"); - return; - } - - // Create a file input element - const input = document.createElement('input'); - input.type = 'file'; - input.accept = 'application/json,.json'; - - input.onchange = async (e) => { - const file = e.target.files[0]; - if (!file) return; - - try { - setIsLoading(true); - showLocalSnack("Reading import file..."); - - const text = await file.text(); - const importData = JSON.parse(text); - - if (!importData.strokes || !Array.isArray(importData.strokes)) { - showLocalSnack("Invalid import file: missing strokes array"); - return; - } - - // Ask user if they want to clear existing canvas - const clearExisting = window.confirm( - `Import ${importData.strokes.length} strokes?\n\n` + - `Click OK to replace current canvas, or Cancel to merge with existing drawings.` - ); - - showLocalSnack(`Importing ${importData.strokes.length} strokes...`); - - const { importRoomCanvas } = await import('../api/rooms'); - const result = await importRoomCanvas(auth?.token, currentRoomId, importData, clearExisting); - - if (result.status === 'success') { - showLocalSnack( - `Import complete: ${result.imported} imported, ${result.failed} failed`, - 6000 - ); - - // Refresh canvas to show imported data - setTimeout(async () => { - try { - await clearCanvasForRefresh(); - await mergedRefreshCanvas("post-import"); - } catch (error) { - console.error("Error refreshing after import:", error); - } - }, 500); - } else { - showLocalSnack(`Import failed: ${result.message || 'Unknown error'}`); - } - } catch (error) { - console.error("Import error:", error); - showLocalSnack(`Import failed: ${error.message || 'Invalid file format'}`); - } finally { - setIsLoading(false); - } - }; - - input.click(); - }; - - const toggleColorPicker = (event) => { - const viewportHeight = window.innerHeight; - const pickerHeight = 350; - const rect = event.target.getBoundingClientRect(); - const pickerElement = document.querySelector(".Canvas-color-picker"); - - setShowColorPicker(!showColorPicker); - - if (rect.bottom + pickerHeight > viewportHeight && pickerElement) { - pickerElement.classList.add("Canvas-color-picker--adjust-bottom"); - } else if (pickerElement) { - pickerElement.classList.remove("Canvas-color-picker--adjust-bottom"); - } - }; - - const closeColorPicker = () => { - setShowColorPicker(false); - }; - - useEffect(() => { - setIsRefreshing(true); - clearCanvasForRefresh(); - - mergedRefreshCanvas().then(() => { - setTimeout(() => { - setIsRefreshing(false); - }, 500); - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedUser]); - - useEffect(() => { - setUndoAvailable(undoStack.length > 0); - setRedoAvailable(redoStack.length > 0); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [undoStack, redoStack]); - - const [showToolbar, setShowToolbar] = useState(true); - const [hoverToolbar, setHoverToolbar] = useState(false); - - return ( -
- {/* Top header: room name + optional history range + exit button */} - - - {currentRoomName || "Master (not in a room)"} - - - {historyMode && historyRange && ( - - {new Date(historyRange.start).toLocaleString()} —{" "} - {new Date(historyRange.end).toLocaleString()} - - )} - - {currentRoomId && ( - - )} - - - {/* Archived overlay banner - visible when viewOnly (archived or explicit viewer) */} - {viewOnly && ( - - - - Archived — View Only - - {/* Owner-only destructive delete button placed under the banner */} - {isOwner && ( - - - - )} - - - )} - - {/* Wallet disconnected banner - visible when secure room wallet is not connected */} - {roomType === "secure" && !walletConnected && ( - - - - ⚠ Wallet Not Connected — Canvas Locked - - - - )} - - {/* Confirm Destructive Delete dialog (owner-only) */} - { - setConfirmDestructiveOpen(false); - setDestructiveConfirmText(""); - }} - > - Permanently delete room - - - This will permanently delete this room and all its data for every - user. This action is irreversible. - - - To confirm, type DELETE below. - - setDestructiveConfirmText(e.target.value)} - placeholder="Type DELETE to confirm" - sx={{ mt: 1 }} - /> - - - - - - - - - - {/* Stamp preview overlay */} - {stampPreview && ( - - {stampPreview.stamp.emoji ? ( - - {stampPreview.stamp.emoji} - - ) : stampPreview.stamp.image ? ( - Stamp preview - ) : null} - - )} - - setHoverToolbar(true)} - onMouseLeave={() => setHoverToolbar(false)} - > - setShowToolbar((v) => !v)} - sx={{ - position: "absolute", - right: showToolbar ? 0 : -20, - top: "50%", - transform: "translateY(-50%)", - - width: 20, - height: 60, - display: "flex", - alignItems: "center", - justifyContent: "center", - - opacity: hoverToolbar ? 1 : 0, - transition: "opacity 0.2s", - bgcolor: "rgba(0,0,0,0.2)", - cursor: "pointer", - zIndex: 1001, - }} - > - - {showToolbar ? ( - - ) : ( - - )} - - - { - if (!editingEnabled) { - showLocalSnack("Cut is disabled in view-only mode."); - return; - } - showLocalSnack("Cutting selection... This may take a moment."); - try { - const result = await handleCutSelection(); - if (result && result.compositeCutAction) { - setUndoStack((prev) => [...prev, result.compositeCutAction]); - } - setIsRefreshing(true); - showLocalSnack("Syncing cut operation..."); - try { - await mergedRefreshCanvas(); - showLocalSnack("Cut completed successfully!"); - } catch (e) { - console.error("Error syncing cut with server:", e); - showLocalSnack("Cut completed, but sync failed. Try refreshing."); - } finally { - setIsRefreshing(false); - } - } catch (e) { - console.error("Error during cut:", e); - showLocalSnack("Cut operation failed. Please try again."); - } - }} - cutImageData={cutImageData} - setClearDialogOpen={setClearDialogOpen} - /* Export/Import handlers */ - handleExportCanvas={handleExportCanvas} - handleImportCanvas={handleImportCanvas} - /* Advanced brush/stamp/filter props */ - currentBrushType={currentBrushType} - onBrushSelect={handleBrushSelect} - onBrushParamsChange={handleBrushParamsChange} - selectedStamp={selectedStamp} - onStampSelect={handleStampSelect} - onStampChange={handleStampChange} - backendStamps={backendStamps} - onFilterApply={applyFilter} - onFilterPreview={previewFilter} - onFilterUndo={undoFilter} - onClearAllFilters={clearAllFilters} - canUndoFilter={ - !!originalCanvasDataRef.current || - undoStack.some((drawing) => drawing.drawingType === "filter") - } - canClearFilters={hasFilters} - appliedFilters={ - (() => { - const filters = userData.drawings.filter((drawing) => drawing.drawingType === "filter"); - console.log(`[Canvas render] Passing ${filters.length} applied filters to Toolbar`, filters); - return filters; - })() - } - /* History Recall props (required so the toolbar can open/change/exit history mode) */ - openHistoryDialog={openHistoryDialog} - exitHistoryMode={exitHistoryMode} - historyMode={historyMode} - controlsDisabled={!editingEnabled} - onOpenSettings={onOpenSettings} - /> - - - {isRefreshing && ( -
-
-
- )} - - {/* History Recall Dialog */} - setHistoryDialogOpen(false)} - aria-labelledby="history-recall-dialog" - > - - History Recall - Select Date/Time Range - - - - Choose a start and end date/time to recall drawings from - ResilientDB. Only drawings within the selected range will be loaded. - - - setHistoryStartInput(e.target.value)} - InputLabelProps={{ shrink: true }} - /> - setHistoryEndInput(e.target.value)} - InputLabelProps={{ shrink: true }} - /> - - - - - - - - - - - - - {historyMode - ? "History Mode Enabled — Canvas Editing Disabled" - : selectedUser && selectedUser !== "" - ? "Viewing Past Drawing History of Selected User — Canvas Editing Disabled" - : ""} - - - - - {/* Loading overlay: fades in/out while drawings load */} - - - - Loading Drawings... - - - - setClearDialogOpen(false)}> - Clear Canvas - - - Are you sure you want to clear the canvas for everyone? - - - - - - - - - {/* Command Palette - Quick command search and execution */} - setCommandPaletteOpen(false)} - commands={commandRegistry.getAll()} - onExecute={(command) => { - try { - command.action(); - } catch (error) { - console.error('[Canvas] Error executing command:', error); - showLocalSnack('Error executing command'); - } - }} - /> - - {/* Keyboard Shortcuts Help Dialog */} - setShortcutsHelpOpen(false)} - shortcuts={shortcutManagerRef.current?.getAllShortcuts() || []} - /> - - -
- ); -} - -export default Canvas; From 9dc9c79e4832b24bd887d06b3260177edd94541f Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:32:09 -0800 Subject: [PATCH 09/26] Add files via upload --- frontend/src/components/Canvas.js | 4799 +++++++++++++++++++++++++++++ 1 file changed, 4799 insertions(+) create mode 100644 frontend/src/components/Canvas.js diff --git a/frontend/src/components/Canvas.js b/frontend/src/components/Canvas.js new file mode 100644 index 00000000..1d284be9 --- /dev/null +++ b/frontend/src/components/Canvas.js @@ -0,0 +1,4799 @@ +import React, { useRef, useState, useEffect } from "react"; +import "../styles/Canvas.css"; +import { + Box, + Fade, + Paper, + Button, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + IconButton, + TextField, + Typography, + CircularProgress, +} from '@mui/material'; +import SafeSnackbar from './SafeSnackbar'; +import CommandPalette from './CommandPalette'; +import KeyboardShortcutsHelp from './KeyboardShortcutsHelp'; +import { KeyboardShortcutManager } from '../services/KeyboardShortcuts'; +import { commandRegistry } from '../services/CommandRegistry'; +import { DEFAULT_SHORTCUTS } from '../config/shortcuts'; +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import Toolbar from './Toolbar'; +// AI Assist Imports +import AIAssistantPanel from './AI/AIAssistantPanel'; +import PromptInput from './AI/PromptInput'; +import ShapeCompletionOverlay from './AI/ShapeCompletionOverlay'; +import { useCanvasSelection } from '../hooks/useCanvasSelection'; +// AI Assist Hook +import { useAIAssistant } from '../hooks/useAIAssistant'; +import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; +import useBrushEngine from "../hooks/useBrushEngine"; +import { + submitToDatabase, + refreshCanvas as backendRefreshCanvas, + clearBackendCanvas, + undoAction, + redoAction, + checkUndoRedoAvailability +} from '../services/canvasBackendJWT'; +import { Drawing } from '../lib/drawing'; +import { getSocket, setSocketToken } from '../services/socket'; +import { handleAuthError } from '../utils/authUtils'; +import { getUsername } from '../utils/getUsername'; +import { getAuthUser } from '../utils/getAuthUser'; +import { resetMyStacks } from '../api/rooms'; +import { TEMPLATE_LIBRARY } from '../data/templates'; + +class UserData { + constructor(userId, username) { + this.userId = userId; + this.username = username; + this.drawings = []; + } + + addDrawing(drawing) { + this.drawings.push(drawing); + } + + clearDrawings() { + this.drawings = []; + } +} + +const DEFAULT_CANVAS_WIDTH = 3000; +const DEFAULT_CANVAS_HEIGHT = 2000; + +function Canvas({ + auth, + setUserList, + selectedUser, + setSelectedUser, + currentRoomId, + canvasRefreshTrigger = 0, + currentRoomName = "Master (not in a room)", + onExitRoom = () => { }, + onOpenSettings = null, + viewOnly = false, + isOwner = false, + roomType = "public", + walletConnected = false, + templateId = null, +}) { + const canvasRef = useRef(null); + const snapshotRef = useRef(null); + const tempPathRef = useRef([]); + const clamp = (value, min, max) => Math.min(max, Math.max(min, value)); + + const currentUserRef = useRef(null); + if (currentUserRef.current === null) { + try { + const uname = + getUsername(auth) || + `anon_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`; + currentUserRef.current = `${uname}|${Date.now()}`; + } catch (e) { + currentUserRef.current = `anon_${Date.now()}_${Math.random() + .toString(36) + .substr(2, 5)}`; + } + } + const currentUser = currentUserRef.current; + + const [drawing, setDrawing] = useState(false); + const [color, setColor] = useState("#000000"); + const [lineWidth, setLineWidth] = useState(5); + const [drawMode, setDrawMode] = useState("freehand"); + const [shapeType, setShapeType] = useState("circle"); + const [brushStyle] = useState("round"); + const [shapeStart, setShapeStart] = useState(null); + + const brushEngine = useBrushEngine(); + const [currentBrushType, setCurrentBrushType] = useState("normal"); + const [brushParams, setBrushParams] = useState({}); + const [selectedStamp, setSelectedStamp] = useState(null); + const [stampSettings, setStampSettings] = useState({ + size: 50, + rotation: 0, + opacity: 100, + }); + const [backendStamps, setBackendStamps] = useState([]); + const [stampPreview, setStampPreview] = useState(null); // { x, y, stamp, settings } + const stampPreviewRef = useRef(null); + const [activeFilter, setActiveFilter] = useState(null); + const [filterParams, setFilterParams] = useState({}); + const [isFilterPreview, setIsFilterPreview] = useState(false); + const filterCanvasRef = useRef(null); + const originalCanvasDataRef = useRef(null); // For preview mode undo + const preFilterCanvasStateRef = useRef(null); + + const [showColorPicker, setShowColorPicker] = useState(false); + const [isRefreshing, setIsRefreshing] = useState(false); + const [previousColor, setPreviousColor] = useState(null); + const [clearDialogOpen, setClearDialogOpen] = useState(false); + const [undoStack, setUndoStack] = useState([]); + const [redoStack, setRedoStack] = useState([]); + const [undoAvailable, setUndoAvailable] = useState(false); + const [redoAvailable, setRedoAvailable] = useState(false); + const [hasFilters, setHasFilters] = useState(false); // Track if filters exist for UI updates + + // AI Asiistant Panel States + const [aiOpen, setAiOpen] = useState(false); + const [aiBusy, setAiBusy] = useState(false); + const [aiError, setAiError] = useState(''); + const [aiGenerateService, setAiGenerateService] = useState(""); + const [showPromptInput, setShowPromptInput] = useState(false); + const [promptInputPlaceHolder, setPromptInputPlaceholder] = useState(""); + const [shapeSuggestion, setShapeSuggestion] = useState(null); + const [shapeAnchor, setShapeAnchor] = useState(null); + const [shapeOverlayOpen, setShapeOverlayOpen] = useState(false); + const [shapeCompletionEnabled, setShapeCompletionEnabled] = useState(false); + + const [templateObjects, setTemplateObjects] = useState([]); + const templateObjectsRef = useRef([]); + + useEffect(() => { + templateObjectsRef.current = templateObjects; + }, [templateObjects]); + + const canvasWidth = DEFAULT_CANVAS_WIDTH; + const canvasHeight = DEFAULT_CANVAS_HEIGHT; + + const [panOffset, setPanOffset] = useState({ x: 0, y: 0 }); + const [isPanning, setIsPanning] = useState(false); + const panStartRef = useRef({ x: 0, y: 0 }); + const panOriginRef = useRef({ x: 0, y: 0 }); + const PAN_REFRESH_COOLDOWN_MS = 2000; + const panLastRefreshRef = useRef(0); + const panRefreshSkippedRef = useRef(false); + const panEndRefreshTimerRef = useRef(null); + const pendingPanRefreshRef = useRef(false); + const [pendingDrawings, setPendingDrawings] = useState([]); + const refreshTimerRef = useRef(null); + const submissionQueueRef = useRef([]); + const isSubmittingRef = useRef(false); + const confirmedStrokesRef = useRef(new Set()); + const lastDrawnStateRef = useRef(null); // Track last drawn state to avoid redundant redraws + const isDrawingInProgressRef = useRef(false); // Prevent concurrent drawing operations + const offscreenCanvasRef = useRef(null); // Offscreen canvas for flicker free rendering + const forceNextRedrawRef = useRef(false); // Force next redraw even if signature matches for undo redo + const [historyMode, setHistoryMode] = useState(false); + const [historyRange, setHistoryRange] = useState(null); // {start, end} in epoch ms + const [historyDialogOpen, setHistoryDialogOpen] = useState(false); + const [historyStartInput, setHistoryStartInput] = useState(""); + const [historyEndInput, setHistoryEndInput] = useState(""); + const [isLoading, setIsLoading] = useState(false); + + const [localSnack, setLocalSnack] = useState({ + open: false, + message: "", + duration: 4000, + }); + const [confirmDestructiveOpen, setConfirmDestructiveOpen] = useState(false); + const [destructiveConfirmText, setDestructiveConfirmText] = useState(""); + const showLocalSnack = (msg, duration = 4000) => + setLocalSnack({ open: true, message: String(msg), duration }); + + // editingEnabled controls whether the user can perform mutating actions. + // When historyMode is active, a specific user is selected for replay, or + // when viewOnly is true (room is archived or user is a viewer), editing + // should be disabled. + // For secure rooms, wallet must be connected to allow editing. + const editingEnabled = !( + historyMode || + (selectedUser && selectedUser !== "") || + viewOnly || + (roomType === "secure" && !walletConnected) + ); + const closeLocalSnack = () => + setLocalSnack({ open: false, message: "", duration: 4000 }); + + // Keyboard shortcuts state + const [commandPaletteOpen, setCommandPaletteOpen] = useState(false); + const [shortcutsHelpOpen, setShortcutsHelpOpen] = useState(false); + const shortcutManagerRef = useRef(null); + + const roomUiRef = useRef({}); + const previousSelectedUserRef = useRef(null); // Track previous selectedUser to detect changes + const isRefreshingSelectedUserRef = useRef(false); // Prevent concurrent refreshes + const selectedUserRefreshQueueRef = useRef(null); // Queue the next refresh target + const selectedUserAbortControllerRef = useRef(null); // Cancel pending operations + const roomStacksRef = useRef({}); + const roomClipboardRef = useRef({}); + const roomClearedAtRef = useRef({}); + const drawAllDrawingsRef = useRef(null); // Store reference to drawAllDrawings function + + useEffect(() => { + if (!currentRoomId) return; + const ui = + roomUiRef.current[currentRoomId] || + JSON.parse( + localStorage.getItem(`rescanvas:toolbar:${currentRoomId}`) || "null" + ) || + {}; + if (ui.color) setColor(ui.color); + if (ui.lineWidth) setLineWidth(ui.lineWidth); + if (ui.drawMode) setDrawMode(ui.drawMode); + if (ui.shapeType) setShapeType(ui.shapeType); + if (ui.previousColor !== undefined) setPreviousColor(ui.previousColor); + if (ui.selectedStamp) setSelectedStamp(ui.selectedStamp); + if (ui.stampSettings) setStampSettings(ui.stampSettings); + if (ui.currentBrushType) { + setCurrentBrushType(ui.currentBrushType); + brushEngine.setBrushType(ui.currentBrushType); + } + if (ui.brushParams) { + setBrushParams(ui.brushParams); + brushEngine.setBrushParams(ui.brushParams); + } + roomUiRef.current[currentRoomId] = { + color: ui.color ?? color, + lineWidth: ui.lineWidth ?? lineWidth, + drawMode: ui.drawMode ?? drawMode, + shapeType: ui.shapeType ?? shapeType, + previousColor: ui.previousColor ?? previousColor, + selectedStamp: ui.selectedStamp ?? selectedStamp, + stampSettings: ui.stampSettings ?? stampSettings, + currentBrushType: ui.currentBrushType ?? currentBrushType, + brushParams: ui.brushParams ?? brushParams, + }; + const stacks = roomStacksRef.current[currentRoomId] || { + undo: [], + redo: [], + }; + setUndoStack(stacks.undo); + setRedoStack(stacks.redo); + const clip = roomClipboardRef.current[currentRoomId] || null; + if (setCutImageData) setCutImageData(clip); + }, [currentRoomId]); + + // Load template objects when templateId changes + useEffect(() => { + + if (!templateId) { + setTemplateObjects([]); + return; + } + + const template = TEMPLATE_LIBRARY.find(t => t.id === templateId); + + if (template && template.canvas && template.canvas.objects) { + setTemplateObjects(template.canvas.objects); + } else { + setTemplateObjects([]); + } + }, [templateId, currentRoomId]); + + // Force redraw whenever templateObjects change (ensures templates appear immediately) + useEffect(() => { + if (!templateObjects || templateObjects.length === 0) return; + + const timer = setTimeout(() => { + if (drawAllDrawingsRef.current) { + lastDrawnStateRef.current = null; // Force redraw by clearing cache + drawAllDrawingsRef.current(); + } else { + console.warn('drawAllDrawingsRef not ready yet'); + } + }, 100); + + return () => clearTimeout(timer); + }, [templateObjects]); + + useEffect(() => { + if (!currentRoomId) return; + const ui = { color, lineWidth, drawMode, shapeType, previousColor, selectedStamp, stampSettings, currentBrushType, brushParams }; + roomUiRef.current[currentRoomId] = ui; + try { + localStorage.setItem( + `rescanvas:toolbar:${currentRoomId}`, + JSON.stringify(ui) + ); + } catch { } + }, [currentRoomId, color, lineWidth, drawMode, shapeType, previousColor, selectedStamp, stampSettings, currentBrushType, brushParams]); + + useEffect(() => { + if (!currentRoomId) return; + const cur = roomStacksRef.current[currentRoomId] || { undo: [], redo: [] }; + cur.undo = undoStack; + roomStacksRef.current[currentRoomId] = cur; + }, [currentRoomId, undoStack]); + useEffect(() => { + if (!currentRoomId) return; + const cur = roomStacksRef.current[currentRoomId] || { undo: [], redo: [] }; + cur.redo = redoStack; + roomStacksRef.current[currentRoomId] = cur; + }, [currentRoomId, redoStack]); + + useEffect(() => { + const handleMouseUp = () => { + setIsPanning(false); + panOriginRef.current = { ...panOffset }; + try { + if (panEndRefreshTimerRef.current) { + clearTimeout(panEndRefreshTimerRef.current); + panEndRefreshTimerRef.current = null; + } + if (panRefreshSkippedRef.current) { + panRefreshSkippedRef.current = false; + mergedRefreshCanvas("pan-mouseup-skipped").finally(() => { + try { + setIsLoading(false); + } catch (e) { } + }); + } + if (pendingPanRefreshRef.current) { + pendingPanRefreshRef.current = false; + mergedRefreshCanvas("pan-mouseup-pending").finally(() => { + try { + setIsLoading(false); + } catch (e) { } + }); + } + } catch (e) { } + }; + document.addEventListener("mouseup", handleMouseUp); + return () => document.removeEventListener("mouseup", handleMouseUp); + }, [panOffset]); + + // Process submission queue to ensure strokes are submitted sequentially + const processSubmissionQueue = async () => { + if (isSubmittingRef.current || submissionQueueRef.current.length === 0) { + return; + } + + isSubmittingRef.current = true; + + while (submissionQueueRef.current.length > 0) { + const submission = submissionQueueRef.current.shift(); + try { + await submission(); + } catch (error) { + console.error("Error processing queued submission:", error); + } + } + + isSubmittingRef.current = false; + + // After processing all queued submissions, schedule a refresh to sync with backend + if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); + refreshTimerRef.current = setTimeout(() => { + mergedRefreshCanvas("post-queue").catch((e) => + console.error("Error during post-queue refresh:", e) + ); + refreshTimerRef.current = null; + }, 500); + }; + + useEffect(() => { + if (!auth?.token || !currentRoomId) return; + try { + setSocketToken(auth.token); + } catch (e) { } + + const socket = getSocket(auth.token); + + try { + socket.emit("join_room", { roomId: currentRoomId, token: auth?.token }); + } catch (e) { + socket.emit("join_room", { roomId: currentRoomId }); + } + + const scheduleRefresh = (delay = 300) => { + try { + if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); + } catch (e) { } + refreshTimerRef.current = setTimeout(() => { + mergedRefreshCanvas().catch((e) => + console.error("Error during scheduled refresh:", e) + ); + refreshTimerRef.current = null; + }, delay); + }; + + const handleNewStroke = (data) => { + try { + const myName = getUsername(auth); + if (data.user === myName) { + // This is confirmation of our own stroke + const stroke = data.stroke; + if (stroke && stroke.drawingId) { + confirmedStrokesRef.current.add(stroke.drawingId); + } + return; + } + } catch (e) { + try { + const user = getAuthUser(auth) || {}; + if (data.user === user.username) { + // This is confirmation of our own stroke + const stroke = data.stroke; + if (stroke && stroke.drawingId) { + confirmedStrokesRef.current.add(stroke.drawingId); + } + return; + } + } catch (e2) { } + } + + const stroke = data.stroke; + + // Extract metadata for advanced features (stamps, brushes, filters) + const metadata = { + brushStyle: stroke.brushStyle, + brushType: stroke.brushType, + brushParams: stroke.brushParams, + drawingType: stroke.drawingType, + stampData: stroke.stampData, + stampSettings: stroke.stampSettings, + filterType: stroke.filterType, + filterParams: stroke.filterParams, + }; + + const drawing = new Drawing( + stroke.drawingId || + `remote_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`, + stroke.color || "#000000", + stroke.lineWidth || 5, + stroke.pathData || [], + stroke.ts || stroke.timestamp || Date.now(), + stroke.user || "Unknown", + metadata + ); + + try { + const clearedAt = roomClearedAtRef.current[currentRoomId]; + if ( + clearedAt && + (drawing.timestamp || drawing.ts || Date.now()) < clearedAt + ) { + return; + } + } catch (e) { } + + setPendingDrawings((prev) => [...prev, drawing]); + + // If this is a custom stamp, add it to the stamp panel + if (drawing.drawingType === "stamp" && drawing.stampData && drawing.stampData.image) { + setBackendStamps((prevStamps) => { + const imageKey = drawing.stampData.image.substring(0, 100); + const alreadyExists = prevStamps.some(s => + s.image && s.image.substring(0, 100) === imageKey + ); + + if (!alreadyExists) { + console.log('Adding new custom stamp from Socket.IO:', drawing.stampData.name || 'Custom Stamp'); + return [...prevStamps, { + id: `stamp-${Date.now()}-${prevStamps.length}`, + name: drawing.stampData.name || 'Custom Stamp', + category: drawing.stampData.category || 'custom', + image: drawing.stampData.image, + emoji: drawing.stampData.emoji + }]; + } + return prevStamps; + }); + } + + // Use requestAnimationFrame for smoother rendering + requestAnimationFrame(() => { + drawAllDrawings(); + }); + + scheduleRefresh(350); + }; + + const handleUserJoined = (data) => { + try { + if (!data) return; + if (data.roomId !== currentRoomId) return; + console.debug("socket user_joined event", data); + if (data.username) { + showLocalSnack(`${data.username} joined the canvas.`); + } + } catch (e) { } + }; + + const handleUserLeft = (data) => { + try { + if (!data) return; + if (data.roomId !== currentRoomId) return; + console.debug("socket user_left event", data); + if (data.username) { + showLocalSnack(`${data.username} left the canvas.`); + } + } catch (e) { } + }; + + const handleStrokeUndone = (data) => { + console.log("Stroke undone event received:", data); + + forceNextRedrawRef.current = true; + lastDrawnStateRef.current = null; + + // Schedule refresh instead of immediate refresh to avoid flicker + if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); + refreshTimerRef.current = setTimeout(() => { + mergedRefreshCanvas("undo-event"); + refreshTimerRef.current = null; + }, 100); + + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + }; + + const handleCanvasCleared = (data) => { + console.log("Canvas cleared event received:", data); + const clearedAt = data && data.clearedAt ? data.clearedAt : Date.now(); + if (currentRoomId) roomClearedAtRef.current[currentRoomId] = clearedAt; + + // Clear local authoritative drawings and pending drawings that predate the clear + try { + userData.clearDrawings(); + } catch (e) { } + setPendingDrawings([]); + serverCountRef.current = 0; + + setUndoStack([]); + setRedoStack([]); + setUndoAvailable(false); + setRedoAvailable(false); + try { + if (currentRoomId) { + roomStacksRef.current[currentRoomId] = { undo: [], redo: [] }; + roomClipboardRef.current[currentRoomId] = null; + } + } catch (e) { } + + clearCanvasForRefresh(); + drawAllDrawings(); + + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + }; + + socket.on("new_stroke", handleNewStroke); + socket.on("stroke_undone", handleStrokeUndone); + socket.on("canvas_cleared", handleCanvasCleared); + socket.on("user_joined", handleUserJoined); + socket.on("user_left", handleUserLeft); + socket.on("user_joined_debug", (d) => { + console.debug("socket user_joined_debug", d); + }); + + return () => { + socket.off("new_stroke", handleNewStroke); + socket.off("stroke_undone", handleStrokeUndone); + socket.off("canvas_cleared", handleCanvasCleared); + socket.off("user_joined", handleUserJoined); + socket.off("user_left", handleUserLeft); + try { + socket.emit("leave_room", { + roomId: currentRoomId, + token: auth?.token, + }); + } catch (e) { + socket.emit("leave_room", { roomId: currentRoomId }); + } + try { + if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); + } catch (e) { } + }; + }, [auth?.token, currentRoomId, auth?.user?.username]); + + useEffect(() => { + (async () => { + try { + setUndoStack([]); + setRedoStack([]); + setUndoAvailable(false); + setRedoAvailable(false); + if (currentRoomId) { + roomStacksRef.current[currentRoomId] = { undo: [], redo: [] }; + } + + // Reset selectedUser tracking when room changes + previousSelectedUserRef.current = null; + isRefreshingSelectedUserRef.current = false; + selectedUserRefreshQueueRef.current = null; + + if (auth?.token && currentRoomId) { + try { + await resetMyStacks(auth.token, currentRoomId); + } catch (e) { } + } + + if (currentRoomId) { + try { + await checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } catch (e) { } + } + } catch (e) { } + })(); + }, [auth?.token, currentRoomId]); + + useEffect(() => { + try { + setUndoStack([]); + setRedoStack([]); + if (currentRoomId) { + roomStacksRef.current[currentRoomId] = { undo: [], redo: [] }; + } + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ).catch(() => { }); + } + } catch (e) { } + }, [auth?.token, currentRoomId]); + + // Force full refresh when selectedUser changes (drawing history selection/deselection) + useEffect(() => { + if (!currentRoomId || !auth?.token) return; + + // Serialize selectedUser for comparison (handles both string and object) + const serializeSelectedUser = (user) => { + if (!user || user === "") return ""; + if (typeof user === "string") return user; + if (typeof user === "object") + return JSON.stringify({ + user: user.user, + periodStart: user.periodStart, + }); + return String(user); + }; + + const currentSerialized = serializeSelectedUser(selectedUser); + const previousSerialized = previousSelectedUserRef.current; + + // Only refresh if selectedUser actually changed + if (currentSerialized === previousSerialized) { + return; + } + + // If a refresh is in progress, queue this change for execution after current one completes + if (isRefreshingSelectedUserRef.current) { + console.debug( + "[selectedUser] Refresh in progress, queuing new selection:", + currentSerialized + ); + selectedUserRefreshQueueRef.current = currentSerialized; + return; + } + + const performRefresh = async (targetSerialized) => { + isRefreshingSelectedUserRef.current = true; + + try { + setIsLoading(true); + + // Update the ref to mark this as the last processed value + previousSelectedUserRef.current = targetSerialized; + + // Force complete refresh from backend + userData.drawings = []; + setPendingDrawings([]); + serverCountRef.current = 0; + lastDrawnStateRef.current = null; + + const isDeselect = !selectedUser || selectedUser === ""; + const logLabel = isDeselect + ? "selectedUser-deselect" + : "selectedUser-select"; + console.debug(`[selectedUser] Performing full refresh: ${logLabel}`, { + to: targetSerialized, + }); + + await clearCanvasForRefresh(); + await mergedRefreshCanvas(logLabel); + await drawAllDrawings(); + } catch (error) { + console.error("Error refreshing on selectedUser change:", error); + } finally { + setIsLoading(false); + isRefreshingSelectedUserRef.current = false; + + // Check if there's a queued refresh waiting + if (selectedUserRefreshQueueRef.current !== null) { + const queuedTarget = selectedUserRefreshQueueRef.current; + selectedUserRefreshQueueRef.current = null; + + // Only process queued refresh if it's different from what we just processed + if (queuedTarget !== targetSerialized) { + console.debug( + "[selectedUser] Processing queued selection:", + queuedTarget + ); + // Use setTimeout to break out of the current call stack + setTimeout(() => performRefresh(queuedTarget), 0); + } + } + } + }; + + // Start the refresh + performRefresh(currentSerialized); + }, [selectedUser, currentRoomId]); + + const clearCanvasForRefresh = async () => { + const canvas = canvasRef.current; + if (!canvas) return; // Guard against null ref during tests + + const context = canvas.getContext("2d"); + if (!context) return; // Guard against null context during tests + + context.clearRect(0, 0, canvasWidth, canvasHeight); + setUserData(initializeUserData()); + setPendingDrawings([]); + serverCountRef.current = 0; + + // Clear selection overlay artifacts + setSelectionRect(null); + setSelectionStart(null); + + // Reset draw mode to freehand if in select mode + if (drawMode === "select") { + setDrawMode("freehand"); + } + }; + + const refreshCanvasButtonHandler = async () => { + if (isRefreshing) return; + setIsRefreshing(true); + setIsLoading(true); + try { + // Force full refresh from backend by clearing local state + userData.drawings = []; + setPendingDrawings([]); + serverCountRef.current = 0; + lastDrawnStateRef.current = null; + + await clearCanvasForRefresh(); + await mergedRefreshCanvas("refresh-button"); + await drawAllDrawings(); + updateFilterState(); // Update filter state after refresh + } catch (error) { + console.error("Error during canvas refresh:", error); + handleAuthError(error); + } finally { + setIsRefreshing(false); + setIsLoading(false); + } + }; + + const initializeUserData = () => { + const uniqueUserId = + auth?.user?.id || + `user_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`; + const username = auth?.user?.username || "MainUser"; + return new UserData(uniqueUserId, username); + }; + const [userData, setUserData] = useState(() => initializeUserData()); + const generateId = () => + `drawing_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`; + const serverCountRef = useRef(0); + + // Helper function to update filter state + const updateFilterState = () => { + // Use setUserData callback to read current state accurately + setUserData((currentUserData) => { + const filterExists = currentUserData.drawings.some((d) => d.drawingType === "filter"); + const filterCount = currentUserData.drawings.filter((d) => d.drawingType === "filter").length; + console.log(`[updateFilterState] filterExists=${filterExists}, filterCount=${filterCount}`); + setHasFilters(filterExists); + return currentUserData; + }); + }; + + // Advanced Brush/Stamp/Filter Functions + const handleBrushSelect = (brushType) => { + console.log("handleBrushSelect called with:", brushType); + setCurrentBrushType(brushType); + brushEngine.setBrushType(brushType); + setDrawMode("freehand"); + console.log("Current brush type set to:", brushType); + }; + + const handleBrushParamsChange = (params) => { + setBrushParams(params); + brushEngine.setBrushParams(params); + }; + + const placeStamp = async (x, y, stamp, settings) => { + const canvas = canvasRef.current; + if (!canvas || !stamp) return; + + const context = canvas.getContext("2d"); + + // Render stamp immediately using proper context management + if (stamp.emoji) { + context.save(); + context.globalAlpha = settings.opacity / 100; + context.translate(x, y); + context.rotate((settings.rotation * Math.PI) / 180); + + const size = settings.size; + context.font = `${size}px serif`; + context.textAlign = "center"; + context.textBaseline = "middle"; + context.fillText(stamp.emoji, 0, 0); + + context.restore(); + } else if (stamp.image) { + // For image stamps, load and render synchronously using async/await + try { + const img = await new Promise((resolve, reject) => { + const image = new Image(); + image.onload = () => resolve(image); + image.onerror = () => reject(new Error("Failed to load image")); + image.src = stamp.image; + }); + + context.save(); + context.globalAlpha = settings.opacity / 100; + context.translate(x, y); + context.rotate((settings.rotation * Math.PI) / 180); + + const size = settings.size; + context.drawImage(img, -size / 2, -size / 2, size, size); + + context.restore(); + } catch (error) { + console.error("Failed to load stamp image:", stamp.image?.substring(0, 100), error); + } + } + + // Create drawing record for stamp + const stampDrawing = new Drawing( + generateId(), + color, + lineWidth, + [{ x, y }], + Date.now(), + currentUser, + { + drawingType: "stamp", + stampData: stamp, + stampSettings: settings, + } + ); + + stampDrawing.roomId = currentRoomId; + + userData.addDrawing(stampDrawing); + setPendingDrawings((prev) => [...prev, stampDrawing]); + + // Add to undo stack + setUndoStack((prev) => [...prev, stampDrawing]); + setRedoStack([]); + + // Use submission queue to ensure stamps are submitted in order + try { + const submitTask = async () => { + try { + console.log("Submitting queued stamp:", { + drawingId: stampDrawing.drawingId, + stampData: stampDrawing.stampData, + }); + + await submitToDatabase( + stampDrawing, + auth, + { roomId: currentRoomId, roomType }, + setUndoAvailable, + setRedoAvailable + ); + + console.log("Stamp submitted successfully:", stampDrawing.drawingId); + + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + } catch (error) { + console.error("Error during queued stamp submission:", error); + setPendingDrawings((prev) => + prev.filter((d) => d.drawingId !== stampDrawing.drawingId) + ); + handleAuthError(error); + showLocalSnack("Failed to save stamp. Please try again."); + } + }; + + submissionQueueRef.current.push(submitTask); + processSubmissionQueue(); + } catch (error) { + console.error("Error preparing stamp submission:", error); + handleAuthError(error); + showLocalSnack("Failed to prepare stamp. Please try again."); + } + }; + + const handleStampSelect = (stamp, settings) => { + setSelectedStamp(stamp); + setStampSettings(settings); + setDrawMode("stamp"); + }; + + const handleStampChange = (stamp, settings) => { + setSelectedStamp(stamp); + setStampSettings(settings); + }; + + const applyFilter = async (filterType, params) => { + if (!canvasRef.current) return; + + // Always cancel preview mode first and clean up state + if (isFilterPreview) { + setIsFilterPreview(false); + } + preFilterCanvasStateRef.current = null; + originalCanvasDataRef.current = null; + + // Check if we already have a filter of this type applied + const existingFilterIndex = userData.drawings.findIndex( + (d) => d.drawingType === "filter" && d.filterType === filterType + ); + + let filterDrawing; + let isReplacement = existingFilterIndex !== -1; + + if (isReplacement) { + const existingFilter = userData.drawings[existingFilterIndex]; + existingFilter.filterParams = { ...params }; // Clone params + existingFilter.timestamp = Date.now(); + filterDrawing = existingFilter; + + // Update React state to reflect the filter parameter change + const newUserData = new UserData(userData.userId, userData.username); + newUserData.drawings = [...userData.drawings]; // Clone the array to trigger state update + setUserData(newUserData); + + // Force a complete redraw with the updated filter parameters + // This will redraw all strokes first, then apply the filter + lastDrawnStateRef.current = null; + forceNextRedrawRef.current = true; + await drawAllDrawings(); + + showLocalSnack(`Updated ${filterType} filter`); + updateFilterState(); + + // For filter updates, we need to submit the UPDATE to backend + // The backend should handle this as an update, not a new drawing + try { + await submitToDatabase( + filterDrawing, + auth, + { + roomId: currentRoomId, + roomType, + }, + setUndoAvailable, + setRedoAvailable + ); + + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + } catch (error) { + console.error("Error submitting filter update:", error); + handleAuthError(error); + } + + return; // Exit early for updates + } + + // Create NEW filter record for new filter type + filterDrawing = new Drawing( + generateId(), + "#000000", + 0, + [], + Date.now(), + currentUser, + { + drawingType: "filter", + filterType, + filterParams: { ...params }, // Clone params + } + ); + + // Set filter properties directly on the drawing object + filterDrawing.drawingType = "filter"; + filterDrawing.filterType = filterType; + filterDrawing.filterParams = { ...params }; + filterDrawing.roomId = currentRoomId; + + userData.addDrawing(filterDrawing); + + // Update React state so components know about the new filter + const newUserData = new UserData(userData.userId, userData.username); + newUserData.drawings = [...userData.drawings]; // Clone array with new filter + setUserData(newUserData); + + setPendingDrawings((prev) => [...prev, filterDrawing]); + + setUndoStack((prev) => [...prev, filterDrawing]); + setRedoStack([]); + + // Force complete redraw this will render all strokes THEN apply filter + lastDrawnStateRef.current = null; + forceNextRedrawRef.current = true; + await drawAllDrawings(); + + showLocalSnack(`Applied ${filterType} filter`); + updateFilterState(); + + try { + await submitToDatabase( + filterDrawing, + auth, + { + roomId: currentRoomId, + roomType, + }, + setUndoAvailable, + setRedoAvailable + ); + + // Check undo/redo availability after filter submission + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + } catch (error) { + console.error("Error submitting filter:", error); + // On error, remove the failed filter from pending + setPendingDrawings((prev) => + prev.filter((d) => d.drawingId !== filterDrawing.drawingId) + ); + handleAuthError(error); + } + }; + + const previewFilter = async (filterType, params) => { + const canvas = canvasRef.current; + if (!canvas) return; + + // If already in preview mode, first restore to base state + if (isFilterPreview && preFilterCanvasStateRef.current) { + const img = new Image(); + img.onload = async () => { + const context = canvas.getContext("2d"); + context.clearRect(0, 0, canvas.width, canvas.height); + context.drawImage(img, 0, 0); + + // Now apply the new preview + await applyPreviewFilter(canvas, filterType, params); + }; + img.src = preFilterCanvasStateRef.current; + return; + } + + // Store the current canvas state before preview (only once) + if (!preFilterCanvasStateRef.current) { + preFilterCanvasStateRef.current = canvas.toDataURL(); + } + + await applyPreviewFilter(canvas, filterType, params); + }; + + const applyPreviewFilter = async (canvas, filterType, params) => { + // Check if this filter type already exists in the drawings + const existingFilterIndex = userData.drawings.findIndex( + (d) => d.drawingType === "filter" && d.filterType === filterType + ); + + if (existingFilterIndex !== -1) { + // Temporarily remove this filter, redraw, then apply preview + const originalDrawings = [...userData.drawings]; + userData.drawings = userData.drawings.filter((d, i) => i !== existingFilterIndex); + + lastDrawnStateRef.current = null; + forceNextRedrawRef.current = true; + await drawAllDrawings(); + + // Restore drawings array + userData.drawings = originalDrawings; + } + + // Apply the preview filter on top of current canvas + const context = canvas.getContext("2d"); + const imageData = context.getImageData(0, 0, canvas.width, canvas.height); + const filteredImageData = applyImageFilter(imageData, filterType, params); + context.putImageData(filteredImageData, 0, 0); + + setIsFilterPreview(true); + }; + + const undoFilter = async () => { + // If in preview mode, restore from saved canvas state + if (isFilterPreview && preFilterCanvasStateRef.current) { + const canvas = canvasRef.current; + if (!canvas) return; + + const context = canvas.getContext("2d"); + const img = new Image(); + img.onload = async () => { + context.clearRect(0, 0, canvas.width, canvas.height); + context.drawImage(img, 0, 0); + setIsFilterPreview(false); + preFilterCanvasStateRef.current = null; + originalCanvasDataRef.current = null; + }; + img.src = preFilterCanvasStateRef.current; + return; + } + + // If not in preview mode, use regular undo (which properly syncs with backend) + if (!editingEnabled) { + showLocalSnack("Undo is disabled in view-only mode."); + return; + } + + if (undoStack.length === 0) { + showLocalSnack("No actions to undo."); + return; + } + + // Simply call the regular undo function, which will undo the last action + // This properly coordinates with the backend's undo system + await undo(); + }; + + const clearAllFilters = async () => { + // Clear preview state if active + if (isFilterPreview) { + setIsFilterPreview(false); + preFilterCanvasStateRef.current = null; + originalCanvasDataRef.current = null; + } + + if (!editingEnabled) { + showLocalSnack("Clear filters is disabled in view-only mode."); + return; + } + + // Find all filter drawings in userData (not just undo stack) + // Use setUserData callback to get the latest state + let filterDrawings = []; + setUserData((currentUserData) => { + const allDrawings = currentUserData.drawings || []; + filterDrawings = allDrawings.filter( + (drawing) => drawing.drawingType === "filter" + ); + console.log(`[clearAllFilters] Found ${filterDrawings.length} filters to clear`, filterDrawings); + return currentUserData; + }); + + if (filterDrawings.length === 0) { + showLocalSnack("No filters to clear."); + return; + } + + if (isRefreshing) { + showLocalSnack("Please wait for the canvas to refresh."); + return; + } + + try { + showLocalSnack(`Clearing ${filterDrawings.length} filter(s)...`); + + // Get filter IDs before removing from local state + const filterIds = filterDrawings.map(f => f.drawingId).filter(id => id); + + // Remove all filter drawings from local state immediately using proper state update + setUserData((currentUserData) => { + const newUserData = new UserData(currentUserData.userId, currentUserData.username); + newUserData.drawings = currentUserData.drawings.filter( + (d) => d.drawingType !== "filter" + ); + console.log(`[clearAllFilters] Removed ${filterDrawings.length} filters, ${newUserData.drawings.length} drawings remain`); + return newUserData; + }); + + // Remove from pendingDrawings + setPendingDrawings((prev) => + prev.filter((d) => d.drawingType !== "filter") + ); + + // Remove from undo stack (if present) + setUndoStack((prev) => + prev.filter((d) => d.drawingType !== "filter") + ); + + // Force a complete redraw immediately to show filters are gone + lastDrawnStateRef.current = null; + forceNextRedrawRef.current = true; + await drawAllDrawings(); + + showLocalSnack(`Cleared ${filterDrawings.length} filter(s).`); + updateFilterState(); // Update filter state for UI + + // Now sync with backend - create undo markers for each filter + if (filterIds.length > 0) { + try { + // Import the API function + const { markStrokesAsUndone } = await import('../api/rooms'); + + try { + await markStrokesAsUndone(auth.token, currentRoomId, filterIds); + console.log(`Marked ${filterIds.length} filters as undone in backend`); + } catch (apiError) { + // If the API doesn't exist, fall back to calling undo multiple times + console.warn("markStrokesAsUndone API not available, using fallback"); + + // Fallback: call regular undo endpoint for each filter + const { undoRoomAction } = await import('../api/rooms'); + for (let i = 0; i < Math.min(filterDrawings.length, 10); i++) { + try { + const result = await undoRoomAction(auth.token, currentRoomId); + if (result.status === "noop") break; + await new Promise(resolve => setTimeout(resolve, 50)); + } catch (e) { + console.warn("Error calling undoRoomAction:", e); + break; + } + } + } + + await checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } catch (e) { + console.error("Error syncing filter removal with backend:", e); + } + } + } catch (error) { + console.error("Error clearing all filters:", error); + showLocalSnack("Failed to clear all filters. Refreshing canvas..."); + // Refresh to restore state + await refreshCanvasButtonHandler(); + } + }; + + const applyImageFilter = (imageData, filterType, params) => { + const data = imageData.data; + const filtered = new ImageData( + new Uint8ClampedArray(data), + imageData.width, + imageData.height + ); + + switch (filterType) { + case "blur": + return applyBlurFilter(filtered, params.intensity || 5); + case "hueShift": + return applyHueShiftFilter( + filtered, + params.hue || 0, + params.saturation || 0 + ); + case "chalk": + return applyChalkFilter( + filtered, + params.roughness || 50, + params.opacity || 80 + ); + case "fade": + return applyFadeFilter(filtered, params.amount || 30); + case "vintage": + return applyVintageFilter( + filtered, + params.sepia || 60, + params.vignette || 40 + ); + case "neon": + return applyNeonFilter( + filtered, + params.intensity || 15, + params.color || 180 + ); + default: + return filtered; + } + }; + + const applyBlurFilter = (imageData, intensity) => { + // Optimized separable box blur - O(n) instead of O(n²) + // This is much faster and won't crash even with higher intensity values + const data = imageData.data; + const width = imageData.width; + const height = imageData.height; + + const radius = Math.max(1, Math.floor(intensity)); + const temp = new Uint8ClampedArray(data); + const result = new Uint8ClampedArray(data); + + // Horizontal pass + for (let y = 0; y < height; y++) { + let r = 0, g = 0, b = 0, a = 0; + let count = 0; + + // Initialize window + for (let x = -radius; x <= radius; x++) { + if (x >= 0 && x < width) { + const idx = (y * width + x) * 4; + r += data[idx]; + g += data[idx + 1]; + b += data[idx + 2]; + a += data[idx + 3]; + count++; + } + } + + // Slide window across row + for (let x = 0; x < width; x++) { + const idx = (y * width + x) * 4; + temp[idx] = r / count; + temp[idx + 1] = g / count; + temp[idx + 2] = b / count; + temp[idx + 3] = a / count; + + // Remove left pixel + const leftX = x - radius; + if (leftX >= 0) { + const leftIdx = (y * width + leftX) * 4; + r -= data[leftIdx]; + g -= data[leftIdx + 1]; + b -= data[leftIdx + 2]; + a -= data[leftIdx + 3]; + count--; + } + + // Add right pixel + const rightX = x + radius + 1; + if (rightX < width) { + const rightIdx = (y * width + rightX) * 4; + r += data[rightIdx]; + g += data[rightIdx + 1]; + b += data[rightIdx + 2]; + a += data[rightIdx + 3]; + count++; + } + } + } + + // Vertical pass + for (let x = 0; x < width; x++) { + let r = 0, g = 0, b = 0, a = 0; + let count = 0; + + // Initialize window + for (let y = -radius; y <= radius; y++) { + if (y >= 0 && y < height) { + const idx = (y * width + x) * 4; + r += temp[idx]; + g += temp[idx + 1]; + b += temp[idx + 2]; + a += temp[idx + 3]; + count++; + } + } + + // Slide window down column + for (let y = 0; y < height; y++) { + const idx = (y * width + x) * 4; + result[idx] = r / count; + result[idx + 1] = g / count; + result[idx + 2] = b / count; + result[idx + 3] = a / count; + + // Remove top pixel + const topY = y - radius; + if (topY >= 0) { + const topIdx = (topY * width + x) * 4; + r -= temp[topIdx]; + g -= temp[topIdx + 1]; + b -= temp[topIdx + 2]; + a -= temp[topIdx + 3]; + count--; + } + + // Add bottom pixel + const bottomY = y + radius + 1; + if (bottomY < height) { + const bottomIdx = (bottomY * width + x) * 4; + r += temp[bottomIdx]; + g += temp[bottomIdx + 1]; + b += temp[bottomIdx + 2]; + a += temp[bottomIdx + 3]; + count++; + } + } + } + + return new ImageData(result, width, height); + }; + + const applyHueShiftFilter = (imageData, hueShift, saturationShift) => { + const data = imageData.data; + + for (let i = 0; i < data.length; i += 4) { + const r = data[i]; + const g = data[i + 1]; + const b = data[i + 2]; + + // Convert RGB to HSL + const max = Math.max(r, g, b) / 255; + const min = Math.min(r, g, b) / 255; + const diff = max - min; + const sum = max + min; + + let h = 0; + const l = sum / 2; + const s = diff === 0 ? 0 : l > 0.5 ? diff / (2 - sum) : diff / sum; + + if (diff !== 0) { + switch (max) { + case r / 255: + h = (g - b) / 255 / diff + (g < b ? 6 : 0); + break; + case g / 255: + h = (b - r) / 255 / diff + 2; + break; + case b / 255: + h = (r - g) / 255 / diff + 4; + break; + } + h /= 6; + } + + // Apply shifts + h = (h + hueShift / 360) % 1; + const newS = Math.max(0, Math.min(1, s + saturationShift / 100)); + + // Convert back to RGB + const hue2rgb = (p, q, t) => { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + + let newR, newG, newB; + + if (newS === 0) { + newR = newG = newB = l; + } else { + const q = l < 0.5 ? l * (1 + newS) : l + newS - l * newS; + const p = 2 * l - q; + newR = hue2rgb(p, q, h + 1 / 3); + newG = hue2rgb(p, q, h); + newB = hue2rgb(p, q, h - 1 / 3); + } + + data[i] = Math.round(newR * 255); + data[i + 1] = Math.round(newG * 255); + data[i + 2] = Math.round(newB * 255); + } + + return imageData; + }; + + const applyChalkFilter = (imageData, roughness, opacity) => { + const data = imageData.data; + + for (let i = 0; i < data.length; i += 4) { + const noise = (Math.random() - 0.5) * (roughness / 100) * 255; + const opacityFactor = opacity / 100; + + data[i] = Math.max(0, Math.min(255, data[i] + noise)) * opacityFactor; + data[i + 1] = + Math.max(0, Math.min(255, data[i + 1] + noise)) * opacityFactor; + data[i + 2] = + Math.max(0, Math.min(255, data[i + 2] + noise)) * opacityFactor; + data[i + 3] = data[i + 3] * opacityFactor; + } + + return imageData; + }; + + const applyFadeFilter = (imageData, amount) => { + const data = imageData.data; + const fadeAmount = 1 - amount / 100; + + for (let i = 0; i < data.length; i += 4) { + data[i + 3] = data[i + 3] * fadeAmount; + } + + return imageData; + }; + + const applyVintageFilter = (imageData, sepia, vignette) => { + const data = imageData.data; + const width = imageData.width; + const height = imageData.height; + const sepiaAmount = sepia / 100; + + for (let i = 0; i < data.length; i += 4) { + const r = data[i]; + const g = data[i + 1]; + const b = data[i + 2]; + + // Apply sepia + data[i] = Math.min( + 255, + (r * 0.393 + g * 0.769 + b * 0.189) * sepiaAmount + + r * (1 - sepiaAmount) + ); + data[i + 1] = Math.min( + 255, + (r * 0.349 + g * 0.686 + b * 0.168) * sepiaAmount + + g * (1 - sepiaAmount) + ); + data[i + 2] = Math.min( + 255, + (r * 0.272 + g * 0.534 + b * 0.131) * sepiaAmount + + b * (1 - sepiaAmount) + ); + + // Apply vignette + const x = (i / 4) % width; + const y = Math.floor(i / 4 / width); + const centerX = width / 2; + const centerY = height / 2; + const distance = Math.sqrt((x - centerX) ** 2 + (y - centerY) ** 2); + const maxDistance = Math.sqrt(centerX ** 2 + centerY ** 2); + const vignetteAmount = 1 - (distance / maxDistance) * (vignette / 100); + + data[i] *= vignetteAmount; + data[i + 1] *= vignetteAmount; + data[i + 2] *= vignetteAmount; + } + + return imageData; + }; + + const applyNeonFilter = (imageData, intensity, hue) => { + const data = imageData.data; + const width = imageData.width; + const height = imageData.height; + const glowIntensity = intensity / 25; // More aggressive scaling (max 50 -> 2.0) + + // Create a copy for the glow effect + const result = new Uint8ClampedArray(data); + + // Generate neon color based on hue using proper HSL to RGB conversion + const hueNormalized = hue / 360; + const neonR = Math.abs(Math.sin((hueNormalized) * Math.PI * 2)) * 255; + const neonG = Math.abs(Math.sin((hueNormalized + 0.333) * Math.PI * 2)) * 255; + const neonB = Math.abs(Math.sin((hueNormalized + 0.666) * Math.PI * 2)) * 255; + + for (let i = 0; i < data.length; i += 4) { + const alpha = data[i + 3]; + + // Only apply effect to visible pixels (any stroke) + if (alpha > 5) { + const r = data[i]; + const g = data[i + 1]; + const b = data[i + 2]; + + // Calculate brightness + const brightness = (r + g + b) / 3; + + // Apply aggressive neon glow with color tinting + const alphaFactor = alpha / 255; + const colorFactor = glowIntensity * alphaFactor; + + // Mix original color with neon color and boost brightness + const boost = 1 + (glowIntensity * 0.8); + result[i] = Math.min(255, (r * boost) + (neonR * colorFactor * 0.7)); + result[i + 1] = Math.min(255, (g * boost) + (neonG * colorFactor * 0.7)); + result[i + 2] = Math.min(255, (b * boost) + (neonB * colorFactor * 0.7)); + + // Ensure the effect is visible even on dark strokes + const minBrightness = 60 * glowIntensity; + const currentBrightness = (result[i] + result[i + 1] + result[i + 2]) / 3; + if (currentBrightness < minBrightness) { + const brightnessFactor = minBrightness / Math.max(currentBrightness, 1); + result[i] = Math.min(255, result[i] * brightnessFactor); + result[i + 1] = Math.min(255, result[i + 1] * brightnessFactor); + result[i + 2] = Math.min(255, result[i + 2] * brightnessFactor); + } + } + } + + return new ImageData(result, width, height); + }; + + const drawAllDrawings = async () => { + const currentTemplateObjects = templateObjectsRef.current || []; + + if (isDrawingInProgressRef.current) { + console.log('Drawing already in progress, skipping drawAllDrawings call'); + return; + } + + isDrawingInProgressRef.current = true; + + // Save current brush state + const savedBrushType = brushEngine ? brushEngine.brushType : null; + const savedBrushParams = brushEngine ? brushEngine.brushParams : null; + + try { + setIsLoading(true); + const canvas = canvasRef.current; + if (!canvas) { + setIsLoading(false); + isDrawingInProgressRef.current = false; + return; + } + const context = canvas.getContext("2d"); + if (!context) { + setIsLoading(false); + isDrawingInProgressRef.current = false; + return; + } + + // Include any locally-pending drawings (e.g. received via socket but + // not yet reflected by a backend refresh) so they render immediately. + const userDrawingIds = new Set((userData.drawings || []).map(d => d.drawingId)); + const uniquePendingDrawings = (pendingDrawings || []).filter( + pd => !userDrawingIds.has(pd.drawingId) + ); + + const combined = [ + ...(userData.drawings || []), + ...uniquePendingDrawings, + ]; + + // Create a state signature to detect if we need to redraw + // Include filter information to ensure redraw when filters change + const filterSignature = combined + .filter(d => d.drawingType === "filter") + .map(f => `${f.drawingId}:${f.filterType}`) + .join(','); + + const stateSignature = JSON.stringify({ + drawingCount: combined.length, + drawingIds: combined.map(d => d.drawingId).sort().join(','), + pendingCount: pendingDrawings.length, + templateCount: currentTemplateObjects?.length || 0, + templateIds: currentTemplateObjects?.map(t => `${t.type}:${t.x || t.x1 || t.cx}:${t.y || t.y1 || t.cy}`).join(',') || '', + filters: filterSignature + }); + + if (lastDrawnStateRef.current === stateSignature) { + console.log('State unchanged, skipping redraw'); + setIsLoading(false); + isDrawingInProgressRef.current = false; + return; + } + + // Clear force flag after checking it + forceNextRedrawRef.current = false; + lastDrawnStateRef.current = stateSignature; + + // for flicker free rendering + if (!offscreenCanvasRef.current || + offscreenCanvasRef.current.width !== canvasWidth || + offscreenCanvasRef.current.height !== canvasHeight + ) { + offscreenCanvasRef.current = document.createElement("canvas"); + offscreenCanvasRef.current.width = canvasWidth; + offscreenCanvasRef.current.height = canvasHeight; + } + + const offscreenContext = offscreenCanvasRef.current.getContext("2d"); + offscreenContext.imageSmoothingEnabled = false; + offscreenContext.clearRect(0, 0, canvasWidth, canvasHeight); + + // This avoids async rendering issues with image stamps + const stampsToRender = []; + + // Create and render template layer separately so it stays below all drawings + let templateCanvas = null; + if (currentTemplateObjects && currentTemplateObjects.length > 0) { + templateCanvas = document.createElement('canvas'); + templateCanvas.width = canvasWidth; + templateCanvas.height = canvasHeight; + const templateContext = templateCanvas.getContext('2d'); + templateContext.imageSmoothingEnabled = false; + + templateContext.save(); + templateContext.globalAlpha = 0.5; + + let renderedCount = 0; + for (const obj of currentTemplateObjects) { + try { + if (obj.type === 'line') { + templateContext.beginPath(); + templateContext.moveTo(obj.x1, obj.y1); + templateContext.lineTo(obj.x2, obj.y2); + templateContext.strokeStyle = obj.color || '#333'; + templateContext.lineWidth = obj.lineWidth || 2; + templateContext.stroke(); + renderedCount++; + } else if (obj.type === 'rectangle') { + templateContext.strokeStyle = obj.stroke || '#333'; + templateContext.lineWidth = obj.lineWidth || 2; + if (obj.fill && obj.fill !== 'transparent') { + templateContext.fillStyle = obj.fill; + templateContext.fillRect(obj.x, obj.y, obj.width, obj.height); + } + templateContext.strokeRect(obj.x, obj.y, obj.width, obj.height); + renderedCount++; + } else if (obj.type === 'circle') { + templateContext.beginPath(); + templateContext.arc(obj.cx, obj.cy, obj.radius, 0, Math.PI * 2); + templateContext.strokeStyle = obj.stroke || '#333'; + templateContext.lineWidth = obj.lineWidth || 2; + if (obj.fill && obj.fill !== 'transparent') { + templateContext.fillStyle = obj.fill; + templateContext.fill(); + } + templateContext.stroke(); + renderedCount++; + } else if (obj.type === 'ellipse') { + templateContext.beginPath(); + templateContext.ellipse(obj.cx, obj.cy, obj.rx, obj.ry, 0, 0, Math.PI * 2); + templateContext.strokeStyle = obj.stroke || '#333'; + templateContext.lineWidth = obj.lineWidth || 2; + if (obj.fill && obj.fill !== 'transparent') { + templateContext.fillStyle = obj.fill; + templateContext.fill(); + } + templateContext.stroke(); + renderedCount++; + } else if (obj.type === 'text') { + templateContext.fillStyle = obj.color || '#333'; + templateContext.font = `${obj.bold ? 'bold ' : ''}${obj.fontSize || 16}px Arial`; + templateContext.fillText(obj.text || '', obj.x, obj.y); + renderedCount++; + } else { + console.warn('Unknown template object type:', obj.type); + } + } catch (e) { + console.warn('Failed to render template object:', obj, e); + } + } + templateContext.restore(); + } else { + console.log('No template objects to render'); + } + + if (templateCanvas) { + offscreenContext.drawImage(templateCanvas, 0, 0); + } + + const cutOriginalIds = new Set(); + try { + combined.forEach((d) => { + if ( + d && + d.pathData && + d.pathData.tool === "cut" && + Array.isArray(d.pathData.originalStrokeIds) + ) { + d.pathData.originalStrokeIds.forEach((id) => + cutOriginalIds.add(id) + ); + } + }); + } catch (e) { } + + const sortedDrawings = combined.sort((a, b) => { + const orderA = + a.order !== undefined ? a.order : a.timestamp || a.ts || 0; + const orderB = + b.order !== undefined ? b.order : b.timestamp || b.ts || 0; + return orderA - orderB; + }); + + // Separate filter drawings from regular drawings + const regularDrawings = []; + const filterDrawings = []; + for (const drawing of sortedDrawings) { + if (drawing.drawingType === "filter") { + filterDrawings.push(drawing); + } else { + regularDrawings.push(drawing); + } + } + + // Pre-load all image stamps to ensure they render in correct z-order + const imageStampCache = new Map(); + const imageStampPromises = []; + + for (const drawing of regularDrawings) { + if (drawing.drawingType === "stamp" && drawing.stampData && drawing.stampData.image && !drawing.stampData.emoji) { + const imageUrl = drawing.stampData.image; + if (!imageStampCache.has(imageUrl)) { + const promise = new Promise((resolve) => { + const img = new Image(); + img.onload = () => { + imageStampCache.set(imageUrl, img); + resolve(); + }; + img.onerror = () => { + console.error("[drawAllDrawings] Failed to pre-load stamp image:", imageUrl.substring(0, 100)); + resolve(); // Continue even if image fails + }; + img.src = imageUrl; + }); + imageStampPromises.push(promise); + } + } + } + + // Wait for all stamp images to load before rendering + if (imageStampPromises.length > 0) { + console.log("[drawAllDrawings] Pre-loading", imageStampPromises.length, "stamp images"); + await Promise.all(imageStampPromises); + console.log("[drawAllDrawings] All stamp images loaded"); + } + + // Render drawings in chronological order. When a 'cut' record appears + // we immediately apply a destination-out erase so it removes prior content + // but does not erase strokes that are drawn after the cut. + const maskedOriginals = new Set(); + let seenAnyCut = false; + + for (const drawing of regularDrawings) { + // If this is a cut record, apply the erase to the canvas now. + if (drawing && drawing.pathData && drawing.pathData.tool === "cut") { + seenAnyCut = true; + try { + if (Array.isArray(drawing.pathData.originalStrokeIds)) { + drawing.pathData.originalStrokeIds.forEach((id) => + maskedOriginals.add(id) + ); + } + } catch (e) { } + + if (drawing.pathData && drawing.pathData.rect) { + const r = drawing.pathData.rect; + offscreenContext.save(); + try { + offscreenContext.globalCompositeOperation = "destination-out"; + offscreenContext.fillStyle = "rgba(0,0,0,1)"; + // Expand rect slightly to avoid hairline due to subpixel antialiasing + offscreenContext.fillRect( + Math.floor(r.x) - 2, + Math.floor(r.y) - 2, + Math.ceil(r.width) + 4, + Math.ceil(r.height) + 4 + ); + } finally { + offscreenContext.restore(); + } + + // Restore template layer in the cut region so templates remain visible + if (templateCanvas) { + offscreenContext.drawImage( + templateCanvas, + Math.floor(r.x) - 2, + Math.floor(r.y) - 2, + Math.ceil(r.width) + 4, + Math.ceil(r.height) + 4, + Math.floor(r.x) - 2, + Math.floor(r.y) - 2, + Math.ceil(r.width) + 4, + Math.ceil(r.height) + 4 + ); + } + } + + continue; + } + + // Skip originals that have been masked by a cut + if ( + drawing && + drawing.drawingId && + (cutOriginalIds.has(drawing.drawingId) || + maskedOriginals.has(drawing.drawingId)) + ) { + continue; + } + + // Skip temporary white "erase" helper strokes when we've seen a cut + // record; destination-out masking is authoritative and drawing white + // strokes can produce hairlines. + try { + if ( + seenAnyCut && + drawing && + drawing.color && + typeof drawing.color === "string" && + drawing.color.toLowerCase() === "#ffffff" + ) { + continue; + } + } catch (e) { } + + // Draw the drawing normally + offscreenContext.globalAlpha = 1.0; + let viewingUser = null; + let viewingPeriodStart = null; + if (selectedUser) { + if (typeof selectedUser === "string") viewingUser = selectedUser; + else if (typeof selectedUser === "object") { + viewingUser = selectedUser.user; + viewingPeriodStart = selectedUser.periodStart; + } + } + if (viewingUser && drawing.user !== viewingUser) { + offscreenContext.globalAlpha = 0.1; + } else if (viewingPeriodStart !== null) { + const ts = drawing.timestamp || drawing.order || 0; + if ( + ts < viewingPeriodStart || + ts >= viewingPeriodStart + 5 * 60 * 1000 + ) { + offscreenContext.globalAlpha = 0.1; + } + } + + // Stamps have pathData as array but need special rendering - render inline to preserve z-order + if (drawing.drawingType === "stamp" && drawing.stampData && drawing.stampSettings && Array.isArray(drawing.pathData) && drawing.pathData.length > 0) { + const stamp = drawing.stampData; + const settings = drawing.stampSettings; + const position = drawing.pathData[0]; + + try { + offscreenContext.save(); + offscreenContext.translate(position.x, position.y); + offscreenContext.rotate(((settings.rotation || 0) * Math.PI) / 180); + + const size = settings.size || 50; + + if (stamp.emoji) { + // Render emoji stamp + offscreenContext.font = `${size}px serif`; + offscreenContext.textAlign = "center"; + offscreenContext.textBaseline = "middle"; + offscreenContext.fillText(stamp.emoji, 0, 0); + console.log("[drawAllDrawings] Rendered emoji stamp inline:", stamp.emoji); + } else if (stamp.image) { + // Render image stamp using pre-loaded image + const img = imageStampCache.get(stamp.image); + if (img) { + offscreenContext.globalAlpha = (settings.opacity || 100) / 100 * offscreenContext.globalAlpha; + offscreenContext.drawImage(img, -size / 2, -size / 2, size, size); + console.log("[drawAllDrawings] Rendered image stamp inline"); + } else { + console.warn("[drawAllDrawings] Image stamp not in cache:", stamp.image?.substring(0, 100)); + } + } + + offscreenContext.restore(); + } catch (error) { + offscreenContext.restore(); + console.error("[drawAllDrawings] Error rendering stamp:", error); + } + } else if (drawing.drawingType === "stamp") { + console.warn("[drawAllDrawings] Stamp NOT rendered - missing requirements:", { + drawingId: drawing.drawingId, + drawingType: drawing.drawingType, + hasStampData: !!drawing.stampData, + hasStampSettings: !!drawing.stampSettings, + pathDataIsArray: Array.isArray(drawing.pathData), + pathDataLength: drawing.pathData ? drawing.pathData.length : 0, + pathDataType: typeof drawing.pathData, + pathDataValue: drawing.pathData, + fullDrawing: drawing + }); + } else if (Array.isArray(drawing.pathData)) { + const pts = drawing.pathData; + if (pts.length > 0) { + // Check if this is an advanced brush drawing + if (drawing.brushType && drawing.brushType !== "normal" && brushEngine) { + console.log("Rendering advanced brush in drawAllDrawings:", { + id: drawing.drawingId, + brushType: drawing.brushType, + pointCount: pts.length + }); + + // Use brush engine to render advanced brush strokes + offscreenContext.save(); + brushEngine.updateContext(offscreenContext); + + // Start the stroke at the first point + offscreenContext.beginPath(); + offscreenContext.moveTo(pts[0].x, pts[0].y); + + // Render the stroke using the brush engine with explicit brush type + brushEngine.startStroke(pts[0].x, pts[0].y); + for (let i = 1; i < pts.length; i++) { + // Use drawWithType instead of draw to bypass state dependency + brushEngine.drawWithType( + pts[i].x, + pts[i].y, + drawing.lineWidth, + drawing.color, + drawing.brushType // Pass brush type directly + ); + } + offscreenContext.restore(); + } else { + if (drawing.brushType && drawing.brushType !== "normal") { + console.log("Advanced brush found but no brushEngine:", { + id: drawing.drawingId, + brushType: drawing.brushType, + hasBrushEngine: !!brushEngine + }); + } + // Default rendering for normal brush + offscreenContext.beginPath(); + offscreenContext.moveTo(pts[0].x, pts[0].y); + for (let i = 1; i < pts.length; i++) + offscreenContext.lineTo(pts[i].x, pts[i].y); + offscreenContext.strokeStyle = drawing.color; + offscreenContext.lineWidth = drawing.lineWidth; + offscreenContext.lineCap = drawing.brushStyle || "round"; + offscreenContext.lineJoin = drawing.brushStyle || "round"; + offscreenContext.stroke(); + } + } + } else if (drawing.pathData && drawing.pathData.tool === "shape") { + if (drawing.pathData.points) { + const pts = drawing.pathData.points; + offscreenContext.save(); + offscreenContext.beginPath(); + offscreenContext.moveTo(pts[0].x, pts[0].y); + for (let i = 1; i < pts.length; i++) + offscreenContext.lineTo(pts[i].x, pts[i].y); + offscreenContext.closePath(); + offscreenContext.fillStyle = drawing.color; + offscreenContext.fill(); + offscreenContext.restore(); + } else { + const { + type, + start, + end, + brushStyle: storedBrush, + } = drawing.pathData; + offscreenContext.save(); + offscreenContext.fillStyle = drawing.color; + offscreenContext.lineWidth = drawing.lineWidth; + if (type === "circle") { + const radius = Math.sqrt( + (end.x - start.x) ** 2 + (end.y - start.y) ** 2 + ); + offscreenContext.beginPath(); + offscreenContext.arc(start.x, start.y, radius, 0, Math.PI * 2); + offscreenContext.fill(); + } else if (type === "rectangle") { + offscreenContext.fillRect( + start.x, + start.y, + end.x - start.x, + end.y - start.y + ); + } else if (type === "hexagon") { + const radius = Math.sqrt( + (end.x - start.x) ** 2 + (end.y - start.y) ** 2 + ); + offscreenContext.beginPath(); + for (let i = 0; i < 6; i++) { + const angle = (Math.PI / 3) * i; + const xPoint = start.x + radius * Math.cos(angle); + const yPoint = start.y + radius * Math.sin(angle); + if (i === 0) offscreenContext.moveTo(xPoint, yPoint); + else offscreenContext.lineTo(xPoint, yPoint); + } + offscreenContext.closePath(); + offscreenContext.fill(); + } else if (type === "line") { + offscreenContext.beginPath(); + offscreenContext.moveTo(start.x, start.y); + offscreenContext.lineTo(end.x, end.y); + offscreenContext.strokeStyle = drawing.color; + offscreenContext.lineWidth = drawing.lineWidth; + const cap = storedBrush || drawing.brushStyle || "round"; + offscreenContext.lineCap = cap; + offscreenContext.lineJoin = cap; + offscreenContext.stroke(); + } + offscreenContext.restore(); + } + } else if (drawing.pathData && drawing.pathData.tool === "image") { + const { image, x, y, width, height } = drawing.pathData; + let img = new Image(); + img.src = image; + img.onload = () => { + offscreenContext.drawImage(img, x, y, width, height); + }; + } + } + if (!selectedUser) { + // Group users by 5-minute intervals + // Use both committed drawings and pending drawings so the UI's + // user/time-group list reflects the strokes the user currently sees. + const groupMap = {}; + const groupingSource = [ + ...(userData.drawings || []), + ...(pendingDrawings || []), + ]; + groupingSource.forEach((d) => { + try { + const ts = d.timestamp || d.order || 0; + const periodStart = + Math.floor(ts / (5 * 60 * 1000)) * (5 * 60 * 1000); + if (!groupMap[periodStart]) groupMap[periodStart] = new Set(); + if (d.user) groupMap[periodStart].add(d.user); + } catch (e) { } + }); + const groups = Object.keys(groupMap).map((k) => ({ + periodStart: parseInt(k), + users: Array.from(groupMap[k]), + })); + groups.sort((a, b) => b.periodStart - a.periodStart); + if (selectedUser && selectedUser !== "") { + let stillExists = false; + if (typeof selectedUser === "string") { + for (const g of groups) { + if (g.users.includes(selectedUser)) { + stillExists = true; + break; + } + } + } else if (typeof selectedUser === "object" && selectedUser.user) { + for (const g of groups) { + if ( + g.periodStart === selectedUser.periodStart && + g.users.includes(selectedUser.user) + ) { + stillExists = true; + break; + } + } + } + + if (!stillExists) { + try { + setSelectedUser(""); + } catch (e) { + /* swallow if setter changed */ + } + } + } + + setUserList(groups); + } + + // Apply filters as post-processing after all regular drawings are rendered + if (filterDrawings.length > 0) { + console.log("[drawAllDrawings] Applying", filterDrawings.length, "filter(s)"); + for (const filterDrawing of filterDrawings) { + try { + if (filterDrawing.filterType && filterDrawing.filterParams) { + const imageData = offscreenContext.getImageData(0, 0, canvasWidth, canvasHeight); + const filteredImageData = applyImageFilter( + imageData, + filterDrawing.filterType, + filterDrawing.filterParams + ); + offscreenContext.putImageData(filteredImageData, 0, 0); + console.log("[drawAllDrawings] Applied filter:", filterDrawing.filterType); + } + } catch (e) { + console.error("[drawAllDrawings] Error applying filter:", filterDrawing.filterType, e); + } + } + } + + // Copy offscreen canvas to visible canvas atomically + console.log("[drawAllDrawings] Copying offscreen canvas to visible canvas. Total strokes rendered:", regularDrawings.length, "filters:", filterDrawings.length); + context.imageSmoothingEnabled = false; + context.clearRect(0, 0, canvasWidth, canvasHeight); + context.drawImage(offscreenCanvasRef.current, 0, 0); + console.log("[drawAllDrawings] Canvas update complete"); + } catch (e) { + console.error("Error in drawAllDrawings:", e); + } finally { + // Restore current brush state + if (brushEngine && savedBrushType) { + brushEngine.setBrushType(savedBrushType); + if (savedBrushParams) { + brushEngine.setBrushParams(savedBrushParams); + } + } + setIsLoading(false); + isDrawingInProgressRef.current = false; + } + }; + + drawAllDrawingsRef.current = drawAllDrawings; + + const undo = async () => { + if (!editingEnabled) { + showLocalSnack("Undo is disabled in view-only mode."); + return; + } + if (undoStack.length === 0) return; + if (isRefreshing) { + showLocalSnack( + "Please wait for the canvas to refresh before undoing again." + ); + return; + } + try { + await undoAction({ + auth, + currentUser: auth?.username || "anonymous", + undoStack, + setUndoStack, + setRedoStack, + userData, + drawAllDrawings, + refreshCanvasButtonHandler: refreshCanvasButtonHandler, + roomId: currentRoomId, + }); + // After undo completes, refresh undo/redo availability from server + try { + await checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } catch (e) { } + updateFilterState(); // Update filter state after undo + } catch (error) { + console.error("Error during undo:", error); + } + }; + + const redo = async () => { + if (!editingEnabled) { + showLocalSnack("Redo is disabled in view-only mode."); + return; + } + if (redoStack.length === 0) return; + if (isRefreshing) { + showLocalSnack( + "Please wait for the canvas to refresh before redoing again." + ); + return; + } + try { + await redoAction({ + auth, + currentUser: auth?.username || "anonymous", + redoStack, + setRedoStack, + setUndoStack, + userData, + drawAllDrawings, + refreshCanvasButtonHandler: refreshCanvasButtonHandler, + roomId: currentRoomId, + }); + // After redo completes, refresh undo/redo availability from server + try { + await checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } catch (e) { } + updateFilterState(); // Update filter state after redo + } catch (error) { + console.error("Error during redo:", error); + } + }; + + // Register keyboard shortcuts and commands + useEffect(() => { + // Initialize shortcut manager + if (!shortcutManagerRef.current) { + shortcutManagerRef.current = new KeyboardShortcutManager(); + } + + const manager = shortcutManagerRef.current; + + // Register all commands with the command registry + const commands = [ + // Command Palette & Help + { + id: 'commands.palette', + label: 'Open Command Palette', + description: 'Quick access to all commands', + keywords: ['palette', 'search', 'find'], + category: 'Commands', + action: () => setCommandPaletteOpen(true), + shortcut: { key: 'k', modifiers: { ctrl: true } } + }, + { + id: 'commands.shortcuts', + label: 'Show Keyboard Shortcuts', + description: 'View all available keyboard shortcuts', + keywords: ['help', 'shortcuts', 'keys'], + category: 'Commands', + action: () => setShortcutsHelpOpen(true), + shortcut: { key: '/', modifiers: { ctrl: true } } + }, + { + id: 'commands.cancel', + label: 'Cancel / Escape', + description: 'Cancel current action or close dialogs', + keywords: ['cancel', 'escape', 'close'], + category: 'Commands', + action: () => { + if (commandPaletteOpen) setCommandPaletteOpen(false); + else if (shortcutsHelpOpen) setShortcutsHelpOpen(false); + else if (drawing) setDrawing(false); + }, + shortcut: { key: 'Escape', modifiers: {} } + }, + + // Edit Operations + { + id: 'edit.undo', + label: 'Undo', + description: 'Undo the last action', + keywords: ['undo', 'revert'], + category: 'Edit', + action: undo, + shortcut: { key: 'z', modifiers: { ctrl: true } }, + enabled: () => editingEnabled && undoStack.length > 0 + }, + { + id: 'edit.redo', + label: 'Redo', + description: 'Redo the last undone action', + keywords: ['redo', 'repeat'], + category: 'Edit', + action: redo, + shortcut: { key: 'z', modifiers: { ctrl: true, shift: true } }, + enabled: () => editingEnabled && redoStack.length > 0 + }, + + // Canvas Operations + { + id: 'canvas.clear', + label: 'Clear Canvas', + description: 'Remove all strokes from canvas', + keywords: ['clear', 'delete', 'reset'], + category: 'Canvas', + action: () => { + if (editingEnabled) { + setClearDialogOpen(true); + } else { + showLocalSnack('Canvas clearing is disabled in view-only mode'); + } + }, + shortcut: { key: 'k', modifiers: { ctrl: true, shift: true } }, + enabled: () => editingEnabled + }, + { + id: 'canvas.refresh', + label: 'Refresh Canvas', + description: 'Reload canvas from server', + keywords: ['refresh', 'reload'], + category: 'Canvas', + action: refreshCanvasButtonHandler, + shortcut: { key: 'r', modifiers: { ctrl: true } } + }, + { + id: 'canvas.settings', + label: 'Canvas Settings', + description: 'Open canvas settings', + keywords: ['settings', 'preferences'], + category: 'Canvas', + action: () => { + if (onOpenSettings) onOpenSettings(); + }, + shortcut: { key: ',', modifiers: { ctrl: true } }, + visible: () => !!onOpenSettings + }, + + // Tools + { + id: 'tool.pen', + label: 'Select Pen Tool', + description: 'Switch to freehand drawing', + keywords: ['pen', 'draw', 'brush'], + category: 'Tools', + action: () => { + if (editingEnabled) { + setDrawMode('freehand'); + showLocalSnack('Pen tool selected'); + } + }, + shortcut: { key: 'p', modifiers: {} }, + enabled: () => editingEnabled + }, + { + id: 'tool.eraser', + label: 'Select Eraser', + description: 'Switch to eraser mode', + keywords: ['eraser', 'erase', 'remove'], + category: 'Tools', + action: () => { + if (editingEnabled) { + setDrawMode('eraser'); + showLocalSnack('Eraser selected'); + } + }, + shortcut: { key: 'e', modifiers: {} }, + enabled: () => editingEnabled + }, + { + id: 'tool.rectangle', + label: 'Select Rectangle Tool', + description: 'Draw rectangles and squares', + keywords: ['rectangle', 'rect', 'square'], + category: 'Tools', + action: () => { + if (editingEnabled) { + setDrawMode('shape'); + setShapeType('rectangle'); + showLocalSnack('Rectangle tool selected'); + } + }, + shortcut: { key: 'r', modifiers: {} }, + enabled: () => editingEnabled + }, + { + id: 'tool.circle', + label: 'Select Circle Tool', + description: 'Draw circles and ellipses', + keywords: ['circle', 'oval', 'ellipse'], + category: 'Tools', + action: () => { + if (editingEnabled) { + setDrawMode('shape'); + setShapeType('circle'); + showLocalSnack('Circle tool selected'); + } + }, + shortcut: { key: 'c', modifiers: {} }, + enabled: () => editingEnabled + }, + { + id: 'tool.line', + label: 'Select Line Tool', + description: 'Draw straight lines', + keywords: ['line', 'straight'], + category: 'Tools', + action: () => { + if (editingEnabled) { + setDrawMode('shape'); + setShapeType('line'); + showLocalSnack('Line tool selected'); + } + }, + shortcut: { key: 'l', modifiers: {} }, + enabled: () => editingEnabled + } + ]; + + // Register commands with command registry + // Clear first to ensure clean state + commandRegistry.clear(); + + // Register each command (allowOverwrite for React re-renders) + commands.forEach(cmd => { + commandRegistry.register(cmd, { allowOverwrite: true }); + }); + + // Register keyboard shortcuts + manager.clear(); + commands.forEach(cmd => { + if (cmd.shortcut) { + manager.register( + cmd.shortcut.key, + cmd.shortcut.modifiers, + () => { + // Check if command is enabled before executing + if (cmd.enabled && !cmd.enabled()) { + return; + } + cmd.action(); + }, + cmd.label, + cmd.category + ); + } + }); + + // Add global keyboard event listener + const handleKeyDown = (event) => manager.handleKeyDown(event); + document.addEventListener('keydown', handleKeyDown); + + // Cleanup + return () => { + document.removeEventListener('keydown', handleKeyDown); + manager.clear(); + }; + }, [ + editingEnabled, + undoStack, + redoStack, + undo, + redo, + refreshCanvasButtonHandler, + onOpenSettings, + commandPaletteOpen, + shortcutsHelpOpen, + drawing + ]); + + const { + selectionStart, + setSelectionStart, + selectionRect, + setSelectionRect, + cutImageData, + setCutImageData, + handleCutSelection, + } = useCanvasSelection( + canvasRef, + currentUser, + userData, + generateId, + drawAllDrawings, + currentRoomId, + setUndoAvailable, + setRedoAvailable, + auth, + roomType, + showLocalSnack + ); + + // AI Assist functions + const { + textToDrawing, + textToImage, + shapeCompletion, + beautifySketch, + aiAssistLoading + } = useAIAssistant(); + + // Draw a preview of a shape (for shape mode) + const drawShapePreview = (start, end, shape, color, lineWidth) => { + if (!start || !end) return; + + const canvas = canvasRef.current; + const context = canvas.getContext("2d"); + context.save(); + context.strokeStyle = color; + context.lineWidth = lineWidth; + context.setLineDash([5, 3]); + + if (shape === "circle") { + const radius = Math.sqrt((end.x - start.x) ** 2 + (end.y - start.y) ** 2); + context.beginPath(); + context.arc(start.x, start.y, radius, 0, Math.PI * 2); + context.stroke(); + } else if (shape === "rectangle") { + context.strokeRect(start.x, start.y, end.x - start.x, end.y - start.y); + } else if (shape === "hexagon") { + const radius = Math.sqrt((end.x - start.x) ** 2 + (end.y - start.y) ** 2); + context.beginPath(); + + for (let i = 0; i < 6; i++) { + const angle = (Math.PI / 3) * i; + const xPoint = start.x + radius * Math.cos(angle); + const yPoint = start.y + radius * Math.sin(angle); + + if (i === 0) context.moveTo(xPoint, yPoint); + else context.lineTo(xPoint, yPoint); + } + context.closePath(); + context.stroke(); + } else if (shape === "line") { + context.beginPath(); + context.moveTo(start.x, start.y); + context.lineTo(end.x, end.y); + context.lineCap = brushStyle; + context.lineJoin = brushStyle; + context.stroke(); + } + + context.restore(); + }; + + // Handle paste action for cut selection + const handlePaste = async (e) => { + if (!editingEnabled) { + showLocalSnack("Editing is disabled in view-only mode."); + setDrawMode("freehand"); + return; + } + if ( + !cutImageData || + !Array.isArray(cutImageData) || + cutImageData.length === 0 + ) { + showLocalSnack("No cut selection available to paste."); + setDrawMode("freehand"); + return; + } + + const canvas = canvasRef.current; + const rectCanvas = canvas.getBoundingClientRect(); + const scaleX = canvas.width / rectCanvas.width; + const scaleY = canvas.height / rectCanvas.height; + const pasteX = (e.clientX - rectCanvas.left) * scaleX; + const pasteY = (e.clientY - rectCanvas.top) * scaleY; + + let minX = Infinity, + minY = Infinity; + + cutImageData.forEach((drawing) => { + if (Array.isArray(drawing.pathData)) { + drawing.pathData.forEach((pt) => { + minX = Math.min(minX, pt.x); + minY = Math.min(minY, pt.y); + }); + } else if (drawing.pathData && drawing.pathData.tool === "shape") { + if (drawing.pathData.points && Array.isArray(drawing.pathData.points)) { + drawing.pathData.points.forEach((pt) => { + minX = Math.min(minX, pt.x); + minY = Math.min(minY, pt.y); + }); + } else if (drawing.pathData.type === "line") { + if (drawing.pathData.start) { + minX = Math.min(minX, drawing.pathData.start.x); + minY = Math.min(minY, drawing.pathData.start.y); + } + if (drawing.pathData.end) { + minX = Math.min(minX, drawing.pathData.end.x); + minY = Math.min(minY, drawing.pathData.end.y); + } + } + } + }); + + if (minX === Infinity || minY === Infinity) { + showLocalSnack("Invalid cut data."); + return; + } + + const offsetX = pasteX - minX; + const offsetY = pasteY - minY; + let pastedDrawings = []; + + const newDrawings = cutImageData + .map((originalDrawing) => { + let newPathData; + if (Array.isArray(originalDrawing.pathData)) { + newPathData = originalDrawing.pathData.map((pt) => ({ + x: pt.x + offsetX, + y: pt.y + offsetY, + })); + } else if ( + originalDrawing.pathData && + originalDrawing.pathData.tool === "shape" + ) { + if ( + originalDrawing.pathData.points && + Array.isArray(originalDrawing.pathData.points) + ) { + const newPoints = originalDrawing.pathData.points.map((pt) => ({ + x: pt.x + offsetX, + y: pt.y + offsetY, + })); + newPathData = { ...originalDrawing.pathData, points: newPoints }; + } else if (originalDrawing.pathData.type === "line") { + const newStart = { + x: originalDrawing.pathData.start.x + offsetX, + y: originalDrawing.pathData.start.y + offsetY, + }; + const newEnd = { + x: originalDrawing.pathData.end.x + offsetX, + y: originalDrawing.pathData.end.y + offsetY, + }; + newPathData = { + ...originalDrawing.pathData, + start: newStart, + end: newEnd, + }; + } + } else { + return null; + } + + // Preserve all metadata from original drawing + const metadata = { + brushStyle: originalDrawing.brushStyle, + brushType: originalDrawing.brushType, + brushParams: originalDrawing.brushParams, + drawingType: originalDrawing.drawingType, + stampData: originalDrawing.stampData, + stampSettings: originalDrawing.stampSettings, + filterType: originalDrawing.filterType, + filterParams: originalDrawing.filterParams, + }; + + return new Drawing( + generateId(), + originalDrawing.color, + originalDrawing.lineWidth, + newPathData, + Date.now(), + currentUser, + metadata + ); + }) + .filter(Boolean); + + setIsRefreshing(true); + setRedoStack([]); + + const pasteRecordId = generateId(); + showLocalSnack(`Pasting ${newDrawings.length} item(s)... Please wait.`); + console.log("[handlePaste] Starting paste operation:", { + pasteRecordId, + drawingCount: newDrawings.length, + drawingTypes: newDrawings.map(d => d.drawingType || "stroke") + }); + + // Attach parentPasteId to each new drawing so the backend/read path can filter them + for (const nd of newDrawings) { + nd.roomId = currentRoomId; + nd.parentPasteId = pasteRecordId; + if (!nd.pathData) nd.pathData = {}; + nd.pathData.parentPasteId = pasteRecordId; + } + console.log("[handlePaste] Attached parentPasteId to all drawings:", pasteRecordId); + + // Submit all pasted drawings as replacement/child strokes but DO NOT add each to the undo stack + let submittedCount = 0; + for (const newDrawing of newDrawings) { + try { + userData.addDrawing(newDrawing); + + await submitToDatabase( + newDrawing, + auth, + { roomId: currentRoomId, roomType, skipUndoStack: true }, + setUndoAvailable, + setRedoAvailable + ); + pastedDrawings.push(newDrawing); + submittedCount++; + + showLocalSnack(`Pasting... ${submittedCount}/${newDrawings.length} items saved.`); + } catch (error) { + console.error("Failed to save drawing:", newDrawing, error); + handleAuthError(error); + } + } + + const pastedIds = pastedDrawings.map((d) => d.drawingId); + const pasteRecord = new Drawing( + pasteRecordId, + "#FFFFFF", + 1, + { tool: "paste", cut: false, pastedDrawingIds: pastedIds }, + Date.now(), + currentUser + ); + console.log("[handlePaste] Created paste record:", { + pasteRecordId, + pastedCount: pastedIds.length, + pastedIds: pastedIds.join(',') + }); + try { + // Submit the single paste-record (counts as one backend undo operation) + await submitToDatabase( + pasteRecord, + auth, + { roomId: currentRoomId, roomType }, + setUndoAvailable, + setRedoAvailable + ); + console.log("[handlePaste] Paste record submitted successfully"); + setUndoStack((prev) => [ + ...prev, + { type: "paste", pastedDrawings: pastedDrawings, backendCount: 1 }, + ]); + } catch (error) { + console.error("Failed to save paste record:", pasteRecord, error); + showLocalSnack("Paste failed to persist. Some strokes may be missing."); + } + + setIsRefreshing(false); + + // Update undo/redo availability after paste operations + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + + tempPathRef.current = []; + if (pastedDrawings.length === newDrawings.length) { + drawAllDrawings(); + setCutImageData([]); + setDrawMode("freehand"); + showLocalSnack(`Paste completed! ${pastedDrawings.length} item(s) pasted successfully.`); + } else { + showLocalSnack(`Paste partially completed. ${pastedDrawings.length}/${newDrawings.length} items pasted.`); + } + }; + + const mergedRefreshCanvas = async (sourceLabel = undefined) => { + try { + if (sourceLabel) { + console.log('mergedRefreshCanvas called from:', sourceLabel, '==='); + console.debug('mergedRefreshCanvas called from:', sourceLabel); + } else { + console.log('mergedRefreshCanvas called (no label) ==='); + console.debug('mergedRefreshCanvas called'); + } + } catch (e) { } + // If currently panning, defer refresh until pan ends to avoid races and frequent backend calls. + try { + if (isPanning) { + console.debug( + "[mergedRefreshCanvas] deferring because isPanning=true, marking pendingPanRefreshRef" + ); + pendingPanRefreshRef.current = true; + return; + } + } catch (e) { } + + if (sourceLabel === "undo-event" || sourceLabel === "redo-event") { + console.log("[mergedRefreshCanvas] Forcing complete state reset for undo/redo"); + lastDrawnStateRef.current = null; + } + + setIsLoading(true); + const backendCount = await backendRefreshCanvas( + serverCountRef.current, + userData, + drawAllDrawings, + historyRange ? historyRange.start : undefined, + historyRange ? historyRange.end : undefined, + { + roomId: currentRoomId, + auth, + clearLastDrawnState: () => { + console.log("[mergedRefreshCanvas] Clearing lastDrawnStateRef to force redraw"); + lastDrawnStateRef.current = null; + } + } + ); + + const pendingSnapshot = [...pendingDrawings]; + + // Don't clear all pending drawings, only mark confirmed ones for removal + + serverCountRef.current = backendCount; + // Re-append any pending drawings that the backend didn't return. + const drawingMatches = (a, b) => { + if (!a || !b) return false; + if (a.drawingId && b.drawingId && a.drawingId === b.drawingId) + return true; + + try { + const sameUser = a.user === b.user; + const tsA = a.timestamp || a.ts || 0; + const tsB = b.timestamp || b.ts || 0; + const tsClose = Math.abs(tsA - tsB) < 1000; + const lenA = Array.isArray(a.pathData) + ? a.pathData.length + : a.pathData && a.pathData.points + ? a.pathData.points.length + : 0; + const lenB = Array.isArray(b.pathData) + ? b.pathData.length + : b.pathData && b.pathData.points + ? b.pathData.points.length + : 0; + const lenClose = Math.abs(lenA - lenB) <= 1; + return sameUser && tsClose && lenClose; + } catch (e) { + return false; + } + }; + + try { + const cutOriginalIds = new Set(); + (userData.drawings || []).forEach((d) => { + if ( + d.pathData && + d.pathData.tool === "cut" && + Array.isArray(d.pathData.originalStrokeIds) + ) { + d.pathData.originalStrokeIds.forEach((id) => cutOriginalIds.add(id)); + } + }); + + if (cutOriginalIds.size > 0) { + userData.drawings = (userData.drawings || []).filter( + (d) => !cutOriginalIds.has(d.drawingId) + ); + } + } catch (e) { + // best-effort + } + + // Re-append pending drawings that the backend didn't return, but + // skip any pending items older than the authoritative clearedAt timestamp + const clearedAt = currentRoomId + ? roomClearedAtRef.current[currentRoomId] + : null; + const stillPending = []; + + pendingSnapshot.forEach((pd) => { + try { + const pdTs = pd.timestamp || pd.ts || 0; + if (clearedAt && pdTs < clearedAt) { + // This pending drawing was created before a server clear; ignore it + return; + } + } catch (e) { } + + const exists = userData.drawings.find((d) => drawingMatches(d, pd)); + if (!exists) { + // Backend doesn't have it yet, keep it pending + userData.drawings.push(pd); + stillPending.push(pd); + } else { + // If pending drawing has stampData but backend version doesn't, use pending version + if (pd.drawingType === "stamp" && pd.stampData) { + const backendMatch = exists; + if (!backendMatch.stampData || !backendMatch.stampData.image && pd.stampData.image) { + console.warn("Backend stamp missing stampData, using pending version:", { + drawingId: pd.drawingId, + pendingHasStampData: !!pd.stampData, + backendHasStampData: !!backendMatch.stampData, + pendingImageLength: pd.stampData.image ? pd.stampData.image.length : 0, + backendImageLength: backendMatch.stampData && backendMatch.stampData.image ? backendMatch.stampData.image.length : 0 + }); + + // Replace backend version with pending version that has complete data + const idx = userData.drawings.findIndex((d) => drawingMatches(d, pd)); + if (idx !== -1) { + userData.drawings[idx] = pd; + } + } + } + + // Backend has it, mark as confirmed and remove from pending + if (pd.drawingId) { + confirmedStrokesRef.current.add(pd.drawingId); + } + } + }); + + // Update pending drawings to only include those still not confirmed by backend + setPendingDrawings(stillPending); + + // CRITICAL: Deduplicate filters - only keep the LATEST of each filter type + // This prevents stacking when backend returns duplicates + const filtersByType = new Map(); + const nonFilterDrawings = []; + + (userData.drawings || []).forEach((drawing) => { + if (drawing.drawingType === "filter" && drawing.filterType) { + const existing = filtersByType.get(drawing.filterType); + // Keep the one with the latest timestamp + if (!existing || (drawing.timestamp || 0) > (existing.timestamp || 0)) { + filtersByType.set(drawing.filterType, drawing); + } + } else { + nonFilterDrawings.push(drawing); + } + }); + + // Rebuild drawings array with deduplicated filters + const deduplicatedDrawings = [ + ...nonFilterDrawings, + ...Array.from(filtersByType.values()) + ]; + + console.log(`[mergedRefreshCanvas] Deduplicated filters. Filter count: ${filtersByType.size}, Total drawings: ${deduplicatedDrawings.length}`); + + // CRITICAL: Update both the mutable userData object AND React state + // Update userData in place so the closure reference works + userData.drawings = deduplicatedDrawings; + + // Also update React state to trigger re-renders + const newUserData = new UserData(userData.userId, userData.username); + newUserData.drawings = deduplicatedDrawings; + setUserData(newUserData); + + // Extract custom stamps from all drawings and update stamp panel + extractCustomStamps(); + + // Use requestAnimationFrame for smoother rendering + requestAnimationFrame(() => { + drawAllDrawings(); + setIsLoading(false); + updateFilterState(); // Update filter state after loading drawings + }); + }; + + // Extract custom stamps from backend drawings and update StampPanel + const extractCustomStamps = () => { + try { + const customStamps = []; + const seenStamps = new Map(); // Deduplicate by image content or emoji + + (userData.drawings || []).forEach((drawing) => { + if (drawing.drawingType === "stamp" && drawing.stampData) { + const stamp = drawing.stampData; + + // Skip default emoji stamps (they're already in StampPanel) + if (stamp.emoji && !stamp.image) { + return; + } + + // For custom image stamps, create a unique key based on image content + if (stamp.image) { + const imageKey = stamp.image.substring(0, 100); // Use first 100 chars as key + + if (!seenStamps.has(imageKey)) { + seenStamps.set(imageKey, true); + customStamps.push({ + id: `stamp-${Date.now()}-${customStamps.length}`, + name: stamp.name || 'Custom Stamp', + category: stamp.category || 'custom', + image: stamp.image, + emoji: stamp.emoji + }); + } + } + } + }); + + if (customStamps.length > 0) { + console.log('Extracted custom stamps from backend:', customStamps.length); + setBackendStamps(customStamps); + } + } catch (error) { + console.error('Error extracting custom stamps:', error); + } + }; + + const startDrawingHandler = (e) => { + const canvas = canvasRef.current; + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + + if (e.button === 1) { + // Middle mouse button: start panning + setIsPanning(true); + panStartRef.current = { x: e.clientX, y: e.clientY }; + panOriginRef.current = { ...panOffset }; + setIsLoading(true); + // Throttle pan-triggered refreshes: if we recently refreshed, defer until pan end + try { + const now = Date.now(); + const diff = now - panLastRefreshRef.current; + console.debug( + `[pan] now=${now} lastRefresh=${panLastRefreshRef.current} diff=${diff} cooldown=${PAN_REFRESH_COOLDOWN_MS}` + ); + if (diff > PAN_REFRESH_COOLDOWN_MS) { + panLastRefreshRef.current = now; + console.debug("[pan] triggering immediate mergedRefreshCanvas"); + mergedRefreshCanvas("pan-start").finally(() => setIsLoading(false)); + } else { + // Mark that we skipped the immediate refresh and schedule a deferred refresh on mouseup + panRefreshSkippedRef.current = true; + console.debug( + "[pan] skipped immediate refresh; scheduling deferred refresh on mouseup" + ); + if (panEndRefreshTimerRef.current) + clearTimeout(panEndRefreshTimerRef.current); + panEndRefreshTimerRef.current = setTimeout(() => { + if (panRefreshSkippedRef.current) { + panRefreshSkippedRef.current = false; + panLastRefreshRef.current = Date.now(); + console.debug("[pan] deferred timer firing mergedRefreshCanvas"); + mergedRefreshCanvas("pan-deferred").finally(() => + setIsLoading(false) + ); + } + panEndRefreshTimerRef.current = null; + }, Math.max(200, PAN_REFRESH_COOLDOWN_MS - diff)); + setIsLoading(false); + } + } catch (e) { + mergedRefreshCanvas().finally(() => setIsLoading(false)); + } + return; + } + + if (!editingEnabled) return; + + if (drawMode === "eraser" || drawMode === "freehand") { + const context = canvas.getContext("2d"); + context.strokeStyle = color; + context.lineWidth = lineWidth; + context.lineCap = brushStyle; + context.lineJoin = brushStyle; + + // Initialize brush engine for advanced brushes + if (brushEngine) { + brushEngine.updateContext(context); + brushEngine.startStroke(x, y); + + // For normal brush, we still need the standard path setup + if (currentBrushType === "normal") { + context.beginPath(); + context.moveTo(x, y); + } + } else { + // Fallback if no brush engine + context.beginPath(); + context.moveTo(x, y); + } + + tempPathRef.current = [{ x, y }]; + setDrawing(true); + } else if (drawMode === "shape") { + setShapeStart({ x, y }); + setDrawing(true); + + const dataURL = canvas.toDataURL(); + let snapshotImg = new Image(); + + snapshotImg.src = dataURL; + snapshotRef.current = snapshotImg; + } else if (drawMode === "select") { + setSelectionStart({ x, y }); + setSelectionRect(null); + setDrawing(true); + + const dataURL = canvas.toDataURL(); + let snapshotImg = new Image(); + + snapshotImg.src = dataURL; + snapshotRef.current = snapshotImg; + } else if (drawMode === "paste") { + handlePaste(e); + } else if (drawMode === "stamp") { + // Start stamp preview on mousedown (will place on mouseup) + if (selectedStamp && stampSettings) { + setStampPreview({ x, y, stamp: selectedStamp, settings: stampSettings }); + stampPreviewRef.current = { x, y, stamp: selectedStamp, settings: stampSettings }; + setDrawing(true); // Enable dragging + } + } + }; + + const handlePan = (e) => { + if (!isPanning) return; + + // If the middle button is no longer pressed, stop panning. + if (!(e.buttons & 4)) { + setIsPanning(false); + panOriginRef.current = { ...panOffset }; + return; + } + + const deltaX = e.clientX - panStartRef.current.x; + const deltaY = e.clientY - panStartRef.current.y; + let newX = panOriginRef.current.x + deltaX; + let newY = panOriginRef.current.y + deltaY; + const containerWidth = window.innerWidth; + const containerHeight = window.innerHeight; + + // Calculate minimum allowed offsets so that the canvas edge is not exceeded. + // Our canvas is fixed at canvasWidth and canvasHeight. + const minX = containerWidth - canvasWidth; // This will be negative if canvasWidth > containerWidth + const minY = containerHeight - canvasHeight; + + newX = clamp(newX, minX, 0); + newY = clamp(newY, minY, 0); + + setPanOffset({ + x: newX, + y: newY, + }); + }; + + const drawHandler = (e) => { + if (isPanning) { + handlePan(e); + return; + } + if (!editingEnabled) return; // prevent drawing but allow other handlers like panning to proceed + if (!drawing) return; + + const canvas = canvasRef.current; + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + + console.log( + "Drawing with brush type:", + currentBrushType, + "drawMode:", + drawMode + ); + + // Update stamp preview position during drag + if (drawMode === "stamp" && stampPreviewRef.current) { + setStampPreview({ ...stampPreviewRef.current, x, y }); + stampPreviewRef.current = { ...stampPreviewRef.current, x, y }; + return; + } + + if (drawMode === "eraser" || drawMode === "freehand") { + const context = canvas.getContext("2d"); + + // Use advanced brush engine if available + if (brushEngine && currentBrushType !== "normal") { + console.log("Drawing with advanced brush engine:", currentBrushType); + // Ensure context is up to date + brushEngine.updateContext(context); + + // Ensure brush engine has current state + if (brushEngine.brushType !== currentBrushType) { + brushEngine.setBrushType(currentBrushType); + } + if ( + JSON.stringify(brushEngine.brushParams) !== + JSON.stringify(brushParams) + ) { + brushEngine.setBrushParams(brushParams); + } + + brushEngine.draw(x, y, lineWidth, color); + } else { + console.log("Drawing with normal brush"); + // Default drawing behavior + context.lineTo(x, y); + context.stroke(); + context.beginPath(); + context.moveTo(x, y); + } + + tempPathRef.current.push({ x, y }); + } else if (drawMode === "shape" && drawing) { + // update shape preview with adjusted coordinates + if (snapshotRef.current && snapshotRef.current.complete) { + const context = canvas.getContext("2d"); + context.clearRect(0, 0, canvasWidth, canvasHeight); + context.drawImage(snapshotRef.current, 0, 0); + } + + drawShapePreview(shapeStart, { x, y }, shapeType, color, lineWidth); + } else if (drawMode === "select" && drawing) { + setSelectionRect({ start: selectionStart, end: { x, y } }); + + if (snapshotRef.current && snapshotRef.current.complete) { + const context = canvas.getContext("2d"); + context.clearRect(0, 0, canvasWidth, canvasHeight); + context.drawImage(snapshotRef.current, 0, 0); + } + + const context = canvas.getContext("2d"); + context.save(); + context.strokeStyle = "blue"; + context.lineWidth = 1; + context.setLineDash([6, 3]); + + const s = selectionStart; + const selX = Math.min(s.x, x); + const selY = Math.min(s.y, y); + const selWidth = Math.abs(x - s.x); + const selHeight = Math.abs(y - s.y); + + context.strokeRect(selX, selY, selWidth, selHeight); + context.restore(); + } + }; + + const stopDrawingHandler = async (e) => { + if (isPanning && e.button === 1) { + setIsPanning(false); + return; + } + if (!drawing) return; + setDrawing(false); + + if (!editingEnabled) { + tempPathRef.current = []; + return; + } + + snapshotRef.current = null; + const canvas = canvasRef.current; + const rect = canvas.getBoundingClientRect(); + const finalX = e.clientX - rect.left; + const finalY = e.clientY - rect.top; + + if (drawMode === "eraser" || drawMode === "freehand") { + const newDrawing = new Drawing( + `drawing_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, + color, + lineWidth, + tempPathRef.current, + Date.now(), + currentUser, + { + brushStyle: brushStyle, + brushType: currentBrushType, + brushParams: brushParams, + drawingType: "stroke", + } + ); + newDrawing.roomId = currentRoomId; + newDrawing.brushType = currentBrushType; + newDrawing.brushParams = brushParams; + + setUndoStack((prev) => [...prev, newDrawing]); + setRedoStack([]); + + try { + userData.addDrawing(newDrawing); + // Add to pending drawings for immediate display (optimistic UI) + setPendingDrawings((prev) => [...prev, newDrawing]); + + // Use requestAnimationFrame for immediate, smooth redraw + requestAnimationFrame(() => { + drawAllDrawings(); + }); + + // Queue the submission instead of submitting immediately + const submitTask = async () => { + try { + console.log("Submitting queued stroke:", { + drawingId: newDrawing.drawingId, + pathLength: tempPathRef.current.length, + }); + + await submitToDatabase( + newDrawing, + auth, + { + roomId: currentRoomId, + roomType, + }, + setUndoAvailable, + setRedoAvailable + ); + + // Don't remove from pending here - let mergedRefreshCanvas or socket confirmation handle it + + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + } catch (error) { + console.error("Error during queued freehand submission:", error); + // On error, remove the failed stroke from pending + setPendingDrawings((prev) => + prev.filter((d) => d.drawingId !== newDrawing.drawingId) + ); + handleAuthError(error); + } + }; + + submissionQueueRef.current.push(submitTask); + processSubmissionQueue(); + } catch (error) { + console.error("Error preparing freehand stroke:", error); + handleAuthError(error); + } finally { + setIsRefreshing(false); + } + tempPathRef.current = []; + + // If shape completion mode is ON, ask for a suggestion + if (shapeCompletionEnabled) { + handleShapeAutoCompletion(); + } + } else if (drawMode === "shape") { + if (!shapeStart) { + return; + } + + const finalEnd = { x: finalX, y: finalY }; + const context = canvas.getContext("2d"); + + context.save(); + context.fillStyle = color; + context.lineWidth = lineWidth; + context.setLineDash([]); + if (shapeType === "circle") { + const radius = Math.sqrt( + (finalEnd.x - shapeStart.x) ** 2 + (finalEnd.y - shapeStart.y) ** 2 + ); + + context.beginPath(); + context.arc(shapeStart.x, shapeStart.y, radius, 0, Math.PI * 2); + context.fill(); + } else if (shapeType === "rectangle") { + context.fillRect( + shapeStart.x, + shapeStart.y, + finalEnd.x - shapeStart.x, + finalEnd.y - shapeStart.y + ); + } else if (shapeType === "hexagon") { + const radius = Math.sqrt( + (finalEnd.x - shapeStart.x) ** 2 + (finalEnd.y - shapeStart.y) ** 2 + ); + context.beginPath(); + for (let i = 0; i < 6; i++) { + const angle = (Math.PI / 3) * i; + const xPoint = shapeStart.x + radius * Math.cos(angle); + const yPoint = shapeStart.y + radius * Math.sin(angle); + + if (i === 0) context.moveTo(xPoint, yPoint); + else context.lineTo(xPoint, yPoint); + } + + context.closePath(); + context.fill(); + } else if (shapeType === "line") { + context.beginPath(); + context.moveTo(shapeStart.x, shapeStart.y); + context.lineTo(finalEnd.x, finalEnd.y); + context.strokeStyle = color; + context.lineWidth = lineWidth; + context.lineCap = brushStyle; + context.lineJoin = brushStyle; + context.stroke(); + } + context.restore(); + + const shapeDrawingData = { + tool: "shape", + type: shapeType, + start: shapeStart, + end: finalEnd, + brushStyle: shapeType === "line" ? brushStyle : undefined, + }; + + const newDrawing = new Drawing( + `drawing_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, + color, + lineWidth, + shapeDrawingData, + Date.now(), + currentUser, + { + brushStyle: shapeType === "line" ? brushStyle : "round", + brushType: currentBrushType, + brushParams: brushParams, + drawingType: "shape", + } + ); + newDrawing.roomId = currentRoomId; + + userData.addDrawing(newDrawing); + setPendingDrawings((prev) => [...prev, newDrawing]); + + // Use requestAnimationFrame for smooth shape rendering + requestAnimationFrame(() => { + drawAllDrawings(); + }); + + setUndoStack((prev) => [...prev, newDrawing]); + setRedoStack([]); + + // Queue the submission + const submitTask = async () => { + try { + await submitToDatabase( + newDrawing, + auth, + { + roomId: currentRoomId, + roomType, + }, + setUndoAvailable, + setRedoAvailable + ); + + // Don't remove from pending here - let mergedRefreshCanvas or socket confirmation handle it + + // Update undo/redo availability after shape submission + if (currentRoomId) { + checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } + } catch (error) { + console.error("Error during queued shape submission:", error); + // On error, remove the failed stroke from pending + setPendingDrawings((prev) => + prev.filter((d) => d.drawingId !== newDrawing.drawingId) + ); + handleAuthError(error); + } + }; + + submissionQueueRef.current.push(submitTask); + processSubmissionQueue(); + + setShapeStart(null); + } else if (drawMode === "select") { + setDrawing(false); + + try { + await mergedRefreshCanvas(); + } catch (error) { + console.error("Error during select submission or refresh:", error); + } finally { + setIsRefreshing(false); + } + + mergedRefreshCanvas(); + } else if (drawMode === "stamp" && stampPreviewRef.current) { + // Place stamp at final position on mouseup + const { x, y, stamp, settings } = stampPreviewRef.current; + await placeStamp(x, y, stamp, settings); + + // Clear preview + setStampPreview(null); + stampPreviewRef.current = null; + } + }; + + const openHistoryDialog = () => { + setSelectedUser(""); + setHistoryDialogOpen(true); + }; + + const handleApplyHistory = async (startMs, endMs) => { + // startMs and endMs are epoch ms. If not provided, read from inputs. + const start = + startMs !== undefined + ? startMs + : historyStartInput + ? new Date(historyStartInput).getTime() + : NaN; + const end = + endMs !== undefined + ? endMs + : historyEndInput + ? new Date(historyEndInput).getTime() + : NaN; + + if (isNaN(start) || isNaN(end)) { + showLocalSnack( + "Please select both start and end date/time before applying History Recall." + ); + return; + } + if (start > end) { + showLocalSnack("Invalid time range selected. Make sure start <= end."); + return; + } + + // Deselect any selected user when entering history recall + setSelectedUser(""); + setHistoryRange({ start, end }); + setIsLoading(true); + + // Try to load drawings for the requested time range + await clearCanvasForRefresh(); + // set a temporary historyRange so mergedRefreshCanvas will use it + setHistoryRange({ start, end }); + try { + const backendCount = await backendRefreshCanvas( + serverCountRef.current, + userData, + drawAllDrawings, + start, + end, + { roomId: currentRoomId, auth } + ); + serverCountRef.current = backendCount; + // If no drawings loaded, inform user and rollback historyRange + if (!userData.drawings || userData.drawings.length === 0) { + setHistoryRange(null); + showLocalSnack( + "No drawings were found in that date/time range. Please select another range or exit history recall mode." + ); + return; + } + setHistoryMode(true); + setHistoryDialogOpen(false); + } catch (e) { + console.error("Error applying history range:", e); + setHistoryRange(null); + showLocalSnack( + "An error occurred while loading history. See console for details." + ); + } finally { + setIsLoading(false); + } + }; + + // Auto-refresh when the active room changes + useEffect(() => { + // wipe local cache so we don't flash previous room's strokes + userData.drawings = []; + setIsRefreshing(true); + + // clear what's on screen immediately + try { + if (canvasRef.current) { + const ctx = canvasRef.current.getContext("2d"); + if (ctx) { + ctx.clearRect( + 0, + 0, + canvasRef.current.width, + canvasRef.current.height + ); + } + drawAllDrawings(); + } + } catch { } + + // reload for the new room + (async () => { + try { + await mergedRefreshCanvas(); // already room-aware + } finally { + setIsRefreshing(false); + } + })(); + }, [currentRoomId, canvasRefreshTrigger]); + + const exitHistoryMode = async () => { + // Deselect any selected user when leaving history mode + setSelectedUser(""); + setHistoryMode(false); + setHistoryRange(null); + setIsLoading(true); + try { + await clearCanvasForRefresh(); + serverCountRef.current = await backendRefreshCanvas( + serverCountRef.current, + userData, + drawAllDrawings, + undefined, + undefined, + { roomId: currentRoomId, auth } + ); + } finally { + setIsLoading(false); + } + }; + + const clearCanvas = async () => { + if (!editingEnabled) { + showLocalSnack("Cannot clear canvas in view-only mode."); + return; + } + const canvas = canvasRef.current; + const context = canvas.getContext("2d"); + + context.clearRect(0, 0, canvasWidth, canvasHeight); + + setUserData(initializeUserData()); + setUndoStack([]); + setRedoStack([]); + setPendingDrawings([]); + serverCountRef.current = 0; + }; + + const handleExportCanvas = async () => { + if (!currentRoomId) { + showLocalSnack("Cannot export: not in a room"); + return; + } + + try { + setIsLoading(true); + showLocalSnack("Exporting canvas data..."); + + const { exportRoomCanvas } = await import('../api/rooms'); + console.log('[Export] Calling API with roomId:', currentRoomId); + console.log('[Export] Auth token present:', !!auth?.token); + + const exportData = await exportRoomCanvas(auth?.token, currentRoomId); + + console.log('[Export] Received exportData:', { + exists: !!exportData, + type: typeof exportData, + keys: exportData ? Object.keys(exportData) : [], + hasStrokes: exportData ? !!exportData.strokes : false, + strokeCount: exportData ? exportData.strokeCount : 'N/A' + }); + + if (!exportData) { + console.error('[Export] exportData is null or undefined'); + showLocalSnack("Export failed: no data returned from server"); + return; + } + + if (!exportData.strokes) { + console.error('[Export] exportData.strokes is missing:', exportData); + showLocalSnack(`Export failed: no strokes in response (got ${exportData.strokeCount || 0} count)`); + return; + } + + // Create a downloadable JSON file + const dataStr = JSON.stringify(exportData, null, 2); + const dataBlob = new Blob([dataStr], { type: 'application/json' }); + const url = URL.createObjectURL(dataBlob); + const link = document.createElement('a'); + link.href = url; + link.download = `${exportData.roomName || 'canvas'}_export_${Date.now()}.json`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + showLocalSnack(`Exported ${exportData.strokeCount} strokes successfully`); + console.log('[Export] Success - downloaded file'); + } catch (error) { + console.error("[Export] Error caught:", error); + console.error("[Export] Error stack:", error.stack); + showLocalSnack(`Export failed: ${error.message || 'Unknown error'}`); + } finally { + setIsLoading(false); + } + }; + + const handleImportCanvas = async () => { + if (!currentRoomId) { + showLocalSnack("Cannot import: not in a room"); + return; + } + + if (!editingEnabled) { + showLocalSnack("Cannot import in view-only mode"); + return; + } + + // Create a file input element + const input = document.createElement('input'); + input.type = 'file'; + input.accept = 'application/json,.json'; + + input.onchange = async (e) => { + const file = e.target.files[0]; + if (!file) return; + + try { + setIsLoading(true); + showLocalSnack("Reading import file..."); + + const text = await file.text(); + const importData = JSON.parse(text); + + if (!importData.strokes || !Array.isArray(importData.strokes)) { + showLocalSnack("Invalid import file: missing strokes array"); + return; + } + + // Ask user if they want to clear existing canvas + const clearExisting = window.confirm( + `Import ${importData.strokes.length} strokes?\n\n` + + `Click OK to replace current canvas, or Cancel to merge with existing drawings.` + ); + + showLocalSnack(`Importing ${importData.strokes.length} strokes...`); + + const { importRoomCanvas } = await import('../api/rooms'); + const result = await importRoomCanvas(auth?.token, currentRoomId, importData, clearExisting); + + if (result.status === 'success') { + showLocalSnack( + `Import complete: ${result.imported} imported, ${result.failed} failed`, + 6000 + ); + + // Refresh canvas to show imported data + setTimeout(async () => { + try { + await clearCanvasForRefresh(); + await mergedRefreshCanvas("post-import"); + } catch (error) { + console.error("Error refreshing after import:", error); + } + }, 500); + } else { + showLocalSnack(`Import failed: ${result.message || 'Unknown error'}`); + } + } catch (error) { + console.error("Import error:", error); + showLocalSnack(`Import failed: ${error.message || 'Invalid file format'}`); + } finally { + setIsLoading(false); + } + }; + + input.click(); + }; + + const toggleColorPicker = (event) => { + const viewportHeight = window.innerHeight; + const pickerHeight = 350; + const rect = event.target.getBoundingClientRect(); + const pickerElement = document.querySelector(".Canvas-color-picker"); + + setShowColorPicker(!showColorPicker); + + if (rect.bottom + pickerHeight > viewportHeight && pickerElement) { + pickerElement.classList.add("Canvas-color-picker--adjust-bottom"); + } else if (pickerElement) { + pickerElement.classList.remove("Canvas-color-picker--adjust-bottom"); + } + }; + + const closeColorPicker = () => { + setShowColorPicker(false); + }; + + useEffect(() => { + setIsRefreshing(true); + clearCanvasForRefresh(); + + mergedRefreshCanvas().then(() => { + setTimeout(() => { + setIsRefreshing(false); + }, 500); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedUser]); + + useEffect(() => { + setUndoAvailable(undoStack.length > 0); + setRedoAvailable(redoStack.length > 0); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [undoStack, redoStack]); + + // Add AI-generated objects to canvas and backend + const addAIGeneratedObjects = async (objects) => { + if (!Array.isArray(objects) || objects.length === 0) { + console.log("Skipping 0..."); + return; + } + + const created = []; + + for (const obj of objects) { + const newDrawing = new Drawing( + generateId(), + obj.color || '#000000', + obj.lineWidth ?? 2, + obj.pathData, + Date.now(), + currentUser + ); + newDrawing.roomId = currentRoomId; + + console.log("New drawing: ", newDrawing); + + userData.addDrawing(newDrawing); + setPendingDrawings(prev => [...prev, newDrawing]); + created.push(newDrawing); + + // enqueue backend save; use skipUndoStack to avoid 1 undo per object (optional) + submissionQueueRef.current.push(async () => { + try {3 + await submitToDatabase( + newDrawing, + auth, + { roomId: currentRoomId, roomType, skipUndoStack: true }, + setUndoAvailable, + setRedoAvailable + ); + if (currentRoomId) { + checkUndoRedoAvailability(auth, setUndoAvailable, setRedoAvailable, currentRoomId); + } + } catch (e) { + console.error("AI object save failed:", e); + setPendingDrawings(prev => prev.filter(d => d.drawingId !== newDrawing.drawingId)); + handleAuthError(e); + } + }); + } + + // force a repaint now (avoid “State unchanged” cache) + lastDrawnStateRef.current = null; + requestAnimationFrame(() => { drawAllDrawings(); }); + processSubmissionQueue(); + + setRedoStack([]); + }; + + function getVisibleCanvasBounds(padding=50) { + const canvas = canvasRef.current; + if (!canvas) return null; + + const rect = canvas.getBoundingClientRect(); + const vx0 = 0, vy0 = 0; + const vx1 = window.innerWidth; + const vy1 = window.innerHeight; + + const ix0 = Math.max(rect.left, vx0); + const iy0 = Math.max(rect.top, vy0); + const ix1 = Math.min(rect.right, vx1); + const iy1 = Math.min(rect.bottom,vy1); + + if (ix1 <= ix0 || iy1 <= iy0) return { x: 0, y: 0, width: 0, height: 0 }; + + const scaleX = canvas.width / rect.width; + const scaleY = canvas.height / rect.height; + + // Convert intersection to canvas space + const x = (ix0 - rect.left) * scaleX; + const y = (iy0 - rect.top) * scaleY; + const width = (ix1 - ix0) * scaleX; + const height = (iy1 - iy0) * scaleY; + + // Apply inner padding — shrink region equally from all sides + const padX = padding * scaleX; + const padY = padding * scaleY; + + const paddedX = Math.max(0, x + padX); + const paddedY = Math.max(0, y + padY); + const paddedWidth = Math.max(0, width - padX * 2); + const paddedHeight = Math.max(0, height - padY * 2); + + return { + x: Math.floor(paddedX), + y: Math.floor(paddedY), + width: Math.floor(Math.min(canvas.width - paddedX, paddedWidth)), + height: Math.floor(Math.min(canvas.height - paddedY, paddedHeight)), + }; + } + + const handlePromptInputSubmition = async (prompt) => { + if (aiGenerateService === 'drawing') { + const canvasBounds = getVisibleCanvasBounds(); + const canvasState = { + drawings: [...userData.drawings, ...pendingDrawings], + bounds: { + width: (canvasBounds?.width || canvasWidth), + height: (canvasBounds?.height || canvasHeight) + }, + }; + + const resp = await textToDrawing(prompt, canvasState); + const payload = typeof resp === 'string' ? JSON.parse(resp) : resp; + + console.log(resp); + + if (payload && Array.isArray(payload.objects)) { + await addAIGeneratedObjects(payload.objects); + showLocalSnack("AI objects rendered to canvas."); + } else { + showLocalSnack("An error occured while generating the sketch."); + } + } + }; + + const handleShapeAutoCompletion = async () => { + if (!editingEnabled) { + showLocalSnack("Shape completion is disabled in view-only mode."); + return; + } + + try { + const canvasBounds = getVisibleCanvasBounds(); + const canvasState = { + drawings: [...userData.drawings, ...pendingDrawings], + bounds: { + width: (canvasBounds?.width || canvasWidth), + height: (canvasBounds?.height || canvasHeight) + }, + }; + const suggestion = await shapeCompletion(canvasState); + if (!suggestion || suggestion.error || !suggestion.object) { + showLocalSnack("AI could not infer a shape."); + return; + } + + const { pathData } = suggestion.object || {}; + const anchor = computeSuggestionAnchor(pathData, canvasWidth, canvasHeight); + + setShapeSuggestion(suggestion); + setShapeAnchor(anchor); + } catch (e) { + console.error("Shape completion error:", e); + showLocalSnack("Unexpected error during shape completion."); + } + }; + + const handleShapeCompletionToggle = (enabled) => { + setShapeCompletionEnabled(enabled); + if (!enabled) { + setShapeSuggestion(null); + setShapeAnchor(null); + } + }; + + function computeSuggestionAnchor(pathData, canvasWidth, canvasHeight) { + if (!pathData) { + return { x: canvasWidth / 2, y: canvasHeight / 2 }; + } + + // Polygon: average of bounding box + if (Array.isArray(pathData.points) && pathData.points.length > 0) { + let minX = pathData.points[0].x; + let maxX = pathData.points[0].x; + let minY = pathData.points[0].y; + let maxY = pathData.points[0].y; + + for (const p of pathData.points) { + minX = Math.min(minX, p.x); + maxX = Math.max(maxX, p.x); + minY = Math.min(minY, p.y); + maxY = Math.max(maxY, p.y); + } + + return { + x: (minX + maxX) / 2, + y: (minY + maxY) / 2, + }; + } + + // Circle/rectangle/line: center between start / end + if (pathData.start && pathData.end) { + return { + x: (pathData.start.x + pathData.end.x) / 2, + y: (pathData.start.y + pathData.end.y) / 2, + }; + } + + // Fallback + return { x: canvasWidth / 2, y: canvasHeight / 2 }; + } + +const acceptShapeSuggestion = async () => { + if (!shapeSuggestion?.object) return; + + await addAIGeneratedObjects([shapeSuggestion.object]); + + // Clear overlay + setShapeSuggestion(null); + setShapeAnchor(null); +}; + + const rejectShapeSuggestion = () => { + setShapeSuggestion(null); + setShapeAnchor(null); + }; + + const buildCanvasStateForAI = () => { + const canvas = canvasRef.current; + const width = canvas?.width || 1000; + const height = canvas?.height || 1000; + + // Use regular drawings only (exclude filters, etc.) + const allDrawings = [ + ...(userData?.drawings || []), + ...(pendingDrawings || []), + ].filter((d) => d.drawingType !== "filter"); + + const objects = allDrawings.map((d) => ({ + id: d.drawingId, + color: d.color, + lineWidth: d.lineWidth, + pathData: d.pathData, + brushType: d.brushType, + brushStyle: d.brushStyle, + drawingType: d.drawWithType, + })); + + return { width, height, objects }; + }; + + const handleBeautifyCanvas = async (level = "medium") => { + if (!userData) return; + if (aiAssistLoading) return; + + if (!editingEnabled) { + showLocalSnack("Editing is disabled in view-only mode."); + return; + } + + try { + const canvasState = buildCanvasStateForAI(); + const result = await beautifySketch(canvasState, level); + + if (!result || !Array.isArray(result.objects) || result.objects.length === 0) { + showLocalSnack("Beautify failed. Please try again."); + return; + } + + const beautifiedObjects = result.objects; + + // Clear the canvas + local state + await clearCanvasForRefresh(); + + // Add the beautified objects using the existing AI helper + await addAIGeneratedObjects(beautifiedObjects); + + // Track this as an undoable action locally + setUndoStack((prev) => [...prev, { type: "beautify", ts: Date.now() }]); + setRedoStack([]); + + showLocalSnack("Sketch beautified"); + } catch (err) { + console.error("[Beautify] Error:", err); + showLocalSnack("Beautify failed. Please try again."); + } + }; + + + const [showToolbar, setShowToolbar] = useState(true); + const [hoverToolbar, setHoverToolbar] = useState(false); + + return ( +
+ {/* Top header: room name + optional history range + exit button */} + + + {currentRoomName || "Master (not in a room)"} + + + {historyMode && historyRange && ( + + {new Date(historyRange.start).toLocaleString()} —{" "} + {new Date(historyRange.end).toLocaleString()} + + )} + + {currentRoomId && ( + + )} + + + {/* Archived overlay banner - visible when viewOnly (archived or explicit viewer) */} + {viewOnly && ( + + + + Archived — View Only + + {/* Owner-only destructive delete button placed under the banner */} + {isOwner && ( + + + + )} + + + )} + + {/* Wallet disconnected banner - visible when secure room wallet is not connected */} + {roomType === "secure" && !walletConnected && ( + + + + ⚠ Wallet Not Connected — Canvas Locked + + + + )} + + {/* Confirm Destructive Delete dialog (owner-only) */} + { + setConfirmDestructiveOpen(false); + setDestructiveConfirmText(""); + }} + > + Permanently delete room + + + This will permanently delete this room and all its data for every + user. This action is irreversible. + + + To confirm, type DELETE below. + + setDestructiveConfirmText(e.target.value)} + placeholder="Type DELETE to confirm" + sx={{ mt: 1 }} + /> + + + + + + + + + + {/* Stamp preview overlay */} + {stampPreview && ( + + {stampPreview.stamp.emoji ? ( + + {stampPreview.stamp.emoji} + + ) : stampPreview.stamp.image ? ( + Stamp preview + ) : null} + + )} + + setHoverToolbar(true)} + onMouseLeave={() => setHoverToolbar(false)} + > + setShowToolbar((v) => !v)} + sx={{ + position: "absolute", + right: showToolbar ? 0 : -20, + top: "50%", + transform: "translateY(-50%)", + + width: 20, + height: 60, + display: "flex", + alignItems: "center", + justifyContent: "center", + + opacity: hoverToolbar ? 1 : 0, + transition: "opacity 0.2s", + bgcolor: "rgba(0,0,0,0.2)", + cursor: "pointer", + zIndex: 1001, + }} + > + + {showToolbar ? ( + + ) : ( + + )} + + + { + if (!editingEnabled) { + showLocalSnack("Cut is disabled in view-only mode."); + return; + } + showLocalSnack("Cutting selection... This may take a moment."); + try { + const result = await handleCutSelection(); + if (result && result.compositeCutAction) { + setUndoStack((prev) => [...prev, result.compositeCutAction]); + } + setIsRefreshing(true); + showLocalSnack("Syncing cut operation..."); + try { + await mergedRefreshCanvas(); + showLocalSnack("Cut completed successfully!"); + } catch (e) { + console.error("Error syncing cut with server:", e); + showLocalSnack("Cut completed, but sync failed. Try refreshing."); + } finally { + setIsRefreshing(false); + } + } catch (e) { + console.error("Error during cut:", e); + showLocalSnack("Cut operation failed. Please try again."); + } + }} + cutImageData={cutImageData} + setClearDialogOpen={setClearDialogOpen} + /* Export/Import handlers */ + handleExportCanvas={handleExportCanvas} + handleImportCanvas={handleImportCanvas} + /* Advanced brush/stamp/filter props */ + currentBrushType={currentBrushType} + onBrushSelect={handleBrushSelect} + onBrushParamsChange={handleBrushParamsChange} + selectedStamp={selectedStamp} + onStampSelect={handleStampSelect} + onStampChange={handleStampChange} + backendStamps={backendStamps} + onFilterApply={applyFilter} + onFilterPreview={previewFilter} + onFilterUndo={undoFilter} + onClearAllFilters={clearAllFilters} + canUndoFilter={ + !!originalCanvasDataRef.current || + undoStack.some((drawing) => drawing.drawingType === "filter") + } + canClearFilters={hasFilters} + appliedFilters={ + (() => { + const filters = userData.drawings.filter((drawing) => drawing.drawingType === "filter"); + console.log(`[Canvas render] Passing ${filters.length} applied filters to Toolbar`, filters); + return filters; + })() + } + /* History Recall props (required so the toolbar can open/change/exit history mode) */ + openHistoryDialog={openHistoryDialog} + exitHistoryMode={exitHistoryMode} + historyMode={historyMode} + controlsDisabled={!editingEnabled} + onOpenSettings={onOpenSettings} + + // handle showing the AI Assitant Panel + onToggleAI={() => setAiOpen(!aiOpen)} + /> + + setAiOpen(false)} + isBusy={aiAssistLoading} + error={aiError} + showPromptInput={(showPrompt, obj) => { + setShowPromptInput(showPrompt); + setPromptInputPlaceholder(obj.placeholder); + setAiGenerateService(obj.type); + }} + onShapeCompletionToggle={handleShapeCompletionToggle} + onBeautify={() => handleBeautifyCanvas("medium")} + /> + + + {/* AI Assistant Prompt Input */} + + + {isRefreshing && ( +
+
+
+ )} + + {/* History Recall Dialog */} + setHistoryDialogOpen(false)} + aria-labelledby="history-recall-dialog" + > + + History Recall - Select Date/Time Range + + + + Choose a start and end date/time to recall drawings from + ResilientDB. Only drawings within the selected range will be loaded. + + + setHistoryStartInput(e.target.value)} + InputLabelProps={{ shrink: true }} + /> + setHistoryEndInput(e.target.value)} + InputLabelProps={{ shrink: true }} + /> + + + + + + + + + + + + + {historyMode + ? "History Mode Enabled — Canvas Editing Disabled" + : selectedUser && selectedUser !== "" + ? "Viewing Past Drawing History of Selected User — Canvas Editing Disabled" + : ""} + + + + + {/* Loading overlay: fades in/out while drawings load */} + + + + Loading Drawings... + + + + setClearDialogOpen(false)}> + Clear Canvas + + + Are you sure you want to clear the canvas for everyone? + + + + + + + + + {/* Command Palette - Quick command search and execution */} + setCommandPaletteOpen(false)} + commands={commandRegistry.getAll()} + onExecute={(command) => { + try { + command.action(); + } catch (error) { + console.error('[Canvas] Error executing command:', error); + showLocalSnack('Error executing command'); + } + }} + /> + + {/* Keyboard Shortcuts Help Dialog */} + setShortcutsHelpOpen(false)} + shortcuts={shortcutManagerRef.current?.getAllShortcuts() || []} + /> + + + + {/* Rendering AI suggestions */} + +
+ ); +} + +export default Canvas; From ef76a1a12be722d86f799e8219acc6d374b87564 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:33:09 -0800 Subject: [PATCH 10/26] Delete frontend/src/components/AI/AIAssistantPanel.jsx --- .../src/components/AI/AIAssistantPanel.jsx | 111 ------------------ 1 file changed, 111 deletions(-) delete mode 100644 frontend/src/components/AI/AIAssistantPanel.jsx diff --git a/frontend/src/components/AI/AIAssistantPanel.jsx b/frontend/src/components/AI/AIAssistantPanel.jsx deleted file mode 100644 index 0b7391fa..00000000 --- a/frontend/src/components/AI/AIAssistantPanel.jsx +++ /dev/null @@ -1,111 +0,0 @@ -import React, { useState } from "react"; -import '../../styles/ai-assistant.css'; -import { Tooltip, IconButton } from "@mui/material"; -import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; -import ImageIcon from '@mui/icons-material/Image'; -import RoundedCornerIcon from '@mui/icons-material/RoundedCorner'; -import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; - -export default function AIAssistantPanel({ - open, - onClose, - isBusy, - error, - showPromptInput, -}) { - const [activeButton, setActiveButton] = useState(""); - - const handlePanelItemClick = (itemTitle) => { - // If it's the beautify button, do NOT toggle - if (itemTitle === "Beautify sketch") { - // TODO: call beautify action here - console.log("Beautify action triggered"); - return; - } - - const next = activeButton === itemTitle ? "" : itemTitle; - setActiveButton(next); - - if (next === "Generate sketch") { - showPromptInput(true, { - type: 'drawing', - placeholder: "Describe what to draw…" - }); - } else if (next === "Generate image") { - showPromptInput(true, { - type: 'image', - placeholder: "Describe the image to generate…" - }); - } else { - showPromptInput(false, { - type: '', - placeholder: "" - }); - } - }; - - const renderStyleClass = (itemTitle) => { - // Beautify sketch should never be active - if (itemTitle === "Beautify sketch") { - return "ai-asisstant-panel-item"; - } - - return itemTitle === activeButton - ? "ai-asisstant-panel-item ai-asisstant-panel-item-active" - : "ai-asisstant-panel-item"; - }; - - return ( -
- -
handlePanelItemClick("Generate sketch")} - aria-pressed={activeButton === "Generate sketch"} - > - - - - - -
- -
handlePanelItemClick("Generate image")} - aria-pressed={activeButton === "Generate image"} - > - - - - - -
- -
handlePanelItemClick("Shape auto completion")} - aria-pressed={activeButton === "Shape auto completion"} - > - - - - - -
- -
handlePanelItemClick("Beautify sketch")} - aria-pressed={false} // Never active - > - - - - - -
- -
- ); -} From a472ebb530335bde017d8580cc6ef615d412e2d7 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:33:21 -0800 Subject: [PATCH 11/26] Delete frontend/src/components/AI/AIAP.jsx --- frontend/src/components/AI/AIAP.jsx | 224 ---------------------------- 1 file changed, 224 deletions(-) delete mode 100644 frontend/src/components/AI/AIAP.jsx diff --git a/frontend/src/components/AI/AIAP.jsx b/frontend/src/components/AI/AIAP.jsx deleted file mode 100644 index 8b3158eb..00000000 --- a/frontend/src/components/AI/AIAP.jsx +++ /dev/null @@ -1,224 +0,0 @@ -// import React from 'react'; -// import PropTypes from 'prop-types'; -import Box from '@mui/material/Box'; -import Drawer from '@mui/material/Drawer'; -import Paper from '@mui/material/Paper'; -import Typography from '@mui/material/Typography'; -import IconButton from '@mui/material/IconButton'; -import Tooltip from '@mui/material/Tooltip'; -import Divider from '@mui/material/Divider'; -import Stack from '@mui/material/Stack'; -import List from '@mui/material/List'; -import ListItem from '@mui/material/ListItem'; -import ListItemText from '@mui/material/ListItemText'; -import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; -import Chip from '@mui/material/Chip'; -import CircularProgress from '@mui/material/CircularProgress'; -import Alert from '@mui/material/Alert'; -import Select from '@mui/material/Select'; -import MenuItem from '@mui/material/MenuItem'; -import CloseIcon from '@mui/icons-material/Close'; -import CheckIcon from '@mui/icons-material/Check'; -import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; -import SmartToyIcon from '@mui/icons-material/SmartToy'; -import PromptInput from './PromptInput'; - -export default function AIAssistantPanel({ - open, - onClose, - onSubmitPrompt, - isBusy, - error, - suggestions, - onAcceptSuggestion, - onDiscardSuggestion, - model, - onModelChange, - examplePrompts = [ - 'draw a blue rectangle center', - 'scatter 5 small stars top-right', - 'smooth this sketch into a circle', - ], -}) { - const handleSubmit = (text) => { - if (!text || isBusy) return; - onSubmitPrompt?.(text.trim()); - }; - - const renderSuggestionPreview = (s) => { - if (s?.previewSvg) { - return ( - - ); - } - if (s?.previewUrl) { - return ( - - ); - } - return ( - - No preview - - ); - }; - - return ( - - - - AI Assistant - - - - - - - - - - Model - - - - - - {error && {String(error)}} - - {isBusy && ( - - - Thinking… - - )} - - - - - - - Suggestions - - - - - {(suggestions || []).map((s) => ( - - - {renderSuggestionPreview(s)} - - - - - onAcceptSuggestion?.(s)}> - - - - - onDiscardSuggestion?.(s.id)}> - - - - - - - - ))} - - - {!suggestions?.length && ( - - No suggestions yet — try a prompt above. - - )} - - - ); -} - -// AIAssistantPanel.propTypes = { -// open: PropTypes.bool, -// onClose: PropTypes.func, -// onSubmitPrompt: PropTypes.func, -// isBusy: PropTypes.bool, -// error: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), -// suggestions: PropTypes.arrayOf( -// PropTypes.shape({ -// id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, -// title: PropTypes.string, -// subtitle: PropTypes.string, -// type: PropTypes.string, -// previewSvg: PropTypes.string, -// previewUrl: PropTypes.string, -// payload: PropTypes.any, -// }) -// ), -// onAcceptSuggestion: PropTypes.func, -// onDiscardSuggestion: PropTypes.func, -// model: PropTypes.string, -// onModelChange: PropTypes.func, -// examplePrompts: PropTypes.arrayOf(PropTypes.string), -// }; - - -/* - setAiOpen(false)} - // onSubmitPrompt={handleSubmitPrompt} - isBusy={aiBusy} - error={aiError} - suggestions={aiSuggestions} - // onAcceptSuggestion={handleAcceptSuggestion} - // onDiscardSuggestion={handleDiscardSuggestion} - model={aiModel} - onModelChange={setAiModel} -/> -*/ \ No newline at end of file From ce15d0d6cbbff317558190f43bd83ebe58c5e074 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:33:36 -0800 Subject: [PATCH 12/26] Add files via upload --- .../src/components/AI/AIAssistantPanel.jsx | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 frontend/src/components/AI/AIAssistantPanel.jsx diff --git a/frontend/src/components/AI/AIAssistantPanel.jsx b/frontend/src/components/AI/AIAssistantPanel.jsx new file mode 100644 index 00000000..f7c93351 --- /dev/null +++ b/frontend/src/components/AI/AIAssistantPanel.jsx @@ -0,0 +1,121 @@ +import React, { useState } from "react"; +import '../../styles/ai-assistant.css'; +import { Tooltip, IconButton } from "@mui/material"; +import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; +import ImageIcon from '@mui/icons-material/Image'; +import RoundedCornerIcon from '@mui/icons-material/RoundedCorner'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; + +export default function AIAssistantPanel({ + open, + onClose, + isBusy, + error, + showPromptInput, + onShapeCompletionToggle, + onBeautify, +}) { + const [activeButton, setActiveButton] = useState(""); + + const handlePanelItemClick = (itemTitle) => { + // If it's the beautify button, do NOT toggle + if (itemTitle === "Beautify sketch") { + if (typeof onBeautify === "function" && !isBusy) { + onBeautify(); + } + return; + } + + const next = activeButton === itemTitle ? "" : itemTitle; + setActiveButton(next); + + if (itemTitle === "Shape auto completion") { + if (typeof onShapeCompletionToggle === "function") { + onShapeCompletionToggle(next === "Shape auto completion"); + } + return; + } + + if (next === "Generate sketch") { + showPromptInput(true, { + type: 'drawing', + placeholder: "Describe what to draw…" + }); + } else if (next === "Generate image") { + showPromptInput(true, { + type: 'image', + placeholder: "Describe the image to generate…" + }); + } else { + showPromptInput(false, { + type: '', + placeholder: "" + }); + } + }; + + const renderStyleClass = (itemTitle) => { + // Beautify sketch should never be active + if (itemTitle === "Beautify sketch") { + return "ai-asisstant-panel-item"; + } + + return itemTitle === activeButton + ? "ai-asisstant-panel-item ai-asisstant-panel-item-active" + : "ai-asisstant-panel-item"; + }; + + return ( +
+ +
handlePanelItemClick("Generate sketch")} + aria-pressed={activeButton === "Generate sketch"} + > + + + + + +
+ +
handlePanelItemClick("Generate image")} + aria-pressed={activeButton === "Generate image"} + > + + + + + +
+ +
handlePanelItemClick("Shape auto completion")} + aria-pressed={activeButton === "Shape auto completion"} + > + + + + + +
+ +
handlePanelItemClick("Beautify sketch")} + aria-pressed={false} // Never active + > + + + + + +
+ +
+ ); +} From d02e70e5eee4c84c079cb7cf1560ddc2c81a8212 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:34:05 -0800 Subject: [PATCH 13/26] Delete backend/routes/ai_assistant.py --- backend/routes/ai_assistant.py | 77 ---------------------------------- 1 file changed, 77 deletions(-) delete mode 100644 backend/routes/ai_assistant.py diff --git a/backend/routes/ai_assistant.py b/backend/routes/ai_assistant.py deleted file mode 100644 index c871b6d4..00000000 --- a/backend/routes/ai_assistant.py +++ /dev/null @@ -1,77 +0,0 @@ -from flask import Blueprint, request, jsonify -from services.llm_service import prompt_to_drawings, complete_shape_from_canvas -import logging - -ai_assistant_bp = Blueprint('ai_assistant', __name__) -logger = logging.getLogger(__name__) - - -@ai_assistant_bp.route('/api/ai_assistant/drawing', methods=['POST']) -def text_to_drawings(): - """ - Body: { "prompt": "", canvasState: {json object} } - Returns: parsed drawing JSON (shape/color/size/position/...) or an error payload. - """ - try: - payload = request.get_json(silent=True) or {} - prompt = payload.get("prompt") - canvasState = payload.get("canvasState") or {} - - if not isinstance(prompt, str) or not prompt.strip(): - return jsonify({"error": "bad_request", "detail": "Missing or invalid 'prompt' (string)."}), 400 - - logger.info("AI drawing requested") - result = prompt_to_drawings(prompt.strip(), canvasState) - - # print(f"Model result: {result}") - - # If services returned an error, surface it with 502 (bad upstream) - if isinstance(result, dict) and "error" in result: - logger.warning("AI drawing failed: %s", result) - return jsonify({"error": "upstream_model_error", "detail": result}), 502 - - return jsonify(result), 200 - except Exception as e: - logger.exception("Unhandled error in /drawing") - return jsonify({"error": "server_error", "detail": str(e)}), 500 - - -@ai_assistant_bp.route('/api/ai_assistant/complete', methods=['POST']) -def shape_completion(): - """ - Body: { "canvasState": { ... } } - Returns: { complete, confidence, object{ color, lineWidth, pathData{...} } } or an error payload. - """ - try: - payload = request.get_json(silent=True) or {} - canvas_state = payload.get("canvasState") - if not isinstance(canvas_state, dict): - return jsonify({"error": "bad_request", "detail": "Missing or invalid 'canvas_state' (object)."}), 400 - - logger.info("AI shape completion requested") - suggestion = complete_shape_from_canvas(canvas_state) - - if not isinstance(canvas_state, dict): - return jsonify({ - "error": "bad_request", - "detail": "Missing or invalid 'canvasState' (object)." - }), 400 - - return jsonify(suggestion), 200 - except Exception as e: - logger.exception("Unhandled error in /complete") - return jsonify({"error": "server_error", "detail": str(e)}), 500 - - -@ai_assistant_bp.route('/api/ai_assistant/image', methods=['POST']) -def text_to_image(): - pass - - -@ai_assistant_bp.route('/api/ai_assistant/beautify', methods=['POST']) -def beautify_sketch(): - pass - -# @ai_assistant_bp.route('/api/ai_assistant/inpainting', methods=['POST']) -# def apply_inpainting(): -# pass From 36a82025ed3e5b676646c8af01df606f9e246f77 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:34:25 -0800 Subject: [PATCH 14/26] Add files via upload --- backend/routes/ai_assistant.py | 134 +++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 backend/routes/ai_assistant.py diff --git a/backend/routes/ai_assistant.py b/backend/routes/ai_assistant.py new file mode 100644 index 00000000..b4bd3021 --- /dev/null +++ b/backend/routes/ai_assistant.py @@ -0,0 +1,134 @@ +from flask import Blueprint, request, jsonify +from services.llm_service import prompt_to_drawings, complete_shape_from_canvas, beautify_canvas_state +# from services.image_generation_service import ( +# text_to_image as img_text_to_image, +# ) +import logging +import base64 +import io + +ai_assistant_bp = Blueprint('ai_assistant', __name__) +logger = logging.getLogger(__name__) + + +@ai_assistant_bp.route('/api/ai_assistant/drawing', methods=['POST']) +def text_to_drawings(): + """ + Body: { "prompt": "", canvasState: {json object} } + Returns: parsed drawing JSON (shape/color/size/position/...) or an error payload. + """ + try: + payload = request.get_json(silent=True) or {} + prompt = payload.get("prompt") + canvasState = payload.get("canvasState") or {} + + if not isinstance(prompt, str) or not prompt.strip(): + return jsonify({"error": "bad_request", "detail": "Missing or invalid 'prompt' (string)."}), 400 + + logger.info("AI drawing requested") + result = prompt_to_drawings(prompt.strip(), canvasState) + + print(f"\n\nModel result: {result}\n\n") + + # If services returned an error, surface it with 502 (bad upstream) + if isinstance(result, dict) and "error" in result: + logger.warning("AI drawing failed: %s", result) + return jsonify({"error": "upstream_model_error", "detail": result}), 502 + + return jsonify(result), 200 + except Exception as e: + logger.exception("Unhandled error in /drawing") + return jsonify({"error": "server_error", "detail": str(e)}), 500 + + +@ai_assistant_bp.route('/api/ai_assistant/complete', methods=['POST']) +def shape_completion(): + """ + Body: { "canvasState": { ... } } + Returns: { complete, confidence, object{ color, lineWidth, pathData{...} } } or an error payload. + """ + try: + payload = request.get_json(silent=True) or {} + canvas_state = payload.get("canvasState") + if not isinstance(canvas_state, dict): + return jsonify({"error": "bad_request", "detail": "Missing or invalid 'canvas_state' (object)."}), 400 + + logger.info("AI shape completion requested") + suggestion = complete_shape_from_canvas(canvas_state) + + if not isinstance(canvas_state, dict): + return jsonify({ + "error": "bad_request", + "detail": "Missing or invalid 'canvasState' (object)." + }), 400 + + return jsonify(suggestion), 200 + except Exception as e: + logger.exception("Unhandled error in /complete") + return jsonify({"error": "server_error", "detail": str(e)}), 500 + + +@ai_assistant_bp.route('/api/ai_assistant/image', methods=['POST']) +def text_to_image(): + """ + Body: { "prompt": "", "width"?: int, "height"?: int, "style"?: str } + Returns: { "imageDataUrl": "data:image/png;base64,..." } + """ + try: + payload = request.get_json(silent=True) or {} + prompt = payload.get("prompt", "") + width = payload.get("width") or 512 + height = payload.get("height") or 512 + style = payload.get("style") or "default" + + if not isinstance(prompt, str) or not prompt.strip(): + return jsonify({ + "error": "bad_request", + "detail": "Missing or invalid 'prompt' (string)." + }), 400 + + logger.info("AI text-to-image requested") + + pil_image = [] # img_text_to_image(prompt.strip(), width=width, height=height, style=style) + + buf = io.BytesIO() + pil_image.save(buf, format="PNG") + buf.seek(0) + encoded = base64.b64encode(buf.read()).decode("utf-8") + data_url = f"data:image/png;base64,{encoded}" + + return jsonify({"imageDataUrl": data_url}), 200 + + except Exception as e: + logger.exception("Unhandled error in /image") + return jsonify({"error": "server_error", "detail": str(e)}), 500 + + +@ai_assistant_bp.route("/api/ai_assistant/beautify", methods=["POST"]) +def beautify_sketch(): + try: + payload = request.get_json(silent=True) or {} + canvas_state = payload.get("canvasState") + level = payload.get("level", "medium") + + if not isinstance(canvas_state, dict): + return jsonify({ + "error": "bad_request", + "detail": "Missing or invalid 'canvasState' (object)." + }), 400 + + logger.info("AI canvas beautify requested (level=%s)", level) + result = beautify_canvas_state(canvas_state, level=level) + + if not isinstance(result, dict) or "objects" not in result: + logger.warning("Beautify returned invalid payload: %r", result) + return jsonify({ + "error": "upstream_model_error", + "detail": "Beautify model returned invalid payload." + }), 502 + + return jsonify(result), 200 + + except Exception as e: + logger.exception("Unhandled error in /beautify") + return jsonify({"error": "server_error", "detail": str(e)}), 500 \ No newline at end of file From ef08d6381b1e9e33bef0f31be2f5e6eeacb23676 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:35:10 -0800 Subject: [PATCH 15/26] Delete backend/services/llm_service.py --- backend/services/llm_service.py | 514 -------------------------------- 1 file changed, 514 deletions(-) delete mode 100644 backend/services/llm_service.py diff --git a/backend/services/llm_service.py b/backend/services/llm_service.py deleted file mode 100644 index 34bd4035..00000000 --- a/backend/services/llm_service.py +++ /dev/null @@ -1,514 +0,0 @@ -# pip install openai ollama -import json -import typing - -# === text to drawings ========================================================= -# System prompt -SYSTEM_PROMPT = """ -You are a drawing-command generator for a canvas app. - -Inputs you will be given: -- CanvasState: { "drawings": [ ... ], "bounds": { "width": number, "height": number } } -- UserPrompt: a natural-language scene description - -Goal: -Return a SINGLE JSON object with an "objects" array. Each item is a canvas-ready drawing command that our app can render directly. - -Output (JSON ONLY, no comments, no markdown): -{ - "objects": [ - { - "color": "#RRGGBB", - "lineWidth": number, - "pathData": { - "tool": "shape", - "type": "rectangle|circle|line|polygon|text", - // Use one of these geometry encodings (no others): - // circle/rectangle/line: - "start": {"x": number, "y": number}, - "end": {"x": number, "y": number}, - // polygon (including triangles): - "points": [ {"x": number, "y": number}, ... ], - // text: - "text": "string" - } - } - ] -} - -Rules & Defaults (match our canvas code): -- Use ABSOLUTE pixel coordinates with (0,0) at top-left; all points MUST lie within [0, bounds.width] × [0, bounds.height]. -- Color words → hex (e.g., "red"→"#FF0000", "blue"→"#0000FF"). -- Sizes: tiny=20, small=40, medium=80, large=140, huge=220. For circles, represent size by the distance between start and end (radius as line length). -- Relative positions from the prompt (e.g., "center", "top-right") must be converted to absolute: - center=(W/2,H/2), top-left=(0,0), top=(W/2,0), top-right=(W,0), - left=(0,H/2), right=(W,H/2), bottom-left=(0,H), bottom=(W/2,H), bottom-right=(W,H). - -When CanvasState is provided: -- Avoid obvious overlaps with existing content unless the prompt demands it (e.g., “on top of…”). -- Keep new objects visually distinct (slight offsets are OK when crowded). - -Content fidelity: -- Include EVERY explicitly mentioned object; respect counts, colors, sizes, and spatial relations. -- If motion/action is described, suggest simple visual cues (e.g., angled line, small polygon “arrow”, or secondary object) using primitives. -- If ambiguous, choose a common-sense default and continue. - -Constraints: -- Output MUST be valid JSON matching the schema above. Do not include IDs (the app assigns them). -- Keep a modest number of objects (clear but not cluttered). -""" - -# Few-shot to stabilize canvas-native formatting -FEWSHOT_USER_1 = """ -CanvasState: {"drawings":[],"bounds":{"width":3000,"height":2000}} -UserPrompt: draw a small blue circle at the top-right -""" - -FEWSHOT_ASSISTANT_JSON_1 = { - "objects": [ - { - "color": "#0000FF", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "circle", - "start": {"x": 2900, "y": 100}, - "end": {"x": 2940, "y": 100} - } - } - ] -} - -FEWSHOT_USER_2 = """ -CanvasState: -{"drawings":[],"bounds":{"width":3000,"height":2000}} -UserPrompt: -"draw a red car driving in the woods" -""" - -FEWSHOT_ASSISTANT_JSON_2 = { - "objects": [ - # Trees (two) - { - "color": "#228B22", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "polygon", - "points": [ - {"x": 600, "y": 1050}, - {"x": 650, "y": 950}, - {"x": 700, "y": 1050} - ] - } - }, - { - "color": "#8B4513", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "rectangle", - "start": {"x": 645, "y": 1050}, - "end": {"x": 655, "y": 1100} - } - }, - { - "color": "#228B22", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "polygon", - "points": [ - {"x": 2300, "y": 1000}, - {"x": 2350, "y": 900}, - {"x": 2400, "y": 1000} - ] - } - }, - { - "color": "#8B4513", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "rectangle", - "start": {"x": 2345, "y": 1000}, - "end": {"x": 2355, "y": 1050} - } - }, - - # Road (line with slight angle) - { - "color": "#555555", - "lineWidth": 6, - "pathData": { - "tool": "shape", - "type": "line", - "start": {"x": 400, "y": 1400}, - "end": {"x": 2600, "y": 1500} - } - }, - - # Red car on the road - { - "color": "#FF0000", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "rectangle", - "start": {"x": 1450, "y": 1380}, - "end": {"x": 1650, "y": 1450} - } - }, - { - "color": "#FF0000", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "polygon", - "points": [ - {"x": 1500, "y": 1380}, - {"x": 1600, "y": 1380}, - {"x": 1550, "y": 1340} - ] - } - }, - # Wheels - { - "color": "#000000", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "circle", - "start": {"x": 1500, "y": 1450}, - "end": {"x": 1520, "y": 1450} - } - }, - { - "color": "#000000", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "circle", - "start": {"x": 1600, "y": 1450}, - "end": {"x": 1620, "y": 1450} - } - }, - # Motion cue (small angled line “speed line”) - { - "color": "#000000", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "line", - "start": {"x": 1420, "y": 1415}, - "end": {"x": 1450, "y": 1400} - } - } - ] -} - -FEWSHOT_USER_3 = """ -CanvasState: -{ - "drawings": [ - {"color":"#8B4513","lineWidth":2,"pathData":{"tool":"shape","type":"rectangle","start":{"x":1400,"y":1200},"end":{"x":1600,"y":1270}}}, - {"color":"#FF0000","lineWidth":2,"pathData":{"tool":"shape","type":"polygon","points":[{"x":1400,"y":1200},{"x":1500,"y":1120},{"x":1600,"y":1200}]}} - ], - "bounds":{"width":3000,"height":2000} -} -UserPrompt: -"add a blue window to the right of the house" -""" - -FEWSHOT_ASSISTANT_JSON_3 = { - "objects": [ - { - "color": "#0000FF", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "rectangle", - "start": {"x": 1650, "y": 1210}, - "end": {"x": 1690, "y": 1245} - } - } - ] -} - -def _get_text_to_drawings_initial_message(prompt: str, canvasState: dict[str, typing.Any]) -> list[dict]: - """ - Build the minimal, few-shot seeded chat message list for the - text→drawing JSON parser. - - Args: - prompt: The end-user natural language description (e.g., "draw a small - blue circle"). - canvasState (dict[str, Any]): - A Python dictionary representing the current state of the canvas. - - Returns: - A list of role/content dicts suitable for OpenAI/Ollama chat APIs: - [system, user(few-shot), assistant(few-shot), user(actual prompt)]. - """ - canvas_json = json.dumps(canvasState, separators=(",", ":")) - - # Combine into a single message for the model - user_prompt = ( - f"CanvasState:\n{canvas_json}\n" - f"UserPrompt:\nDescribe all shapes needed to draw this scene: {prompt}" - ) - - return [ - {"role": "system", "content": SYSTEM_PROMPT}, - {"role": "user", "content": FEWSHOT_USER_1}, - {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_1)}, - {"role": "user", "content": FEWSHOT_USER_2}, - {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_2)}, - {"role": "user", "content": user_prompt}, - ] - -def openai_prompt_to_json(prompt: str, canvasState: dict[str, typing.Any]) -> dict: - """ - Convert a natural-language drawing prompt into structured JSON - using the OpenAI GPT-4.1-mini model. - - Args: - prompt: The user's text prompt describing the drawing. - - Returns: - Dict containing parsed drawing attributes or an error payload. - """ - try: - from config import OPENAI_API_KEY - from openai import OpenAI - - client = OpenAI(api_key=OPENAI_API_KEY) - - resp = client.chat.completions.create( - model="gpt-4.1-mini", - response_format={"type": "json_object"}, # forces valid JSON - temperature=0.1, - messages=_get_text_to_drawings_initial_message(prompt, canvasState), - max_tokens=1000, - ) - content = resp.choices[0].message.content - # print("\nAPI response: ", content, "\n") - return json.loads(content) - except Exception as e: - return {"error": "openai_failed", "detail": str(e)} - -def ollama_prompt_to_json(prompt: str, canvasState: dict[str, typing.Any]) -> dict: - """ - Convert a natural-language drawing prompt into structured JSON - using a locally hosted Ollama model as a fallback. - - Args: - prompt: The user's text prompt describing the drawing. - - Returns: - Dict containing parsed drawing attributes or an error payload. - """ - try: - import ollama - - response = ollama.chat( - model="llama3:8b", - messages=_get_text_to_drawings_initial_message(prompt, canvasState) - ) - - return json.loads(response['message']['content']) - except Exception as e: - return {"error": "ollama_failed", "detail": str(e)} - -def prompt_to_drawings(prompt: str, canvasState: dict[str, typing.Any]) -> dict: - """ - Route a drawing prompt to OpenAI first, then fall back to Ollama - if the cloud model fails. Guarantees a dictionary response. - - Args: - prompt: The user's text prompt describing the drawing. - - Returns: - Dict containing parsed drawing attributes or an error payload. - """ - model_output = openai_prompt_to_json(prompt, canvasState) - - # If user setup openai API's properly and no errors - # occured, return the model's output - if "error" not in model_output: - return model_output - - # Fallback - fallback_model_output = ollama_prompt_to_json(prompt, canvasState) - return fallback_model_output - -# === Shape Completion ========================================================= -SHAPE_COMPLETION_SYSTEM = """ -You are a shape-completion engine for a canvas app. - -Inputs you will be given: -- CanvasState: the current canvas (existing drawings + bounds) - -Goal: -Infer the single most likely primitive shape that best fits canvasState, and return it in a canvas-ready format. - -Output (JSON ONLY, no comments, no markdown): -{ - "complete": true|false, - "confidence": number, // 0.0–1.0 - "object": { - "color": "#RRGGBB", - "lineWidth": number, - "pathData": { - "tool": "shape", - "type": "circle|rectangle|line|polygon|text", - // circle/rectangle/line: - "start": {"x": number, "y": number}, - "end": {"x": number, "y": number}, - // polygon (including triangle): - "points": [ {"x": number, "y": number}, ... ], - // text (rare for completion; omit unless clearly indicated): - "text": "string" - } - } -} - -Rules: -- Use ABSOLUTE coordinates within CanvasState.bounds (0,0 = top-left). -- Infer a single primitive that best fits the partial strokes/points. Prefer simpler fits that preserve user intent. -- If uncertainty is high (confidence < 0.4), set "complete": false and return a best-effort "object" anyway (so the UI can show a ghost preview). -- Color default: use the majority/last stroke color if available; otherwise "#000000". -- Snap centers/edges to nearby anchors (guides, bounding-box centers/edges) if within ~6px. -- Output MUST be valid JSON matching the schema above exactly. -""" - -# Few-shots (2 strong, compact) - -SHAPE_COMPLETION_FEWSHOT_USER_1 = """ -CanvasState: -{"drawings":[],"bounds":{"width":1200,"height":800}} -""" - -SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1 = { - "complete": True, - "confidence": 0.86, - "object": { - "color": "#0000FF", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "circle", - "start": {"x": 360, "y": 420}, - "end": {"x": 400, "y": 420} - } - } -} - -SHAPE_COMPLETION_FEWSHOT_USER_2 = """ -CanvasState: -{"drawings":[{}],"bounds":{"width":1200,"height":800}} -""" - -SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2 = { - "complete": True, - "confidence": 0.78, - "object": { - "color": "#333333", - "lineWidth": 2, - "pathData": { - "tool": "shape", - "type": "rectangle", - "start": {"x": 500, "y": 300}, - "end": {"x": 700, "y": 420} - } - } -} - -def _get_shape_completion_initial_message( - canvas_state: dict[str, typing.Any]) -> list[dict]: - """ - Build the few-shot seeded chat messages for shape completion. - - Args: - canvas_state (dict[str, Any]): - The current canvas state. Expected keys: - - "drawings": list of existing drawings (color, lineWidth, pathData, etc.) - - "bounds": { "width": number, "height": number } - - - Returns: - list[dict]: Chat messages for OpenAI/Ollama APIs: - [system, user(few-shot), assistant(few-shot), user(few-shot), assistant(few-shot), user(actual)] - """ - canvas_json = json.dumps(canvas_state, separators=(",", ":")) - user_msg = f"CanvasState:\n{canvas_json}" - - return [ - {"role": "system", "content": SHAPE_COMPLETION_SYSTEM}, - {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_1}, - {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1)}, - {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_2}, - {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2)}, - {"role": "user", "content": user_msg}, - ] - -def openai_complete_shape(canvas_state: dict) -> dict: - """ - Infer and complete a likely shape from the current partial input using OpenAI. - - Args: - canvas_state (dict): Current canvas (drawings + bounds). - - Returns: - dict: { complete, confidence, object{ color, lineWidth, pathData{...} } } or error payload. - """ - try: - from config import OPENAI_API_KEY - from openai import OpenAI - client = OpenAI(api_key=OPENAI_API_KEY) - - resp = client.chat.completions.create( - model="gpt-4.1-mini", - response_format={"type": "json_object"}, - temperature=0.1, - messages=_get_shape_completion_initial_message(canvas_state), - max_tokens=220, - ) - return json.loads(resp.choices[0].message.content) - except Exception as e: - return {"error": "openai_completion_failed", "detail": str(e)} - -def ollama_complete_shape(canvas_state: dict) -> dict: - """ - Infer and complete a likely shape from the current partial input using Ollama. - - Args: - canvas_state (dict): Current canvas (drawings + bounds). - - Returns: - dict: { complete, confidence, object{ color, lineWidth, pathData{...} } } or error payload. - """ - try: - import ollama - response = ollama.chat( - model="llama3:8b", - messages=_get_shape_completion_initial_message(canvas_state) - ) - return json.loads(response["message"]["content"]) - except Exception as e: - return {"error": "ollama_completion_failed", "detail": str(e)} - -def complete_shape_from_canvas(canvas_state: dict) -> dict: - """ - Perform AI-based shape completion using OpenAI first, then Ollama. - - Args: - canvas_state (dict): Current canvas (drawings + bounds). - - Returns: - dict: Inferred shape completion result. - """ - model_output = openai_complete_shape(canvas_state) - if "error" not in model_output: - return model_output - return ollama_complete_shape(canvas_state) From c692fedb8c877c91d0b596bf57ad9e2e10d35850 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:35:37 -0800 Subject: [PATCH 16/26] Add files via upload --- backend/services/llm_service.py | 775 ++++++++++++++++++++++++++++++++ 1 file changed, 775 insertions(+) create mode 100644 backend/services/llm_service.py diff --git a/backend/services/llm_service.py b/backend/services/llm_service.py new file mode 100644 index 00000000..a7258bfb --- /dev/null +++ b/backend/services/llm_service.py @@ -0,0 +1,775 @@ +# pip install openai ollama +import json +import typing + +# === text to drawings ========================================================= +# System prompt +SYSTEM_PROMPT = """ +You are a drawing-command generator for a canvas app. + +Inputs you will be given: +- CanvasState: { "drawings": [ ... ], "bounds": { "width": number, "height": number } } +- UserPrompt: a natural-language scene description + +Goal: +Return a SINGLE JSON object with an "objects" array. Each item is a canvas-ready drawing command that our app can render directly. + +Output (JSON ONLY, no comments, no markdown): +{ + "objects": [ + { + "color": "#RRGGBB", + "lineWidth": number, + "pathData": { + "tool": "shape|freehand", + "type": "rectangle|circle|line|polygon|text|stroke", + // Use one of these geometry encodings (no others): + // For circle/rectangle/line: + "start": {"x": number, "y": number}, + "end": {"x": number, "y": number}, + // For polygon (including triangles): + "points": [ {"x": number, "y": number}, ... ], + // For text: + "text": "string" + // For freehand strokes (preferred for smooth lines): + // use "tool": "freehand", "type": "stroke", + // and provide "points" as an ordered list along the stroke path. + } + } + ] +} + +Rules & Defaults (match our canvas code): +- Use ABSOLUTE pixel coordinates with (0,0) at top-left; all points MUST lie within [0, bounds.width] × [0, bounds.height]. +- Color words → hex (e.g., "red"→"#FF0000", "blue"→"#0000FF"). +- Sizes: tiny=20, small=40, medium=80, large=140, huge=220. For circles, represent size by the distance between start and end (radius as line length). +- Relative positions from the prompt (e.g., "center", "top-right") must be converted to absolute: + center=(W/2,H/2), top-left=(0,0), top=(W/2,0), top-right=(W,0), + left=(0,H/2), right=(W,H/2), bottom-left=(0,H), bottom=(W/2,H), bottom-right=(W,H). + +Style & tool selection: +- Prefer smooth, natural drawings using the freehand brush by default: + - Use "tool": "freehand" and "type": "stroke" with a "points" array that traces the stroke. +- Match the existing canvas style from CanvasState.drawings: + - If drawings are mostly geometric shapes (rectangles, circles, polygons, straight lines), + then also use mostly "shape" commands. + - If drawings are mostly strokes (drawingType === "stroke" or freehand-like paths), + then use mostly freehand strokes. + - If both are present, combine both: + - Use shapes for rigid objects (buildings, cars, roads, UI panels, etc.). + - Use freehand strokes for organic forms (trees, people, animals, clouds) and fine details. +- When following the user’s style, keep lineWidth and overall complexity visually consistent + with the existing drawings. + +Detail & realism: +- Treat each named object as something that should look like it was drawn by an expert. +- Avoid simple, undetailed blocks. Examples: + - A "city" must not just be a few plain rectangles. Use multiple buildings and add windows, + doors, and varied roof lines. + - A "building" should have at least windows and a door, plus simple roof or edge details. + - A "car" should at least show body, wheels, windows, and a hint of lights or motion. +- For complex or important objects (cities, buildings, cars, trees, faces, + people): + - Break them into several shapes and/or strokes (roughly 3–8 primitives per main object). + - Add visible details using either small shapes or short freehand strokes. +- Keep the total number of objects modest: enough to look like a clean expert sketch, + not hundreds of tiny primitives. + +When CanvasState is provided: +- Avoid obvious overlaps with existing content unless the prompt demands it (e.g., “on top of…”). +- Keep new objects visually distinct (slight offsets are OK when crowded). +- Respect the existing composition: do not cover up important existing drawings unless + the prompt says to replace or draw over something. + +Content fidelity: +- Include EVERY explicitly mentioned object; respect counts, colors, sizes, and spatial relations. +- If motion/action is described, suggest simple visual cues (e.g., angled line, small polygon “arrow”, or secondary object) using primitives or strokes. +- If ambiguous, choose a common-sense default and continue. + +Constraints: +- Output MUST be valid JSON matching the schema above. Do not include IDs (the app assigns them). +- Keep a modest number of objects (clear but not cluttered). +""" + +# Few-shot to stabilize canvas-native formatting +FEWSHOT_USER_1 = """ +CanvasState: {"drawings":[],"bounds":{"width":1800,"height":800}} +UserPrompt: draw a small blue circle at the top-right +""" + +FEWSHOT_ASSISTANT_JSON_1 = { + "objects": [ + { + "color": "#0000FF", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 2900, "y": 100}, + "end": {"x": 2940, "y": 100}, + }, + } + ] +} + +FEWSHOT_USER_2 = """ +CanvasState: +{"drawings":[],"bounds":{"width":1800,"height":800}} +UserPrompt: +"draw a red car driving in the woods" +""" + +FEWSHOT_ASSISTANT_JSON_2 = { + "objects": [ + { + "color": "#228B22", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 600, "y": 1050}, + {"x": 650, "y": 950}, + {"x": 700, "y": 1050}, + ], + }, + }, + { + "color": "#8B4513", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 645, "y": 1050}, + "end": {"x": 655, "y": 1100}, + }, + }, + { + "color": "#228B22", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 2300, "y": 1000}, + {"x": 2350, "y": 900}, + {"x": 2400, "y": 1000}, + ], + }, + }, + { + "color": "#8B4513", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 2345, "y": 1000}, + "end": {"x": 2355, "y": 1050}, + }, + }, + { + "color": "#555555", + "lineWidth": 6, + "pathData": { + "tool": "shape", + "type": "line", + "start": {"x": 400, "y": 1400}, + "end": {"x": 2600, "y": 1500}, + }, + }, + { + "color": "#FF0000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 1450, "y": 1380}, + "end": {"x": 1650, "y": 1450}, + }, + }, + { + "color": "#FF0000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 1500, "y": 1380}, + {"x": 1600, "y": 1380}, + {"x": 1550, "y": 1340}, + ], + }, + }, + { + "color": "#000000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 1500, "y": 1450}, + "end": {"x": 1520, "y": 1450}, + }, + }, + { + "color": "#000000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 1600, "y": 1450}, + "end": {"x": 1620, "y": 1450}, + }, + }, + { + "color": "#000000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "line", + "start": {"x": 1420, "y": 1415}, + "end": {"x": 1450, "y": 1400}, + }, + }, + # Example freehand stroke for grass/detail under the car + { + "color": "#006400", + "lineWidth": 3, + "pathData": { + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 1400, "y": 1505}, + {"x": 1450, "y": 1498}, + {"x": 1500, "y": 1502}, + {"x": 1550, "y": 1496}, + {"x": 1600, "y": 1500}, + ], + }, + }, + ] +} + +FEWSHOT_USER_3 = """ +CanvasState: +{ + "drawings": [ + {"color":"#8B4513","lineWidth":2,"pathData":{"tool":"shape","type":"rectangle","start":{"x":1400,"y":1200},"end":{"x":1600,"y":1270}}}, + {"color":"#FF0000","lineWidth":2,"pathData":{"tool":"shape","type":"polygon","points":[{"x":1400,"y":1200},{"x":1500,"y":1120},{"x":1600,"y":1200}]}} + ], + "bounds":{"width":1800,"height":800} +} +UserPrompt: +"add a blue window to the right of the house" +""" + +FEWSHOT_ASSISTANT_JSON_3 = { + "objects": [ + { + "color": "#0000FF", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 1650, "y": 1210}, + "end": {"x": 1690, "y": 1245}, + }, + } + ] +} + + +def _get_text_to_drawings_initial_message( + prompt: str, canvasState: dict[str, typing.Any] +) -> list[dict]: + """ + Build the minimal, few-shot seeded chat message list for the + text→drawing JSON parser. + + Args: + prompt: The end-user natural language description (e.g., "draw a small + blue circle"). + canvasState (dict[str, Any]): + A Python dictionary representing the current state of the canvas. + + Returns: + A list of role/content dicts suitable for OpenAI/Ollama chat APIs: + [system, user(few-shot), assistant(few-shot), user(actual prompt)]. + """ + canvas_json = json.dumps(canvasState, separators=(",", ":")) + + # Combine into a single message for the model + user_prompt = ( + f"CanvasState:\n{canvas_json}\n" + f"UserPrompt:\nDescribe all drawing commands (shapes and freehand strokes) " + f"needed to draw this scene: {prompt}" + ) + + return [ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": FEWSHOT_USER_1}, + {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_1)}, + {"role": "user", "content": FEWSHOT_USER_2}, + {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_2)}, + {"role": "user", "content": FEWSHOT_USER_3}, + {"role": "assistant", "content": json.dumps(FEWSHOT_ASSISTANT_JSON_3)}, + {"role": "user", "content": user_prompt}, + ] + + +def openai_prompt_to_json(prompt: str, canvasState: dict[str, typing.Any]) -> dict: + """ + Convert a natural-language drawing prompt into structured JSON + using the OpenAI GPT-4.1-mini model. + + Args: + prompt: The user's text prompt describing the drawing. + + Returns: + Dict containing parsed drawing attributes or an error payload. + """ + try: + from config import OPENAI_API_KEY + from openai import OpenAI + + client = OpenAI(api_key=OPENAI_API_KEY) + + resp = client.chat.completions.create( + model="gpt-4.1-mini", + response_format={"type": "json_object"}, # forces valid JSON + temperature=0.1, + messages=_get_text_to_drawings_initial_message(prompt, canvasState), + max_tokens=5000, + ) + content = resp.choices[0].message.content + return json.loads(content) + except Exception as e: + return {"error": "openai_failed", "detail": str(e)} + + +def ollama_prompt_to_json(prompt: str, canvasState: dict[str, typing.Any]) -> dict: + """ + Convert a natural-language drawing prompt into structured JSON + using a locally hosted Ollama model as a fallback. + + Args: + prompt: The user's text prompt describing the drawing. + + Returns: + Dict containing parsed drawing attributes or an error payload. + """ + try: + import ollama + + response = ollama.chat( + model="llama3:8b", + messages=_get_text_to_drawings_initial_message(prompt, canvasState), + ) + + return json.loads(response["message"]["content"]) + except Exception as e: + return {"error": "ollama_failed", "detail": str(e)} + + +def prompt_to_drawings(prompt: str, canvasState: dict[str, typing.Any]) -> dict: + """ + Route a drawing prompt to OpenAI first, then fall back to Ollama + if the cloud model fails. Guarantees a dictionary response. + + Args: + prompt: The user's text prompt describing the drawing. + + Returns: + Dict containing parsed drawing attributes or an error payload. + """ + model_output = openai_prompt_to_json(prompt, canvasState) + + # If user setup openai API's properly and no errors + # occured, return the model's output + if "error" not in model_output: + return model_output + + # Fallback + fallback_model_output = ollama_prompt_to_json(prompt, canvasState) + return fallback_model_output + + +# === Shape Completion ========================================================= +SHAPE_COMPLETION_SYSTEM = """ +You are a shape-completion engine for a canvas app. + +Inputs you will be given: +- CanvasState: the current canvas (existing drawings + bounds) + +Goal: +Infer the single most likely primitive shape that best fits canvasState, and return it in a canvas-ready format. + +Output (JSON ONLY, no comments, no markdown): +{ + "complete": true|false, + "confidence": number, // 0.0–1.0 + "object": { + "color": "#RRGGBB", + "lineWidth": number, + "pathData": { + "tool": "shape", + "type": "circle|rectangle|line|polygon|text", + // circle/rectangle/line: + "start": {"x": number, "y": number}, + "end": {"x": number, "y": number}, + // polygon (including triangle): + "points": [ {"x": number, "y": number}, ... ], + // text (rare for completion; omit unless clearly indicated): + "text": "string" + } + } +} + +Rules: +- Use ABSOLUTE coordinates within CanvasState.bounds (0,0 = top-left). +- Infer a single primitive that best fits the partial strokes/points. Prefer simpler fits that preserve user intent. +- If uncertainty is high (confidence < 0.4), set "complete": false and return a best-effort "object" anyway (so the UI can show a ghost preview). +- Color default: use the majority/last stroke color if available; otherwise "#000000". +- Snap centers/edges to nearby anchors (guides, bounding-box centers/edges) if within ~6px. +- Output MUST be valid JSON matching the schema above exactly. +""" + +# Few-shots (2 strong, compact) + +SHAPE_COMPLETION_FEWSHOT_USER_1 = """ +CanvasState: +{"drawings":[],"bounds":{"width":1200,"height":800}} +""" + +SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1 = { + "complete": True, + "confidence": 0.86, + "object": { + "color": "#0000FF", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "circle", + "start": {"x": 360, "y": 420}, + "end": {"x": 400, "y": 420}, + }, + }, +} + +SHAPE_COMPLETION_FEWSHOT_USER_2 = """ +CanvasState: +{"drawings":[{}],"bounds":{"width":1200,"height":800}} +""" + +SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2 = { + "complete": True, + "confidence": 0.78, + "object": { + "color": "#333333", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 500, "y": 300}, + "end": {"x": 700, "y": 420}, + }, + }, +} + + +def _get_shape_completion_initial_message( + canvas_state: dict[str, typing.Any] +) -> list[dict]: + """ + Build the few-shot seeded chat messages for shape completion. + + Args: + canvas_state (dict[str, Any]): + The current canvas state. Expected keys: + - "drawings": list of existing drawings (color, lineWidth, pathData, etc.) + - "bounds": { "width": number, "height": number } + + Returns: + list[dict]: Chat messages for OpenAI/Ollama APIs: + [system, user(few-shot), assistant(few-shot), user(few-shot), assistant(few-shot), user(actual)] + """ + canvas_json = json.dumps(canvas_state, separators=(",", ":")) + user_msg = f"CanvasState:\n{canvas_json}" + + return [ + {"role": "system", "content": SHAPE_COMPLETION_SYSTEM}, + {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_1}, + {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1)}, + {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_2}, + {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2)}, + {"role": "user", "content": user_msg}, + ] + + +def openai_complete_shape(canvas_state: dict) -> dict: + """ + Infer and complete a likely shape from the current partial input using OpenAI. + + Args: + canvas_state (dict): Current canvas (drawings + bounds). + + Returns: + dict: { complete, confidence, object{ color, lineWidth, pathData{...} } } or error payload. + """ + try: + from config import OPENAI_API_KEY + from openai import OpenAI + + client = OpenAI(api_key=OPENAI_API_KEY) + + resp = client.chat.completions.create( + model="gpt-4.1-mini", + response_format={"type": "json_object"}, + temperature=0.1, + messages=_get_shape_completion_initial_message(canvas_state), + max_tokens=220, + ) + return json.loads(resp.choices[0].message.content) + except Exception as e: + return {"error": "openai_completion_failed", "detail": str(e)} + + +def ollama_complete_shape(canvas_state: dict) -> dict: + """ + Infer and complete a likely shape from the current partial input using Ollama. + + Args: + canvas_state (dict): Current canvas (drawings + bounds). + + Returns: + dict: { complete, confidence, object{ color, lineWidth, pathData{...} } } or error payload. + """ + try: + import ollama + + response = ollama.chat( + model="llama3:8b", + messages=_get_shape_completion_initial_message(canvas_state), + ) + return json.loads(response["message"]["content"]) + except Exception as e: + return {"error": "ollama_completion_failed", "detail": str(e)} + + +def complete_shape_from_canvas(canvas_state: dict) -> dict: + """ + Perform AI-based shape completion using OpenAI first, then Ollama. + + Args: + canvas_state (dict): Current canvas (drawings + bounds). + + Returns: + dict: Inferred shape completion result. + """ + model_output = openai_complete_shape(canvas_state) + if "error" not in model_output: + return model_output + return ollama_complete_shape(canvas_state) + + +# === Canvas Beautification (canvas-state) ====================== + +BEAUTIFY_CANVAS_SYSTEM = """ +You are a drawing beautification engine for a collaborative whiteboard app. + +You receive the FULL canvas state as JSON. It typically has: +- bounds: { "width": number, "height": number } +- drawings: array of drawing objects. Each drawing may include: + - color: hex string like "#000000" + - lineWidth: number + - pathData: + For freehand strokes: + { "tool": "freehand", "type": "stroke", + "points": [ { "x": number, "y": number }, ... ] } + For straight line segments: + { "tool": "shape", "type": "line", + "start": { "x": number, "y": number }, + "end": { "x": number, "y": number } } + For rectangles/circles/polygons: + { "tool": "shape", "type": "rectangle" | "circle" | "polygon", + ... geometry fields ... } + +Your job is to BEAUTIFY the drawing while preserving the user's intent: + +- Smooth wobbly freehand strokes into cleaner, more regular curves. +- Snap nearly-straight strokes into clean straight lines. +- When the user clearly tried to draw a common geometric shape + (rectangle, circle, triangle, star, arrow, etc.), convert it into + that shape type with precise geometry. +- Preserve the overall layout and relationships: do NOT drastically + move shapes around, resize everything, or delete important content. +- Preserve colors and approximate lineWidth values whenever possible. +- Do not add text or entirely new objects that weren't implied by the + sketch. Focus on CLEANUP, not content invention. +- Try to keep the number of objects roughly the same (or slightly fewer + if you merge overlapping strokes into one clean shape). + +IMPORTANT: You MUST respond with STRICT JSON and ONLY this top-level shape: + +{ + "objects": [ + { + "color": "#RRGGBB", + "lineWidth": number, + "pathData": { + "tool": "shape" | "freehand", + "type": "line" | "circle" | "rectangle" | "polygon" | "stroke", + "start": { "x": number, "y": number }, + "end": { "x": number, "y": number }, + "points": [ { "x": number, "y": number }, ... ] + } + }, + ... + ] +} + +- For "freehand" and "polygon", provide a "points" array. +- For "line", "circle", and "rectangle", provide at least "start" and "end". +- You may omit fields that don't apply (e.g., "points" for a simple line), + but the key "pathData" must exist and include a "type" string. + +If there is nothing reasonable to improve, simply return an "objects" +array that matches the input drawings as-is (copy from canvasState.drawings). +""" + + +def _get_beautify_canvas_initial_message( + canvas_state: dict[str, typing.Any], + level: str = "medium", +) -> list[dict]: + """ + Build few-shot seeded messages for canvas beautification. + `level` can be 'light' | 'medium' | 'strong' to hint how aggressive + we want the cleanup to be. + """ + return [ + {"role": "system", "content": BEAUTIFY_CANVAS_SYSTEM}, + { + "role": "user", + "content": json.dumps( + { + "level": level, + "canvasState": canvas_state, + }, + ensure_ascii=False, + ), + }, + ] + + +def openai_beautify_canvas( + canvas_state: dict[str, typing.Any], + level: str = "medium", +) -> dict: + """ + Beautify the canvas using OpenAI. Returns either: + { "objects": [...] } + or + { "error": "...", "detail": "..." } + """ + try: + from config import OPENAI_API_KEY + from openai import OpenAI + + client = OpenAI(api_key=OPENAI_API_KEY) + + resp = client.chat.completions.create( + model="gpt-4.1-mini", + response_format={"type": "json_object"}, # forces JSON + temperature=0.15, + messages=_get_beautify_canvas_initial_message(canvas_state, level=level), + max_tokens=1200, + ) + + content = resp.choices[0].message.content + parsed = json.loads(content) + + if not isinstance(parsed, dict) or "objects" not in parsed: + return { + "error": "openai_beautify_invalid_output", + "detail": "Missing 'objects' field in model response.", + } + + if not isinstance(parsed["objects"], list): + return { + "error": "openai_beautify_invalid_output", + "detail": "'objects' is not a list in model response.", + } + + return parsed + + except Exception as e: + return {"error": "openai_beautify_failed", "detail": str(e)} + + +def ollama_beautify_canvas( + canvas_state: dict[str, typing.Any], + level: str = "medium", +) -> dict: + """ + Beautify the canvas using a local Ollama model. Same contract as + openai_beautify_canvas: either { "objects": [...] } or { "error": ... }. + """ + try: + import ollama + + response = ollama.chat( + model="llama3:8b", + messages=_get_beautify_canvas_initial_message(canvas_state, level=level), + ) + + parsed = json.loads(response["message"]["content"]) + + if not isinstance(parsed, dict) or "objects" not in parsed: + return { + "error": "ollama_beautify_invalid_output", + "detail": "Missing 'objects' field in model response.", + } + + if not isinstance(parsed["objects"], list): + return { + "error": "ollama_beautify_invalid_output", + "detail": "'objects' is not a list in model response.", + } + + return parsed + + except Exception as e: + return {"error": "ollama_beautify_failed", "detail": str(e)} + + +def beautify_canvas_state( + canvas_state: dict[str, typing.Any], + level: str = "medium", +) -> dict: + """ + Perform AI-based canvas beautification with rollback, following the + same pattern as prompt_to_drawings and complete_shape_from_canvas. + + Order: + 1) Try OpenAI. + 2) If that fails or returns invalid output, try Ollama. + 3) If both fail, ROLLBACK to the ORIGINAL drawings and return: + { "objects": canvas_state.drawings } + + Returns: + dict with at least: + { "objects": [...] } + """ + # Primary: OpenAI + model_output = openai_beautify_canvas(canvas_state, level=level) + if "error" not in model_output and "objects" in model_output: + return model_output + + # Fallback: Ollama + fallback_output = ollama_beautify_canvas(canvas_state, level=level) + if "error" not in fallback_output and "objects" in fallback_output: + return fallback_output + + # Rollback: both failed => return original drawings as objects + original_drawings = canvas_state.get("drawings", []) + return {"objects": original_drawings} From 5d54017120f365441f46ec84c2bf1d9622abe3a6 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:36:49 -0800 Subject: [PATCH 17/26] Update Toolbar.js --- frontend/src/components/Toolbar.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Toolbar.js b/frontend/src/components/Toolbar.js index 59bb103c..a1caf8b0 100644 --- a/frontend/src/components/Toolbar.js +++ b/frontend/src/components/Toolbar.js @@ -76,7 +76,8 @@ const Toolbar = ({ onClearAllFilters, canUndoFilter, canClearFilters, - appliedFilters + appliedFilters, + onToggleAI }) => { const [tool, setTool] = useState(null); const [anchorEl, setAnchorEl] = useState(null); @@ -334,6 +335,16 @@ const Toolbar = ({ + + + onToggleAI()} + > + //ai assistant panel icon + + + + Date: Thu, 4 Dec 2025 16:47:29 -0800 Subject: [PATCH 18/26] Update useAIAssistant.js --- frontend/src/hooks/useAIAssistant.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/hooks/useAIAssistant.js b/frontend/src/hooks/useAIAssistant.js index fc116091..39793eef 100644 --- a/frontend/src/hooks/useAIAssistant.js +++ b/frontend/src/hooks/useAIAssistant.js @@ -35,7 +35,7 @@ export function useAIAssistant() { } }; - // Examples of wrapper methods for each route + // Wrapper methods for each route const textToDrawing = (prompt, canvasState) => callAIAssistant("drawing", { prompt, canvasState }); const shapeCompletion = (canvasState) => callAIAssistant("complete", { canvasState }); const textToImage = (prompt) => callAIAssistant("image", { prompt }); From 94e7b562029e8d428000e7d679210279ca362eaa Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:52:26 -0800 Subject: [PATCH 19/26] Update PromptInput.jsx --- frontend/src/components/AI/PromptInput.jsx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/AI/PromptInput.jsx b/frontend/src/components/AI/PromptInput.jsx index 3eafb369..f135985c 100644 --- a/frontend/src/components/AI/PromptInput.jsx +++ b/frontend/src/components/AI/PromptInput.jsx @@ -13,8 +13,6 @@ export default function PromptInput({ const handleSubmit = async () => { if (!text.trim() || loading) return; - - // Do some processing onSubmit?.(text.trim()); }; @@ -73,11 +71,11 @@ export default function PromptInput({ cursor: 'pointer', minWidth: 100, height: 36, - color: '#17635a', // ✅ text color + color: '#17635a', fontWeight: 600, backgroundColor: '#25D8C5', '&:hover': { - backgroundColor: '#1FCBB9' // optional hover color + backgroundColor: '#1FCBB9' } }} > @@ -90,9 +88,3 @@ export default function PromptInput({
); } - -PromptInput.propTypes = { - onSubmit: PropTypes.func, - loading: PropTypes.bool, - placeholder: PropTypes.string, -}; From 0a83fc3f20a09c6ef113baa1428f6f5e006ed658 Mon Sep 17 00:00:00 2001 From: Billy Tahirou Ouattara <66051428+BillKG-exe@users.noreply.github.com> Date: Thu, 4 Dec 2025 17:00:34 -0800 Subject: [PATCH 20/26] Update image_generation_service.py --- backend/services/image_generation_service.py | 149 ------------------- 1 file changed, 149 deletions(-) diff --git a/backend/services/image_generation_service.py b/backend/services/image_generation_service.py index 31d58d35..8b137891 100644 --- a/backend/services/image_generation_service.py +++ b/backend/services/image_generation_service.py @@ -1,150 +1 @@ -""" -image_generation_service.py -Implements: -1) Text → Image generation (Stable Diffusion XL via Hugging Face Inference API) -2) Image → Canvas conversion as SVG (vectorization with potrace; base64 SVG fallback) -3) Style transfer (image-to-image, prompt-driven edits) -4) Sketch beautification (local cleanup + optional refinement) - -Requirements: - pip install huggingface_hub pillow -Optional (for true vectorization): - pip install potrace numpy pixels2svg -""" -from typing import Optional -from PIL import Image, ImageFilter, ImageOps - -from config import HUGGINGFACE_API_KEY -from huggingface_hub import InferenceClient - -# Model choices -HF_IMG_TXT2IMG = "stabilityai/stable-diffusion-xl-base-1.0" # text → image -HF_IMG_EDIT = "timbrooks/instruct-pix2pix" # image → image (edits/style) - - -def _get_hf_client() -> InferenceClient: - """ - Create and return a Hugging Face InferenceClient using HUGGINGFACE_API_KEY - from config or environment. Raises if no token is available. - """ - if not HUGGINGFACE_API_KEY: - raise RuntimeError("HUGGINGFACE_API_KEY not configured. Set in config.py or environment.") - return InferenceClient(token=HUGGINGFACE_API_KEY) - - -def generate_image_from_prompt( - prompt: str, - size: str = "1024x1024", -) -> Optional[Image.Image]: - """ - Generate an image from a natural-language text prompt via Stable Diffusion XL. - - Args: - prompt: Description of the target image. - size: Output resolution as "WxH" (e.g., "512x512", "1024x1024"). - - Returns: - PIL.Image on success, or None on failure. - """ - try: - client = _get_hf_client() - img = client.text_to_image( - model=HF_IMG_TXT2IMG, - prompt=prompt, - size=size, - ) - return img - except Exception as e: - print(f"image_generation: text_to_image failed: {e}") - return None - -def apply_style_transfer( - source_image: Image.Image, - style_prompt: str, - strength: float = 0.6, -) -> Optional[Image.Image]: - """ - Apply a target style to an input image via image-to-image diffusion. - - Args: - source_image: PIL image to restyle. - style_prompt: Text like "watercolor style", "Van Gogh style", etc. - strength: Degree of change (higher → more change). Typical: 0.2–0.8. - - Returns: - PIL.Image on success, or None on failure. - """ - try: - client = _get_hf_client() - edited = client.image_to_image( - model=HF_IMG_EDIT, # instruct-pix2pix - image=source_image, - prompt=style_prompt, - strength=strength, - ) - return edited - except Exception as e: - print(f"image_generation: style transfer failed: {e}") - return None - - -def beautify_sketch( - sketch_image: Image.Image, - level: str = "medium", - refine_with_model: bool = True, - prompt_hint: str = "clean line art, smooth curves, vector-like, high contrast", -) -> Optional[Image.Image]: - """ - Clean and beautify a rough sketch. Performs local denoise/sharpen first, - then optionally refines with an image-to-image edit model. - - Args: - sketch_image: PIL image of a line drawing or rough sketch. - level: 'light' | 'medium' | 'strong' — controls denoise strength. - refine_with_model: If True, run an img2img refinement step. - prompt_hint: Guidance text for the refinement model. - - Returns: - PIL.Image on success, or None on failure. - """ - try: - img = sketch_image.convert("L") # grayscale - img = ImageOps.autocontrast(img) # normalize contrast - - if level == "light": - img = img.filter(ImageFilter.MedianFilter(size=3)) - elif level == "medium": - img = img.filter(ImageFilter.MedianFilter(size=3)).filter( - ImageFilter.GaussianBlur(radius=0.6) - ) - else: # strong - img = img.filter(ImageFilter.MedianFilter(size=5)).filter( - ImageFilter.GaussianBlur(radius=1.0) - ) - - # Re-invert trick to emphasize edges after smoothing - img = ImageOps.invert(ImageOps.autocontrast(ImageOps.invert(img))) - - cleaned_rgb = img.convert("RGB") - - # Optional refinement via HF model - if not refine_with_model: - return cleaned_rgb - - try: - client = _get_hf_client() - refined = client.image_to_image( - model=HF_IMG_EDIT, - image=cleaned_rgb, - prompt=prompt_hint, - strength=0.35 if level == "light" else 0.5 if level == "medium" else 0.65, - ) - return refined - except Exception as e: - print(f"image_generation: beautify refine skipped: {e}") - return cleaned_rgb - - except Exception as e: - print(f"image_generation: beautify failed: {e}") - return None From 7405303fef1a493c162e9762b0e7356f9a34a5df Mon Sep 17 00:00:00 2001 From: btouatta Date: Fri, 5 Dec 2025 10:01:55 -0800 Subject: [PATCH 21/26] Testing push --- backend/routes/ai_assistant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/routes/ai_assistant.py b/backend/routes/ai_assistant.py index b4bd3021..b37b4613 100644 --- a/backend/routes/ai_assistant.py +++ b/backend/routes/ai_assistant.py @@ -15,7 +15,7 @@ def text_to_drawings(): """ Body: { "prompt": "", canvasState: {json object} } - Returns: parsed drawing JSON (shape/color/size/position/...) or an error payload. + Returns: Parsed drawing JSON (shape/color/size/position/...) or an error payload. """ try: payload = request.get_json(silent=True) or {} From 8ea224fc50931134bff24efcf487a58f0bf1ba79 Mon Sep 17 00:00:00 2001 From: btouatta Date: Fri, 5 Dec 2025 12:09:16 -0800 Subject: [PATCH 22/26] Added toolbar icon for ai assist --- backend/app.py | 41 +++++++++---------- frontend/package-lock.json | 64 ++++-------------------------- frontend/src/components/Canvas.js | 2 +- frontend/src/components/Toolbar.js | 20 ++++++---- 4 files changed, 42 insertions(+), 85 deletions(-) diff --git a/backend/app.py b/backend/app.py index 457ffb7a..db24aaea 100644 --- a/backend/app.py +++ b/backend/app.py @@ -195,24 +195,25 @@ def handle_all_exceptions(e): app.register_blueprint(analytics_bp) if __name__ == '__main__': - if not redis_client.exists('res-canvas-draw-count'): - init_count = {"id": "res-canvas-draw-count", "value": 0} - logger = __import__('logging').getLogger(__name__) - logger.error("Initialize res-canvas-draw-count if not present in Redis: ", init_count) - init_payload = { - "operation": "CREATE", - "amount": 1, - "signerPublicKey": SIGNER_PUBLIC_KEY, - "signerPrivateKey": SIGNER_PRIVATE_KEY, - "recipientPublicKey": RECIPIENT_PUBLIC_KEY, - "asset": { - "data": { - "id": "res-canvas-draw-count", - "value": 0 - } - } - } - - commit_transaction_via_graphql(init_payload) - redis_client.set('res-canvas-draw-count', 0) + # print(SIGNER_PUBLIC_KEY, SIGNER_PRIVATE_KEY, RECIPIENT_PUBLIC_KEY) + # if not redis_client.exists('res-canvas-draw-count'): + # init_count = {"id": "res-canvas-draw-count", "value": 0} + # logger = __import__('logging').getLogger(__name__) + # logger.error("Initialize res-canvas-draw-count if not present in Redis: ", init_count) + # init_payload = { + # "operation": "CREATE", + # "amount": 1, + # "signerPublicKey": SIGNER_PUBLIC_KEY, + # "signerPrivateKey": SIGNER_PRIVATE_KEY, + # "recipientPublicKey": RECIPIENT_PUBLIC_KEY, + # "asset": { + # "data": { + # "id": "res-canvas-draw-count", + # "value": 0 + # } + # } + # } + + # commit_transaction_via_graphql(init_payload) + # redis_client.set('res-canvas-draw-count', 0) socketio.run(app, debug=True, host="0.0.0.0", port=10010, allow_unsafe_werkzeug=True) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f64749d3..f1b6a622 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -96,7 +96,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -716,7 +715,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1526,7 +1524,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-module-imports": "^7.25.9", @@ -2330,7 +2327,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2374,7 +2370,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3055,7 +3050,6 @@ "version": "6.4.7", "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.7.tgz", "integrity": "sha512-K65StXUeGAtFJ4ikvHKtmDCO5Ab7g0FZUu2J5VpoKD+O6Y3CjLYzRi+TMlI3kaL4CL158+FccMoOd/eaddmeRQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.4.7", @@ -3725,6 +3719,7 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3743,6 +3738,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -4318,7 +4314,6 @@ "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4442,7 +4437,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4494,7 +4488,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4834,7 +4827,6 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4913,7 +4905,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5722,7 +5713,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -7067,7 +7057,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -7999,7 +7988,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -10828,7 +10816,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -13874,7 +13861,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -14967,7 +14953,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -15311,7 +15296,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -15474,7 +15458,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -15523,7 +15506,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16314,7 +16296,6 @@ "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -16534,7 +16515,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -18078,7 +18058,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "peer": true, "engines": { "node": ">=10" }, @@ -18618,7 +18597,6 @@ "version": "5.96.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -18686,7 +18664,6 @@ "version": "4.15.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -19085,7 +19062,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19501,7 +19477,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -19918,7 +19893,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", - "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.25.9" } @@ -20410,7 +20384,6 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "peer": true, "requires": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-module-imports": "^7.25.9", @@ -20924,7 +20897,6 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", - "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -20957,7 +20929,6 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", - "peer": true, "requires": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -21447,7 +21418,6 @@ "version": "6.4.7", "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.7.tgz", "integrity": "sha512-K65StXUeGAtFJ4ikvHKtmDCO5Ab7g0FZUu2J5VpoKD+O6Y3CjLYzRi+TMlI3kaL4CL158+FccMoOd/eaddmeRQ==", - "peer": true, "requires": { "@babel/runtime": "^7.26.0", "@mui/core-downloads-tracker": "^6.4.7", @@ -21823,6 +21793,7 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -21838,6 +21809,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "peer": true, "requires": { "dequal": "^2.0.3" } @@ -22350,7 +22322,6 @@ "version": "18.3.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", - "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -22471,7 +22442,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "peer": true, "requires": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -22497,7 +22467,6 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "peer": true, "requires": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -22754,8 +22723,7 @@ "acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "peer": true + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-globals": { "version": "6.0.0", @@ -22810,7 +22778,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -23389,7 +23356,6 @@ "version": "4.24.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "peer": true, "requires": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -24301,8 +24267,7 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "peer": true + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { "version": "3.2.0", @@ -24985,7 +24950,6 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -26941,7 +26905,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "peer": true, "requires": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -29057,7 +29020,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "peer": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -29653,7 +29615,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "peer": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -29904,7 +29865,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -30027,7 +29987,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -30063,8 +30022,7 @@ "react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "peer": true + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, "react-router": { "version": "7.0.2", @@ -30607,7 +30565,6 @@ "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "peer": true, "requires": { "fsevents": "~2.3.2" } @@ -30737,7 +30694,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -31913,8 +31869,7 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "peer": true + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" }, "type-is": { "version": "1.6.18", @@ -32290,7 +32245,6 @@ "version": "5.96.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", - "peer": true, "requires": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -32359,7 +32313,6 @@ "version": "4.15.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "peer": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -32626,7 +32579,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/frontend/src/components/Canvas.js b/frontend/src/components/Canvas.js index 1d284be9..7c6b2f07 100644 --- a/frontend/src/components/Canvas.js +++ b/frontend/src/components/Canvas.js @@ -3936,7 +3936,7 @@ function Canvas({ // enqueue backend save; use skipUndoStack to avoid 1 undo per object (optional) submissionQueueRef.current.push(async () => { - try {3 + try { await submitToDatabase( newDrawing, auth, diff --git a/frontend/src/components/Toolbar.js b/frontend/src/components/Toolbar.js index a1caf8b0..bb776490 100644 --- a/frontend/src/components/Toolbar.js +++ b/frontend/src/components/Toolbar.js @@ -21,6 +21,8 @@ import ShapeMenu from "../lib/shapeMenu"; import BrushPanel from "./BrushEditor/BrushPanel"; import MixerPanel from "./Mixer/MixerPanel"; import StampPanel from "./Stamps/StampPanel"; +import PsychologyIcon from "@mui/icons-material/Psychology"; + const actionButtonSX = { borderRadius: 1, @@ -335,16 +337,18 @@ const Toolbar = ({ - + - onToggleAI()} - > - //ai assistant panel icon - + + + - - + + Date: Fri, 5 Dec 2025 14:00:55 -0800 Subject: [PATCH 23/26] Working features except beautify --- backend/.nfs00000000f392c62d000001f0 | 72805 ++++++++++++++++ backend/routes/ai_assistant.py | 5 +- backend/services/llm_service.py | 503 +- .../src/components/AI/AIAssistantPanel.jsx | 2 +- frontend/src/components/AI/PromptInput.jsx | 1 - .../components/AI/ShapeCompletionOverlay.jsx | 42 +- frontend/src/components/Canvas.js | 24 +- frontend/src/hooks/useAIAssistant.js | 4 - 8 files changed, 73249 insertions(+), 137 deletions(-) create mode 100644 backend/.nfs00000000f392c62d000001f0 diff --git a/backend/.nfs00000000f392c62d000001f0 b/backend/.nfs00000000f392c62d000001f0 new file mode 100644 index 00000000..8bad1295 --- /dev/null +++ b/backend/.nfs00000000f392c62d000001f0 @@ -0,0 +1,72805 @@ +2025-12-05 13:41:58 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:42:02 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:42:02 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:42:03 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:42:03 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:42:03 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:42:03 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:42:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:42:04] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e44sjxxy HTTP/1.1" 200 - +2025-12-05 13:42:04 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=LkkUHaGYPd5n6cLmAAAB +2025-12-05 13:42:04 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=LkkUHaGYPd5n6cLmAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:42:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:42:04] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e494suh6&sid=XN1fu2SHGq7TtVa7AAAA HTTP/1.1" 200 - +2025-12-05 13:42:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:42:04] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e494rp53&sid=XN1fu2SHGq7TtVa7AAAA HTTP/1.1" 200 - +2025-12-05 13:43:20 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading +2025-12-05 13:43:20 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:43:24 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:43:25 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:43:25 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:43:25 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:43:25 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:43:25 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:43:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:25] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e5wu24ct HTTP/1.1" 200 - +2025-12-05 13:43:25 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=0KCTIE6EyreV8OE4AAAB +2025-12-05 13:43:25 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=0KCTIE6EyreV8OE4AAAB user=693337b5c1663e36f4063368 +2025-12-05 13:43:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:25] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e5zr00x9&sid=F0S-ZvDt-5rtJt2UAAAA HTTP/1.1" 200 - +2025-12-05 13:43:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:25] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e5zr0cvn&sid=F0S-ZvDt-5rtJt2UAAAA HTTP/1.1" 200 - +2025-12-05 13:43:27 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading +2025-12-05 13:43:28 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:43:31 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:43:32 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:43:32 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:43:32 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:43:32 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:43:32 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:43:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e630ab43 HTTP/1.1" 200 - +2025-12-05 13:43:32 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=06aLaqFVgplDq4vdAAAB +2025-12-05 13:43:32 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=06aLaqFVgplDq4vdAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:43:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e65670vn&sid=aTfpNezuptPY0f1pAAAA HTTP/1.1" 200 - +2025-12-05 13:43:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:32] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e6566jda&sid=aTfpNezuptPY0f1pAAAA HTTP/1.1" 200 - +2025-12-05 13:43:34 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading +2025-12-05 13:43:35 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:43:38 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:43:39 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:43:39 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:43:39 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:43:39 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:43:39 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:43:39 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:39] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e68eq2gm HTTP/1.1" 200 - +2025-12-05 13:43:39 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=4FpQgRflrsGiOj14AAAB +2025-12-05 13:43:39 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=4FpQgRflrsGiOj14AAAB user=693337b5c1663e36f4063368 +2025-12-05 13:43:39 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:39] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e6al7euq&sid=KTNt1h2Mp_a8uPw4AAAA HTTP/1.1" 200 - +2025-12-05 13:43:39 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:39] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e6al67rd&sid=KTNt1h2Mp_a8uPw4AAAA HTTP/1.1" 200 - +2025-12-05 13:45:17 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:45:17 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:45:21 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:45:22 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:45:22 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:45:22 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:45:22 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:45:22 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:45:22 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:22] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8f43hf1 HTTP/1.1" 200 - +2025-12-05 13:45:22 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=RQoGCla7SPmKF_51AAAB +2025-12-05 13:45:22 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=RQoGCla7SPmKF_51AAAB user=693337b5c1663e36f4063368 +2025-12-05 13:45:22 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:22] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8icq93f&sid=HWyB4aq22f8_Ok2EAAAA HTTP/1.1" 200 - +2025-12-05 13:45:22 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:22] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8icpkfu&sid=HWyB4aq22f8_Ok2EAAAA HTTP/1.1" 200 - +2025-12-05 13:45:27 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:45:27 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:45:31 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:45:32 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:45:32 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:45:32 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:45:32 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:45:32 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:45:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8mtvj1k HTTP/1.1" 200 - +2025-12-05 13:45:32 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=fAWkTLI1GoGg50zcAAAB +2025-12-05 13:45:32 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=fAWkTLI1GoGg50zcAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:45:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8q2t5ma&sid=7KDedzRNjMBLl5efAAAA HTTP/1.1" 200 - +2025-12-05 13:45:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:32] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8q2svwn&sid=7KDedzRNjMBLl5efAAAA HTTP/1.1" 200 - +2025-12-05 13:45:37 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:45:37 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:45:41 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:45:42 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:45:42 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:45:42 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:45:42 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:45:42 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:45:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:42] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8ujmmre HTTP/1.1" 200 - +2025-12-05 13:45:42 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=3JtnFy9X0AfonYT0AAAB +2025-12-05 13:45:42 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=3JtnFy9X0AfonYT0AAAB user=693337b5c1663e36f4063368 +2025-12-05 13:45:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:42] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8xsvb7r&sid=L5FijOOqXYZA1H2hAAAA HTTP/1.1" 200 - +2025-12-05 13:45:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:42] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8xsuymj&sid=L5FijOOqXYZA1H2hAAAA HTTP/1.1" 200 - +2025-12-05 13:46:52 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:46:53 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:46:57 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:46:58 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:46:58 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:46:58 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:46:58 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:46:58 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:46:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:46:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eah6qxyc HTTP/1.1" 200 - +2025-12-05 13:46:58 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=G2bYxCgTh3loeqHhAAAB +2025-12-05 13:46:58 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=G2bYxCgTh3loeqHhAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:46:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:46:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eak92cjn&sid=ygJJRhHymYksWoQ4AAAA HTTP/1.1" 200 - +2025-12-05 13:46:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:46:58] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eak92jig&sid=ygJJRhHymYksWoQ4AAAA HTTP/1.1" 200 - +2025-12-05 13:47:02 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:47:02 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:47:06 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:47:07 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:47:07 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:47:07 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:47:07 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:47:07 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:47:08 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:08] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eao4rs82 HTTP/1.1" 200 - +2025-12-05 13:47:08 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=3GY1gtap79y9OAbDAAAB +2025-12-05 13:47:08 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=3GY1gtap79y9OAbDAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:47:08 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:08] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eas20i2z&sid=mxZTdbqNIDIBY7cvAAAA HTTP/1.1" 200 - +2025-12-05 13:47:08 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:08] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eas1zfxt&sid=mxZTdbqNIDIBY7cvAAAA HTTP/1.1" 200 - +2025-12-05 13:47:35 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:47:36 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:47:40 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:47:41 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:47:41 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:47:41 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:47:41 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:47:41 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:47:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebed7yje HTTP/1.1" 200 - +2025-12-05 13:47:41 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=0jqZzlYt6GNZfsAhAAAB +2025-12-05 13:47:41 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=0jqZzlYt6GNZfsAhAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:47:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebhbg0kz&sid=Em6LkRcf2hYn51RUAAAA HTTP/1.1" 200 - +2025-12-05 13:47:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:41] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebhbgyhu&sid=Em6LkRcf2hYn51RUAAAA HTTP/1.1" 200 - +2025-12-05 13:47:50 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:47:50 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:47:55 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:47:55 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:47:56 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:47:56 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:47:56 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:47:56 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:47:56 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:56] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebp62eq5 HTTP/1.1" 200 - +2025-12-05 13:47:56 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=r7DKxmneZm5EmQwxAAAB +2025-12-05 13:47:56 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=r7DKxmneZm5EmQwxAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:47:56 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:56] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebsr2q72&sid=kreRxV12yHLrpRKjAAAA HTTP/1.1" 200 - +2025-12-05 13:47:56 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:56] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebsr1oyz&sid=kreRxV12yHLrpRKjAAAA HTTP/1.1" 200 - +2025-12-05 13:48:02 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:48:03 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:48:07 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:48:08 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:48:08 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:48:08 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:48:08 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:48:08 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:48:09 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:09] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebz765q0 HTTP/1.1" 200 - +2025-12-05 13:48:09 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=IYCyIGQWi63MZ14eAAAB +2025-12-05 13:48:09 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=IYCyIGQWi63MZ14eAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:48:09 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:09] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ec37se9p&sid=IguH4qFqvn1QmBLoAAAA HTTP/1.1" 200 - +2025-12-05 13:48:09 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:09] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ec37rt3m&sid=IguH4qFqvn1QmBLoAAAA HTTP/1.1" 200 - +2025-12-05 13:48:19 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading +2025-12-05 13:48:19 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:48:23 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:48:24 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:48:24 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:48:24 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:48:24 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:48:24 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:48:24 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:24] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecbjmwiw HTTP/1.1" 200 - +2025-12-05 13:48:24 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=Kd_Kym6IxK8knBebAAAB +2025-12-05 13:48:24 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=Kd_Kym6IxK8knBebAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:48:24 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:24] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eceesb1x&sid=L9b8xKVnKagyawbSAAAA HTTP/1.1" 200 - +2025-12-05 13:48:24 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:24] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eceeranc&sid=L9b8xKVnKagyawbSAAAA HTTP/1.1" 200 - +2025-12-05 13:48:43 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading +2025-12-05 13:48:43 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:48:47 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:48:48 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:48:48 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:48:48 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:48:49 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:48:49 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:48:49 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:49] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecu2alx0 HTTP/1.1" 200 - +2025-12-05 13:48:49 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=_5nWAWjVY9ItJOzUAAAB +2025-12-05 13:48:49 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=_5nWAWjVY9ItJOzUAAAB user=693337b5c1663e36f4063368 +2025-12-05 13:48:49 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:49] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecxj64cs&sid=ThdHWaVvuzGAIB9VAAAA HTTP/1.1" 200 - +2025-12-05 13:48:49 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:49] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecxj54b4&sid=ThdHWaVvuzGAIB9VAAAA HTTP/1.1" 200 - +2025-12-05 13:49:04 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading +2025-12-05 13:49:05 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:49:09 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 +2025-12-05 13:49:10 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: +2025-12-05 13:49:10 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers +2025-12-05 13:49:10 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers +2025-12-05 13:49:10 [WARNING] werkzeug:97 – * Debugger is active! +2025-12-05 13:49:10 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 +2025-12-05 13:49:11 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:11] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eda9mnek HTTP/1.1" 200 - +2025-12-05 13:49:11 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=rn7mEChoVe5Jaig2AAAB +2025-12-05 13:49:11 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=rn7mEChoVe5Jaig2AAAB user=693337b5c1663e36f4063368 +2025-12-05 13:49:11 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:11] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edenv9pj&sid=WJcUM-3L40jWusjyAAAA HTTP/1.1" 200 - +2025-12-05 13:49:11 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:11] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edenvmuv&sid=WJcUM-3L40jWusjyAAAA HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=WJcUM-3L40jWusjyAAAA HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:25 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} +2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:26 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edqgzgxv HTTP/1.1" 200 - +2025-12-05 13:49:26 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=ac7PjBQZNZQef5kTAAAD +2025-12-05 13:49:26 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=ac7PjBQZNZQef5kTAAAD user=693337b5c1663e36f4063368 +2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edqhb298&sid=ME9TcIC7EmYrltysAAAC HTTP/1.1" 200 - +2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edqha15n&sid=ME9TcIC7EmYrltysAAAC HTTP/1.1" 200 - +2025-12-05 13:49:26 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 +2025-12-05 13:49:26 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=ac7PjBQZNZQef5kTAAAD room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara +2025-12-05 13:49:26 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'ac7PjBQZNZQef5kTAAAD', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} +2025-12-05 13:49:26 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:26 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:26 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=ac7PjBQZNZQef5kTAAAD had_cached_claims=True +2025-12-05 13:49:27 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:27 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:27 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:27 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:27 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:27 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:27 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:27 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:27 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:27 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:27 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:27 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:27 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:27 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:27] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:27 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:28 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:28 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:28 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:28 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:28 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:28 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:28 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:28 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:28 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:28 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:28 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:28 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:28 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:28 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:28 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:28 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:28] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:28 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:29 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:29 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:30 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:30 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:30 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:30 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:30 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:30 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:30 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:30 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:30 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:30 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:30 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:30 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:30 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:30 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:30] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=ME9TcIC7EmYrltysAAAC HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:31 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:32 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:32 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edv3mhha HTTP/1.1" 200 - +2025-12-05 13:49:32 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=Jrrtdn1JqDu4SkDZAAAF +2025-12-05 13:49:32 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=Jrrtdn1JqDu4SkDZAAAF user=693337b5c1663e36f4063368 +2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edv3vcft&sid=vR4EhT0qfu4uv9wvAAAE HTTP/1.1" 200 - +2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edv3usc9&sid=vR4EhT0qfu4uv9wvAAAE HTTP/1.1" 200 - +2025-12-05 13:49:32 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 +2025-12-05 13:49:32 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=Jrrtdn1JqDu4SkDZAAAF room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara +2025-12-05 13:49:32 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'Jrrtdn1JqDu4SkDZAAAF', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} +2025-12-05 13:49:32 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=Jrrtdn1JqDu4SkDZAAAF had_cached_claims=True +2025-12-05 13:49:33 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:33 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:33 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:33 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:33 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:33 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:33 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:33 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:33 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:33 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:33 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:33 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:33 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:33 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:33] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:33 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:33 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:33 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:34 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:34 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:34 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:34 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:34 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:34 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:34 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:34 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:34 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:34 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:34 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:34 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:34 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:34 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:34] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:34 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:35 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:35 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:35 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:35 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:35 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:35 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:35 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:35 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:35 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:35 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:35 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:35 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:35 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:35 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:35 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:35 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:35] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=vR4EhT0qfu4uv9wvAAAE HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:40 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:41 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:41 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ee21m40i HTTP/1.1" 200 - +2025-12-05 13:49:41 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=op9Ci6dAzqydBWJbAAAH +2025-12-05 13:49:41 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=op9Ci6dAzqydBWJbAAAH user=693337b5c1663e36f4063368 +2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ee21vzaf&sid=BBrbtykpS2oxaYvuAAAG HTTP/1.1" 200 - +2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ee21uua5&sid=BBrbtykpS2oxaYvuAAAG HTTP/1.1" 200 - +2025-12-05 13:49:41 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 +2025-12-05 13:49:41 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=op9Ci6dAzqydBWJbAAAH room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara +2025-12-05 13:49:41 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'op9Ci6dAzqydBWJbAAAH', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} +2025-12-05 13:49:41 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=op9Ci6dAzqydBWJbAAAH had_cached_claims=True +2025-12-05 13:49:42 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:42 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:42 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:42 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:42 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:42 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:42 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:42 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:42 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:42 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:42 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:42 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:42 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:42] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:42 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:42 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:42 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:43 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:43 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:43 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:43 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:43 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:43 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:43 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:43 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:43 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:43 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:43 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:43 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:43 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:43 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:43] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:43 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:44 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:44 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:44 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:44 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:44 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:44 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:44 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:44 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:44 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:44 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:44 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:44 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:44 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:44 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:44 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:44 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:44] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=BBrbtykpS2oxaYvuAAAG HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} +2025-12-05 13:49:57 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:58 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eef5unxm HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=HwlCgOJhcM7mCCWxAAAJ +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=HwlCgOJhcM7mCCWxAAAJ user=693337b5c1663e36f4063368 +2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eef6q7en&sid=f-H49NUyWfouRGswAAAI HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eef6pcy6&sid=f-H49NUyWfouRGswAAAI HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 +2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=HwlCgOJhcM7mCCWxAAAJ room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'HwlCgOJhcM7mCCWxAAAJ', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} +2025-12-05 13:49:58 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=HwlCgOJhcM7mCCWxAAAJ had_cached_claims=True +2025-12-05 13:49:59 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:49:59 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:59] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:49:59 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:49:59 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:49:59 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:49:59 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:49:59 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:49:59 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:59 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:49:59 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:59 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:49:59 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:49:59 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:49:59 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:49:59 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:59] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:49:59 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:49:59 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} +2025-12-05 13:49:59 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=HwlCgOJhcM7mCCWxAAAJ room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara +2025-12-05 13:49:59 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'HwlCgOJhcM7mCCWxAAAJ', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} +2025-12-05 13:49:59 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=HwlCgOJhcM7mCCWxAAAJ had_cached_claims=True +2025-12-05 13:49:59 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:49:59 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:50:00 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:50:00 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:50:00 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:50:00 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:50:00 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:50:00 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:50:00 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:00 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:50:00 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:00 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:50:00 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:50:00 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:00 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:50:00 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=f-H49NUyWfouRGswAAAI HTTP/1.1" 200 - +2025-12-05 13:50:00 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} +2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - +2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - +2025-12-05 13:50:01 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:50:01 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:50:01 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eehh6t1u HTTP/1.1" 200 - +2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:50:01 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:50:01 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:50:01 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=m18YlUK9qfl01DLMAAAL +2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eehhkuf3&sid=NpPo63MDbKr1DeWTAAAK HTTP/1.1" 200 - +2025-12-05 13:50:01 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:50:01 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=m18YlUK9qfl01DLMAAAL user=693337b5c1663e36f4063368 +2025-12-05 13:50:01 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eehhjw4h&sid=NpPo63MDbKr1DeWTAAAK HTTP/1.1" 200 - +2025-12-05 13:50:01 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:50:01 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:01 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:50:01 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:01 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:50:01 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:50:01 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:01 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:50:01 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 +2025-12-05 13:50:01 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=m18YlUK9qfl01DLMAAAL room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara +2025-12-05 13:50:01 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'm18YlUK9qfl01DLMAAAL', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} +2025-12-05 13:50:01 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:50:01 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=m18YlUK9qfl01DLMAAAL had_cached_claims=True +2025-12-05 13:50:02 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:50:02 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:50:02 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:50:02 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:50:02 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:50:03 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:50:03 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:50:03 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:50:03 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:50:03 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:50:03 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:03 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:50:03 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:03 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:50:03 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:50:03 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:03 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:03 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:03] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:50:03 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:50:03 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:50:03 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:50:04 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:50:04 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:50:04 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:50:04 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:50:04 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:50:04 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:50:04 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:04 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:50:04 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:04 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:50:04 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:50:04 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:04 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:04] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:50:04 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:50:05 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:50:05 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:50:05 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:50:05 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:50:05 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:50:05 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:50:05 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:50:05 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:50:05 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:05 [WARNING] routes.rooms:1458 – +Stroke 1 complete data: +2025-12-05 13:50:05 [WARNING] routes.rooms:1459 – { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:05 [WARNING] routes.rooms:1461 – ================================================================================ +2025-12-05 13:50:05 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes +2025-12-05 13:50:05 [INFO] routes.rooms:1466 – Stroke 0: { + "drawingId": "drawing_1764970477037_oi8l0skpm", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 464, + "y": 301.234375 + }, + { + "x": 467, + "y": 300.234375 + }, + { + "x": 468, + "y": 297.234375 + }, + { + "x": 473, + "y": 290.234375 + }, + { + "x": 476, + "y": 282.234375 + }, + { + "x": 482, + "y": 274.234375 + }, + { + "x": 493, + "y": 255.234375 + }, + { + "x": 497, + "y": 247.234375 + }, + { + "x": 502, + "y": 236.234375 + }, + { + "x": 506, + "y": 230.234375 + }, + { + "x": 507, + "y": 224.234375 + }, + { + "x": 511, + "y": 219.234375 + }, + { + "x": 512, + "y": 215.234375 + }, + { + "x": 513, + "y": 212.234375 + }, + { + "x": 513, + "y": 211.234375 + }, + { + "x": 514, + "y": 209.234375 + }, + { + "x": 515, + "y": 208.234375 + }, + { + "x": 515, + "y": 207.234375 + }, + { + "x": 516, + "y": 206.234375 + }, + { + "x": 517, + "y": 204.234375 + }, + { + "x": 517, + "y": 203.234375 + }, + { + "x": 518, + "y": 201.234375 + }, + { + "x": 520, + "y": 199.234375 + }, + { + "x": 521, + "y": 197.234375 + }, + { + "x": 522, + "y": 196.234375 + }, + { + "x": 523, + "y": 198.234375 + }, + { + "x": 525, + "y": 200.234375 + }, + { + "x": 525, + "y": 203.234375 + }, + { + "x": 527, + "y": 207.234375 + }, + { + "x": 530, + "y": 209.234375 + }, + { + "x": 531, + "y": 211.234375 + }, + { + "x": 532, + "y": 213.234375 + }, + { + "x": 533, + "y": 216.234375 + }, + { + "x": 535, + "y": 218.234375 + }, + { + "x": 536, + "y": 222.234375 + }, + { + "x": 536, + "y": 223.234375 + }, + { + "x": 537, + "y": 226.234375 + }, + { + "x": 538, + "y": 229.234375 + }, + { + "x": 540, + "y": 232.234375 + }, + { + "x": 541, + "y": 234.234375 + }, + { + "x": 542, + "y": 238.234375 + }, + { + "x": 543, + "y": 242.234375 + }, + { + "x": 545, + "y": 245.234375 + }, + { + "x": 546, + "y": 247.234375 + }, + { + "x": 547, + "y": 249.234375 + }, + { + "x": 547, + "y": 250.234375 + }, + { + "x": 548, + "y": 253.234375 + }, + { + "x": 548, + "y": 254.234375 + }, + { + "x": 551, + "y": 258.234375 + }, + { + "x": 552, + "y": 259.234375 + }, + { + "x": 553, + "y": 261.234375 + }, + { + "x": 553, + "y": 262.234375 + }, + { + "x": 555, + "y": 264.234375 + }, + { + "x": 555, + "y": 265.234375 + }, + { + "x": 556, + "y": 266.234375 + }, + { + "x": 556, + "y": 267.234375 + }, + { + "x": 557, + "y": 269.234375 + }, + { + "x": 557, + "y": 270.234375 + }, + { + "x": 558, + "y": 271.234375 + }, + { + "x": 558, + "y": 272.234375 + }, + { + "x": 558, + "y": 273.234375 + }, + { + "x": 558, + "y": 274.234375 + }, + { + "x": 559, + "y": 275.234375 + }, + { + "x": 560, + "y": 276.234375 + }, + { + "x": 561, + "y": 278.234375 + }, + { + "x": 561, + "y": 279.234375 + }, + { + "x": 562, + "y": 281.234375 + }, + { + "x": 562, + "y": 282.234375 + }, + { + "x": 563, + "y": 283.234375 + }, + { + "x": 563, + "y": 284.234375 + }, + { + "x": 564, + "y": 284.234375 + }, + { + "x": 565, + "y": 285.234375 + }, + { + "x": 565, + "y": 286.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 565, + "y": 287.234375 + }, + { + "x": 566, + "y": 288.234375 + }, + { + "x": 567, + "y": 290.234375 + }, + { + "x": 567, + "y": 291.234375 + }, + { + "x": 569, + "y": 293.234375 + }, + { + "x": 570, + "y": 296.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 570, + "y": 297.234375 + }, + { + "x": 571, + "y": 297.234375 + }, + { + "x": 572, + "y": 297.234375 + }, + { + "x": 573, + "y": 297.234375 + }, + { + "x": 574, + "y": 297.234375 + }, + { + "x": 576, + "y": 297.234375 + }, + { + "x": 578, + "y": 297.234375 + }, + { + "x": 581, + "y": 297.234375 + }, + { + "x": 582, + "y": 297.234375 + }, + { + "x": 583, + "y": 297.234375 + }, + { + "x": 586, + "y": 297.234375 + }, + { + "x": 587, + "y": 297.234375 + }, + { + "x": 588, + "y": 297.234375 + }, + { + "x": 589, + "y": 297.234375 + }, + { + "x": 591, + "y": 297.234375 + }, + { + "x": 592, + "y": 297.234375 + }, + { + "x": 594, + "y": 297.234375 + }, + { + "x": 596, + "y": 297.234375 + }, + { + "x": 597, + "y": 297.234375 + }, + { + "x": 599, + "y": 297.234375 + }, + { + "x": 601, + "y": 297.234375 + }, + { + "x": 603, + "y": 297.234375 + }, + { + "x": 607, + "y": 297.234375 + }, + { + "x": 608, + "y": 297.234375 + }, + { + "x": 611, + "y": 297.234375 + }, + { + "x": 613, + "y": 297.234375 + }, + { + "x": 616, + "y": 297.234375 + }, + { + "x": 618, + "y": 297.234375 + }, + { + "x": 621, + "y": 297.234375 + }, + { + "x": 622, + "y": 297.234375 + }, + { + "x": 624, + "y": 297.234375 + }, + { + "x": 626, + "y": 297.234375 + }, + { + "x": 627, + "y": 297.234375 + }, + { + "x": 629, + "y": 297.234375 + }, + { + "x": 631, + "y": 297.234375 + }, + { + "x": 633, + "y": 297.234375 + }, + { + "x": 636, + "y": 297.234375 + }, + { + "x": 637, + "y": 297.234375 + }, + { + "x": 638, + "y": 297.234375 + }, + { + "x": 639, + "y": 297.234375 + }, + { + "x": 642, + "y": 297.234375 + }, + { + "x": 643, + "y": 297.234375 + }, + { + "x": 646, + "y": 297.234375 + }, + { + "x": 647, + "y": 297.234375 + }, + { + "x": 648, + "y": 297.234375 + }, + { + "x": 651, + "y": 297.234375 + }, + { + "x": 652, + "y": 297.234375 + }, + { + "x": 653, + "y": 297.234375 + }, + { + "x": 654, + "y": 297.234375 + }, + { + "x": 656, + "y": 297.234375 + }, + { + "x": 658, + "y": 297.234375 + }, + { + "x": 659, + "y": 297.234375 + }, + { + "x": 662, + "y": 297.234375 + }, + { + "x": 663, + "y": 297.234375 + }, + { + "x": 664, + "y": 297.234375 + }, + { + "x": 666, + "y": 297.234375 + }, + { + "x": 668, + "y": 297.234375 + }, + { + "x": 669, + "y": 297.234375 + }, + { + "x": 671, + "y": 297.234375 + }, + { + "x": 672, + "y": 297.234375 + }, + { + "x": 673, + "y": 297.234375 + }, + { + "x": 676, + "y": 297.234375 + }, + { + "x": 677, + "y": 297.234375 + }, + { + "x": 678, + "y": 297.234375 + }, + { + "x": 679, + "y": 297.234375 + }, + { + "x": 681, + "y": 297.234375 + }, + { + "x": 682, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 683, + "y": 297.234375 + }, + { + "x": 685, + "y": 297.234375 + }, + { + "x": 686, + "y": 298.234375 + }, + { + "x": 686, + "y": 299.234375 + }, + { + "x": 685, + "y": 300.234375 + }, + { + "x": 684, + "y": 301.234375 + }, + { + "x": 683, + "y": 303.234375 + }, + { + "x": 681, + "y": 304.234375 + }, + { + "x": 680, + "y": 306.234375 + }, + { + "x": 679, + "y": 308.234375 + }, + { + "x": 678, + "y": 310.234375 + }, + { + "x": 676, + "y": 311.234375 + }, + { + "x": 674, + "y": 312.234375 + }, + { + "x": 672, + "y": 313.234375 + }, + { + "x": 670, + "y": 314.234375 + }, + { + "x": 669, + "y": 316.234375 + }, + { + "x": 668, + "y": 317.234375 + }, + { + "x": 666, + "y": 319.234375 + }, + { + "x": 665, + "y": 320.234375 + }, + { + "x": 664, + "y": 323.234375 + }, + { + "x": 663, + "y": 325.234375 + }, + { + "x": 662, + "y": 327.234375 + }, + { + "x": 659, + "y": 330.234375 + }, + { + "x": 657, + "y": 332.234375 + }, + { + "x": 656, + "y": 333.234375 + }, + { + "x": 655, + "y": 334.234375 + }, + { + "x": 654, + "y": 335.234375 + }, + { + "x": 652, + "y": 337.234375 + }, + { + "x": 651, + "y": 338.234375 + }, + { + "x": 651, + "y": 339.234375 + }, + { + "x": 650, + "y": 341.234375 + }, + { + "x": 649, + "y": 342.234375 + }, + { + "x": 648, + "y": 344.234375 + }, + { + "x": 647, + "y": 346.234375 + }, + { + "x": 646, + "y": 347.234375 + }, + { + "x": 646, + "y": 349.234375 + }, + { + "x": 645, + "y": 350.234375 + }, + { + "x": 644, + "y": 351.234375 + }, + { + "x": 643, + "y": 353.234375 + }, + { + "x": 643, + "y": 354.234375 + }, + { + "x": 641, + "y": 356.234375 + }, + { + "x": 640, + "y": 357.234375 + }, + { + "x": 639, + "y": 359.234375 + }, + { + "x": 636, + "y": 362.234375 + }, + { + "x": 635, + "y": 363.234375 + }, + { + "x": 634, + "y": 365.234375 + }, + { + "x": 632, + "y": 368.234375 + }, + { + "x": 631, + "y": 369.234375 + }, + { + "x": 630, + "y": 371.234375 + }, + { + "x": 629, + "y": 372.234375 + }, + { + "x": 628, + "y": 373.234375 + }, + { + "x": 628, + "y": 375.234375 + }, + { + "x": 627, + "y": 376.234375 + }, + { + "x": 625, + "y": 377.234375 + }, + { + "x": 623, + "y": 379.234375 + }, + { + "x": 621, + "y": 381.234375 + }, + { + "x": 620, + "y": 382.234375 + }, + { + "x": 619, + "y": 382.234375 + }, + { + "x": 616, + "y": 383.234375 + }, + { + "x": 616, + "y": 384.234375 + }, + { + "x": 615, + "y": 385.234375 + }, + { + "x": 609, + "y": 391.234375 + }, + { + "x": 608, + "y": 392.234375 + }, + { + "x": 607, + "y": 393.234375 + }, + { + "x": 605, + "y": 394.234375 + }, + { + "x": 604, + "y": 394.234375 + }, + { + "x": 602, + "y": 396.234375 + }, + { + "x": 601, + "y": 397.234375 + }, + { + "x": 599, + "y": 398.234375 + }, + { + "x": 598, + "y": 399.234375 + }, + { + "x": 597, + "y": 400.234375 + }, + { + "x": 596, + "y": 402.234375 + }, + { + "x": 594, + "y": 403.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 594, + "y": 405.234375 + }, + { + "x": 593, + "y": 406.234375 + }, + { + "x": 593, + "y": 407.234375 + }, + { + "x": 593, + "y": 408.234375 + }, + { + "x": 595, + "y": 412.234375 + }, + { + "x": 596, + "y": 414.234375 + }, + { + "x": 597, + "y": 417.234375 + }, + { + "x": 598, + "y": 420.234375 + }, + { + "x": 602, + "y": 423.234375 + }, + { + "x": 603, + "y": 425.234375 + }, + { + "x": 604, + "y": 426.234375 + }, + { + "x": 604, + "y": 429.234375 + }, + { + "x": 606, + "y": 430.234375 + }, + { + "x": 607, + "y": 431.234375 + }, + { + "x": 609, + "y": 433.234375 + }, + { + "x": 609, + "y": 435.234375 + }, + { + "x": 611, + "y": 437.234375 + }, + { + "x": 612, + "y": 438.234375 + }, + { + "x": 614, + "y": 439.234375 + }, + { + "x": 614, + "y": 440.234375 + }, + { + "x": 616, + "y": 442.234375 + }, + { + "x": 617, + "y": 443.234375 + }, + { + "x": 618, + "y": 444.234375 + }, + { + "x": 619, + "y": 446.234375 + }, + { + "x": 620, + "y": 448.234375 + }, + { + "x": 621, + "y": 449.234375 + }, + { + "x": 622, + "y": 450.234375 + }, + { + "x": 623, + "y": 453.234375 + }, + { + "x": 623, + "y": 454.234375 + }, + { + "x": 624, + "y": 455.234375 + }, + { + "x": 626, + "y": 457.234375 + }, + { + "x": 627, + "y": 458.234375 + }, + { + "x": 627, + "y": 459.234375 + }, + { + "x": 628, + "y": 462.234375 + }, + { + "x": 629, + "y": 465.234375 + }, + { + "x": 631, + "y": 467.234375 + }, + { + "x": 633, + "y": 471.234375 + }, + { + "x": 634, + "y": 473.234375 + }, + { + "x": 634, + "y": 475.234375 + }, + { + "x": 636, + "y": 477.234375 + }, + { + "x": 637, + "y": 480.234375 + }, + { + "x": 638, + "y": 482.234375 + }, + { + "x": 638, + "y": 484.234375 + }, + { + "x": 639, + "y": 485.234375 + }, + { + "x": 641, + "y": 488.234375 + }, + { + "x": 642, + "y": 489.234375 + }, + { + "x": 642, + "y": 490.234375 + }, + { + "x": 642, + "y": 491.234375 + }, + { + "x": 643, + "y": 492.234375 + }, + { + "x": 643, + "y": 494.234375 + }, + { + "x": 644, + "y": 495.234375 + }, + { + "x": 644, + "y": 496.234375 + }, + { + "x": 644, + "y": 497.234375 + }, + { + "x": 646, + "y": 499.234375 + }, + { + "x": 646, + "y": 501.234375 + }, + { + "x": 647, + "y": 502.234375 + }, + { + "x": 647, + "y": 504.234375 + }, + { + "x": 647, + "y": 505.234375 + }, + { + "x": 647, + "y": 506.234375 + }, + { + "x": 648, + "y": 507.234375 + }, + { + "x": 648, + "y": 509.234375 + }, + { + "x": 649, + "y": 511.234375 + }, + { + "x": 649, + "y": 512.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 513.234375 + }, + { + "x": 650, + "y": 514.234375 + }, + { + "x": 647, + "y": 514.234375 + }, + { + "x": 644, + "y": 512.234375 + }, + { + "x": 643, + "y": 511.234375 + }, + { + "x": 641, + "y": 511.234375 + }, + { + "x": 637, + "y": 509.234375 + }, + { + "x": 635, + "y": 508.234375 + }, + { + "x": 634, + "y": 507.234375 + }, + { + "x": 631, + "y": 506.234375 + }, + { + "x": 629, + "y": 504.234375 + }, + { + "x": 626, + "y": 503.234375 + }, + { + "x": 623, + "y": 501.234375 + }, + { + "x": 621, + "y": 501.234375 + }, + { + "x": 618, + "y": 498.234375 + }, + { + "x": 614, + "y": 497.234375 + }, + { + "x": 610, + "y": 495.234375 + }, + { + "x": 609, + "y": 494.234375 + }, + { + "x": 605, + "y": 491.234375 + }, + { + "x": 604, + "y": 490.234375 + }, + { + "x": 601, + "y": 488.234375 + }, + { + "x": 599, + "y": 487.234375 + }, + { + "x": 597, + "y": 486.234375 + }, + { + "x": 596, + "y": 485.234375 + }, + { + "x": 593, + "y": 484.234375 + }, + { + "x": 591, + "y": 482.234375 + }, + { + "x": 588, + "y": 480.234375 + }, + { + "x": 586, + "y": 478.234375 + }, + { + "x": 584, + "y": 477.234375 + }, + { + "x": 580, + "y": 475.234375 + }, + { + "x": 578, + "y": 473.234375 + }, + { + "x": 575, + "y": 471.234375 + }, + { + "x": 571, + "y": 468.234375 + }, + { + "x": 569, + "y": 467.234375 + }, + { + "x": 566, + "y": 465.234375 + }, + { + "x": 562, + "y": 461.234375 + }, + { + "x": 558, + "y": 459.234375 + }, + { + "x": 556, + "y": 457.234375 + }, + { + "x": 553, + "y": 455.234375 + }, + { + "x": 550, + "y": 452.234375 + }, + { + "x": 548, + "y": 450.234375 + }, + { + "x": 543, + "y": 446.234375 + }, + { + "x": 541, + "y": 444.234375 + }, + { + "x": 535, + "y": 441.234375 + }, + { + "x": 530, + "y": 437.234375 + }, + { + "x": 525, + "y": 433.234375 + }, + { + "x": 521, + "y": 431.234375 + }, + { + "x": 518, + "y": 428.234375 + }, + { + "x": 515, + "y": 426.234375 + }, + { + "x": 513, + "y": 426.234375 + }, + { + "x": 512, + "y": 425.234375 + }, + { + "x": 510, + "y": 424.234375 + }, + { + "x": 508, + "y": 422.234375 + }, + { + "x": 507, + "y": 422.234375 + }, + { + "x": 506, + "y": 422.234375 + }, + { + "x": 506, + "y": 421.234375 + }, + { + "x": 506, + "y": 420.234375 + }, + { + "x": 505, + "y": 419.234375 + }, + { + "x": 504, + "y": 418.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 503, + "y": 417.234375 + }, + { + "x": 501, + "y": 420.234375 + }, + { + "x": 499, + "y": 423.234375 + }, + { + "x": 498, + "y": 425.234375 + }, + { + "x": 496, + "y": 428.234375 + }, + { + "x": 492, + "y": 432.234375 + }, + { + "x": 489, + "y": 435.234375 + }, + { + "x": 487, + "y": 437.234375 + }, + { + "x": 481, + "y": 441.234375 + }, + { + "x": 476, + "y": 443.234375 + }, + { + "x": 472, + "y": 447.234375 + }, + { + "x": 469, + "y": 448.234375 + }, + { + "x": 466, + "y": 451.234375 + }, + { + "x": 463, + "y": 453.234375 + }, + { + "x": 460, + "y": 454.234375 + }, + { + "x": 456, + "y": 457.234375 + }, + { + "x": 453, + "y": 460.234375 + }, + { + "x": 449, + "y": 463.234375 + }, + { + "x": 445, + "y": 465.234375 + }, + { + "x": 440, + "y": 469.234375 + }, + { + "x": 437, + "y": 471.234375 + }, + { + "x": 434, + "y": 474.234375 + }, + { + "x": 430, + "y": 477.234375 + }, + { + "x": 426, + "y": 481.234375 + }, + { + "x": 423, + "y": 484.234375 + }, + { + "x": 420, + "y": 486.234375 + }, + { + "x": 418, + "y": 488.234375 + }, + { + "x": 415, + "y": 491.234375 + }, + { + "x": 414, + "y": 492.234375 + }, + { + "x": 414, + "y": 494.234375 + }, + { + "x": 414, + "y": 495.234375 + }, + { + "x": 413, + "y": 497.234375 + }, + { + "x": 413, + "y": 499.234375 + }, + { + "x": 412, + "y": 501.234375 + }, + { + "x": 411, + "y": 502.234375 + }, + { + "x": 410, + "y": 503.234375 + }, + { + "x": 410, + "y": 504.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 505.234375 + }, + { + "x": 409, + "y": 506.234375 + }, + { + "x": 408, + "y": 507.234375 + }, + { + "x": 408, + "y": 508.234375 + }, + { + "x": 407, + "y": 509.234375 + }, + { + "x": 406, + "y": 511.234375 + }, + { + "x": 405, + "y": 512.234375 + }, + { + "x": 404, + "y": 514.234375 + }, + { + "x": 403, + "y": 515.234375 + }, + { + "x": 401, + "y": 516.234375 + }, + { + "x": 400, + "y": 517.234375 + }, + { + "x": 399, + "y": 519.234375 + }, + { + "x": 398, + "y": 520.234375 + }, + { + "x": 395, + "y": 521.234375 + }, + { + "x": 394, + "y": 522.234375 + }, + { + "x": 393, + "y": 522.234375 + }, + { + "x": 391, + "y": 522.234375 + }, + { + "x": 389, + "y": 523.234375 + }, + { + "x": 388, + "y": 524.234375 + }, + { + "x": 386, + "y": 524.234375 + }, + { + "x": 385, + "y": 525.234375 + }, + { + "x": 384, + "y": 525.234375 + }, + { + "x": 383, + "y": 525.234375 + }, + { + "x": 383, + "y": 526.234375 + }, + { + "x": 382, + "y": 526.234375 + }, + { + "x": 380, + "y": 524.234375 + }, + { + "x": 379, + "y": 522.234375 + }, + { + "x": 378, + "y": 519.234375 + }, + { + "x": 376, + "y": 515.234375 + }, + { + "x": 376, + "y": 513.234375 + }, + { + "x": 375, + "y": 509.234375 + }, + { + "x": 375, + "y": 507.234375 + }, + { + "x": 375, + "y": 503.234375 + }, + { + "x": 375, + "y": 498.234375 + }, + { + "x": 375, + "y": 494.234375 + }, + { + "x": 375, + "y": 491.234375 + }, + { + "x": 375, + "y": 486.234375 + }, + { + "x": 375, + "y": 482.234375 + }, + { + "x": 375, + "y": 477.234375 + }, + { + "x": 375, + "y": 474.234375 + }, + { + "x": 375, + "y": 470.234375 + }, + { + "x": 376, + "y": 467.234375 + }, + { + "x": 378, + "y": 464.234375 + }, + { + "x": 378, + "y": 461.234375 + }, + { + "x": 379, + "y": 457.234375 + }, + { + "x": 380, + "y": 453.234375 + }, + { + "x": 382, + "y": 450.234375 + }, + { + "x": 383, + "y": 448.234375 + }, + { + "x": 384, + "y": 444.234375 + }, + { + "x": 385, + "y": 442.234375 + }, + { + "x": 387, + "y": 440.234375 + }, + { + "x": 389, + "y": 438.234375 + }, + { + "x": 391, + "y": 435.234375 + }, + { + "x": 393, + "y": 432.234375 + }, + { + "x": 397, + "y": 429.234375 + }, + { + "x": 399, + "y": 427.234375 + }, + { + "x": 400, + "y": 425.234375 + }, + { + "x": 403, + "y": 422.234375 + }, + { + "x": 404, + "y": 419.234375 + }, + { + "x": 405, + "y": 417.234375 + }, + { + "x": 406, + "y": 416.234375 + }, + { + "x": 408, + "y": 414.234375 + }, + { + "x": 409, + "y": 413.234375 + }, + { + "x": 409, + "y": 412.234375 + }, + { + "x": 410, + "y": 410.234375 + }, + { + "x": 411, + "y": 408.234375 + }, + { + "x": 412, + "y": 407.234375 + }, + { + "x": 413, + "y": 406.234375 + }, + { + "x": 414, + "y": 405.234375 + }, + { + "x": 415, + "y": 404.234375 + }, + { + "x": 415, + "y": 403.234375 + }, + { + "x": 417, + "y": 401.234375 + }, + { + "x": 417, + "y": 400.234375 + }, + { + "x": 418, + "y": 399.234375 + }, + { + "x": 419, + "y": 398.234375 + }, + { + "x": 419, + "y": 397.234375 + }, + { + "x": 419, + "y": 395.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 420, + "y": 393.234375 + }, + { + "x": 421, + "y": 392.234375 + }, + { + "x": 422, + "y": 391.234375 + }, + { + "x": 422, + "y": 390.234375 + }, + { + "x": 422, + "y": 389.234375 + }, + { + "x": 423, + "y": 388.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 386.234375 + }, + { + "x": 423, + "y": 385.234375 + }, + { + "x": 424, + "y": 384.234375 + } + ], + "timestamp": 1764970477176, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970477176, + "id": "drawing_1764970477037_oi8l0skpm" +} +2025-12-05 13:50:05 [INFO] routes.rooms:1466 – Stroke 1: { + "drawingId": "drawing_1764970479164_2ihxo34kt", + "color": "#000000", + "lineWidth": 5, + "pathData": [ + { + "x": 424, + "y": 384.234375 + }, + { + "x": 423, + "y": 383.234375 + }, + { + "x": 421, + "y": 383.234375 + }, + { + "x": 418, + "y": 383.234375 + }, + { + "x": 414, + "y": 383.234375 + }, + { + "x": 411, + "y": 383.234375 + }, + { + "x": 405, + "y": 383.234375 + }, + { + "x": 402, + "y": 381.234375 + }, + { + "x": 400, + "y": 381.234375 + }, + { + "x": 397, + "y": 381.234375 + }, + { + "x": 395, + "y": 380.234375 + }, + { + "x": 394, + "y": 380.234375 + }, + { + "x": 391, + "y": 380.234375 + }, + { + "x": 390, + "y": 380.234375 + }, + { + "x": 387, + "y": 380.234375 + }, + { + "x": 386, + "y": 379.234375 + }, + { + "x": 384, + "y": 379.234375 + }, + { + "x": 382, + "y": 379.234375 + }, + { + "x": 381, + "y": 379.234375 + }, + { + "x": 380, + "y": 379.234375 + }, + { + "x": 378, + "y": 378.234375 + }, + { + "x": 376, + "y": 378.234375 + }, + { + "x": 375, + "y": 378.234375 + }, + { + "x": 372, + "y": 378.234375 + }, + { + "x": 370, + "y": 377.234375 + }, + { + "x": 369, + "y": 376.234375 + }, + { + "x": 366, + "y": 375.234375 + }, + { + "x": 363, + "y": 374.234375 + }, + { + "x": 361, + "y": 374.234375 + }, + { + "x": 359, + "y": 373.234375 + }, + { + "x": 354, + "y": 371.234375 + }, + { + "x": 351, + "y": 369.234375 + }, + { + "x": 349, + "y": 368.234375 + }, + { + "x": 345, + "y": 367.234375 + }, + { + "x": 343, + "y": 365.234375 + }, + { + "x": 341, + "y": 364.234375 + }, + { + "x": 339, + "y": 364.234375 + }, + { + "x": 336, + "y": 363.234375 + }, + { + "x": 335, + "y": 363.234375 + }, + { + "x": 334, + "y": 362.234375 + }, + { + "x": 333, + "y": 362.234375 + }, + { + "x": 330, + "y": 362.234375 + }, + { + "x": 326, + "y": 362.234375 + }, + { + "x": 324, + "y": 362.234375 + }, + { + "x": 322, + "y": 360.234375 + }, + { + "x": 319, + "y": 360.234375 + }, + { + "x": 316, + "y": 359.234375 + }, + { + "x": 315, + "y": 359.234375 + }, + { + "x": 314, + "y": 359.234375 + }, + { + "x": 313, + "y": 359.234375 + }, + { + "x": 310, + "y": 359.234375 + }, + { + "x": 309, + "y": 359.234375 + }, + { + "x": 307, + "y": 358.234375 + }, + { + "x": 306, + "y": 358.234375 + }, + { + "x": 305, + "y": 358.234375 + }, + { + "x": 308, + "y": 358.234375 + }, + { + "x": 312, + "y": 355.234375 + }, + { + "x": 316, + "y": 354.234375 + }, + { + "x": 323, + "y": 350.234375 + }, + { + "x": 327, + "y": 349.234375 + }, + { + "x": 331, + "y": 348.234375 + }, + { + "x": 333, + "y": 347.234375 + }, + { + "x": 337, + "y": 345.234375 + }, + { + "x": 339, + "y": 344.234375 + }, + { + "x": 341, + "y": 344.234375 + }, + { + "x": 343, + "y": 343.234375 + }, + { + "x": 346, + "y": 342.234375 + }, + { + "x": 348, + "y": 342.234375 + }, + { + "x": 352, + "y": 339.234375 + }, + { + "x": 356, + "y": 339.234375 + }, + { + "x": 359, + "y": 338.234375 + }, + { + "x": 363, + "y": 338.234375 + }, + { + "x": 367, + "y": 337.234375 + }, + { + "x": 373, + "y": 337.234375 + }, + { + "x": 378, + "y": 336.234375 + }, + { + "x": 384, + "y": 336.234375 + }, + { + "x": 390, + "y": 334.234375 + }, + { + "x": 397, + "y": 332.234375 + }, + { + "x": 401, + "y": 331.234375 + }, + { + "x": 405, + "y": 330.234375 + }, + { + "x": 408, + "y": 330.234375 + }, + { + "x": 411, + "y": 328.234375 + }, + { + "x": 414, + "y": 327.234375 + }, + { + "x": 415, + "y": 327.234375 + }, + { + "x": 418, + "y": 326.234375 + }, + { + "x": 419, + "y": 325.234375 + }, + { + "x": 421, + "y": 323.234375 + }, + { + "x": 423, + "y": 322.234375 + }, + { + "x": 425, + "y": 321.234375 + }, + { + "x": 428, + "y": 320.234375 + }, + { + "x": 430, + "y": 320.234375 + }, + { + "x": 432, + "y": 318.234375 + }, + { + "x": 434, + "y": 318.234375 + }, + { + "x": 435, + "y": 317.234375 + }, + { + "x": 437, + "y": 316.234375 + }, + { + "x": 438, + "y": 316.234375 + }, + { + "x": 440, + "y": 315.234375 + }, + { + "x": 442, + "y": 314.234375 + }, + { + "x": 444, + "y": 312.234375 + }, + { + "x": 445, + "y": 312.234375 + }, + { + "x": 446, + "y": 311.234375 + }, + { + "x": 448, + "y": 310.234375 + }, + { + "x": 450, + "y": 309.234375 + }, + { + "x": 451, + "y": 308.234375 + }, + { + "x": 452, + "y": 307.234375 + }, + { + "x": 453, + "y": 307.234375 + }, + { + "x": 454, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 455, + "y": 306.234375 + }, + { + "x": 457, + "y": 305.234375 + }, + { + "x": 458, + "y": 305.234375 + }, + { + "x": 460, + "y": 304.234375 + }, + { + "x": 461, + "y": 303.234375 + } + ], + "timestamp": 1764970487863, + "user": "btouattara", + "roomId": "693337c7c1663e36f406336a", + "skipUndoStack": false, + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {}, + "metadata": { + "brushStyle": "round", + "brushType": "normal", + "brushParams": {}, + "drawingType": "stroke", + "stampData": null, + "stampSettings": null, + "filterType": null, + "filterParams": {} + }, + "ts": 1764970487863, + "id": "drawing_1764970479164_2ihxo34kt" +} +2025-12-05 13:50:05 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:05] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - +2025-12-05 13:50:05 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public +2025-12-05 13:50:06 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a +2025-12-05 13:50:06 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a +2025-12-05 13:50:06 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a +2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} +2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} +2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} +2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} +2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} +2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} +2025-12-05 13:50:06 [WARNING] routes.rooms:1445 – ================================================================================ +2025-12-05 13:50:06 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE +2025-12-05 13:50:06 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 +2025-12-05 13:50:06 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 +2025-12-05 13:50:06 [WARNING] routes.rooms:1458 – +Stroke 0 complete data: +2025-12-05 13:53:10 [INFO] werkzeug:97 – * Restarting with stat +2025-12-05 13:55:04 [INFO] werkzeug:97 – * Restarting with stat diff --git a/backend/routes/ai_assistant.py b/backend/routes/ai_assistant.py index b37b4613..c685600f 100644 --- a/backend/routes/ai_assistant.py +++ b/backend/routes/ai_assistant.py @@ -71,6 +71,7 @@ def shape_completion(): @ai_assistant_bp.route('/api/ai_assistant/image', methods=['POST']) def text_to_image(): """ + TODO: To be implemented Body: { "prompt": "", "width"?: int, "height"?: int, "style"?: str } Returns: { "imageDataUrl": "data:image/png;base64,..." } """ @@ -109,7 +110,6 @@ def beautify_sketch(): try: payload = request.get_json(silent=True) or {} canvas_state = payload.get("canvasState") - level = payload.get("level", "medium") if not isinstance(canvas_state, dict): return jsonify({ @@ -117,8 +117,7 @@ def beautify_sketch(): "detail": "Missing or invalid 'canvasState' (object)." }), 400 - logger.info("AI canvas beautify requested (level=%s)", level) - result = beautify_canvas_state(canvas_state, level=level) + result = beautify_canvas_state(canvas_state) if not isinstance(result, dict) or "objects" not in result: logger.warning("Beautify returned invalid payload: %r", result) diff --git a/backend/services/llm_service.py b/backend/services/llm_service.py index a7258bfb..9c90b222 100644 --- a/backend/services/llm_service.py +++ b/backend/services/llm_service.py @@ -395,15 +395,38 @@ def prompt_to_drawings(prompt: str, canvasState: dict[str, typing.Any]) -> dict: # === Shape Completion ========================================================= SHAPE_COMPLETION_SYSTEM = """ -You are a shape-completion engine for a canvas app. +You are a drawing intent and completion engine for a canvas app. -Inputs you will be given: -- CanvasState: the current canvas (existing drawings + bounds) - -Goal: -Infer the single most likely primitive shape that best fits canvasState, and return it in a canvas-ready format. - -Output (JSON ONLY, no comments, no markdown): +You receive a CanvasState JSON object with: +- bounds: { "width": number, "height": number } +- drawings: array of drawing objects; the last one(s) are often the user's most recent strokes. + Each drawing has fields like: + - color: "#RRGGBB" + - lineWidth: number + - pathData: + For freehand strokes: + { "tool": "freehand", "type": "stroke", + "points": [ { "x": number, "y": number }, ... ] } + For geometric shapes: + { "tool": "shape", "type": "line|rectangle|circle|polygon|text", + "start": { "x": number, "y": number }, + "end": { "x": number, "y": number }, + "points": [ { "x": number, "y": number }, ... ], + "text": "optional" } + +GOAL +1. First, infer what the user is trying to draw at a higher level: + - Are they sketching a recognizable object (e.g., tree, house, car, plane, star, person, cloud)? + - Or are they just drawing an abstract or standalone geometric shape (line, rectangle, circle, polygon)? +2. Then, infer the SINGLE most likely next primitive that would continue or complete that intent, + matching the user's current drawing style: + - If their recent drawings are mainly freehand strokes: + → Predict the next stroke as a freehand stroke (tool = "freehand", type = "stroke"). + - If their recent drawings are mainly shapes: + → Predict the next geometric shape (tool = "shape"). +3. Always output ONE object that can be used as a "ghost" suggestion of what to draw next. + +OUTPUT FORMAT (JSON ONLY, no comments, no markdown): { "complete": true|false, "confidence": number, // 0.0–1.0 @@ -411,70 +434,215 @@ def prompt_to_drawings(prompt: str, canvasState: dict[str, typing.Any]) -> dict: "color": "#RRGGBB", "lineWidth": number, "pathData": { - "tool": "shape", - "type": "circle|rectangle|line|polygon|text", - // circle/rectangle/line: - "start": {"x": number, "y": number}, - "end": {"x": number, "y": number}, - // polygon (including triangle): - "points": [ {"x": number, "y": number}, ... ], - // text (rare for completion; omit unless clearly indicated): + "tool": "shape|freehand", + "type": "line|circle|rectangle|polygon|stroke|text", + "start": { "x": number, "y": number }, + "end": { "x": number, "y": number }, + "points": [ { "x": number, "y": number }, ... ], "text": "string" } } } -Rules: -- Use ABSOLUTE coordinates within CanvasState.bounds (0,0 = top-left). -- Infer a single primitive that best fits the partial strokes/points. Prefer simpler fits that preserve user intent. -- If uncertainty is high (confidence < 0.4), set "complete": false and return a best-effort "object" anyway (so the UI can show a ghost preview). -- Color default: use the majority/last stroke color if available; otherwise "#000000". -- Snap centers/edges to nearby anchors (guides, bounding-box centers/edges) if within ~6px. -- Output MUST be valid JSON matching the schema above exactly. +STYLE MATCHING +- Look at the LAST few drawings in CanvasState.drawings. +- If most of them use { "tool": "freehand", "type": "stroke" }, + then your suggestion must also be a freehand stroke with a "points" array. +- If most of them use { "tool": "shape", ... }, + then your suggestion must be a geometric shape (line, rectangle, circle, polygon, or text). +- Preserve the approximate lineWidth and color of the user's most recent drawing. + +SCALE & EXTENT (VERY IMPORTANT) +- Your suggestion should be a VISIBLE continuation, not a tiny jitter. +- Estimate the size of the user's most recent stroke or shape (its bounding box or start–end distance). +- For freehand strokes: + - Make the new stroke span a similar scale (roughly 50%–150% of the last stroke's span). + - Avoid strokes whose bounding box width AND height are both very small (e.g., less than ~20 pixels) + unless ALL of the user's recent strokes are that small. + - Prefer 8–30 points for a typical suggested stroke so it feels like a substantial continuation, + not just a tiny segment. +- For shapes: + - Suggested lines, rectangles, circles, or polygons should have a meaningful size as well, + comparable to the existing elements they are extending. + - Do NOT suggest micro-lines or tiny shapes unless the entire drawing is made of such tiny elements. + +SEMANTIC INTENT +- Try to recognize common objects from the partial sketch: tree, car, house, plane, star, cloud, person, etc. +- If you can infer a likely object: + - For a tree: you might add more foliage strokes, the trunk, or branches. + - For a house: you might add the roof, door, or window. + - For a car: you might add wheels, windows, or body details. +- If the sketch is too ambiguous or looks abstract: + - Focus on geometric completion: straightening or extending a line, + closing a polygon, or completing a circle/rectangle. + +GEOMETRY AND BOUNDS +- Use ABSOLUTE pixel coordinates within [0, bounds.width] × [0, bounds.height], + with (0,0) at the top-left. +- For shapes: + - line/rectangle/circle must include "start" and "end". + - polygon must include "points". +- For freehand strokes: + - Provide a "points" array with an ordered path for the stroke. + - Points should form a smooth, coherent segment that clearly continues the drawing. + +CONFIDENCE AND COMPLETENESS +- Use "confidence" to express how sure you are about the user's intent. +- If you are very unsure (confidence < 0.4): + - Set "complete": false. + - Still return your best-effort next primitive so the UI can show a light ghost suggestion. +- If the suggestion would clearly complete a part of the object (e.g., final wheel, final edge, roof line): + - You may set "complete": true for that part, even if the whole scene is not finished. + +COLOR AND WIDTH +- Default color: use the color of the user's last drawing if available; otherwise "#000000". +- Default lineWidth: match the user's last drawing's lineWidth, or use 2 if missing. + +CONSTRAINTS +- Output MUST be valid JSON and MUST match the schema above. +- Do NOT output explanations, natural language, or multiple objects. +- Always return a single best "object" that predicts the next stroke or shape. """ -# Few-shots (2 strong, compact) SHAPE_COMPLETION_FEWSHOT_USER_1 = """ CanvasState: -{"drawings":[],"bounds":{"width":1200,"height":800}} +{ + "drawings": [ + { + "color": "#228B22", + "lineWidth": 3, + "pathData": { + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 300, "y": 200}, + {"x": 340, "y": 180}, + {"x": 380, "y": 210}, + {"x": 360, "y": 240}, + {"x": 320, "y": 230}, + {"x": 300, "y": 200} + ] + } + } + ], + "bounds": {"width":1200,"height":800} +} """ SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1 = { - "complete": True, - "confidence": 0.86, + "complete": False, + "confidence": 0.78, "object": { - "color": "#0000FF", - "lineWidth": 2, + "color": "#228B22", + "lineWidth": 3, "pathData": { - "tool": "shape", - "type": "circle", - "start": {"x": 360, "y": 420}, - "end": {"x": 400, "y": 420}, + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 340, "y": 220}, + {"x": 380, "y": 230}, + {"x": 410, "y": 210}, + {"x": 400, "y": 180}, + {"x": 370, "y": 170}, + {"x": 340, "y": 180} + ] }, }, } + SHAPE_COMPLETION_FEWSHOT_USER_2 = """ CanvasState: -{"drawings":[{}],"bounds":{"width":1200,"height":800}} +{ + "drawings": [ + { + "color": "#8B4513", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 400, "y": 300}, + "end": {"x": 600, "y": 450} + } + }, + { + "color": "#8B0000", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "polygon", + "points": [ + {"x": 400, "y": 300}, + {"x": 500, "y": 220}, + {"x": 600, "y": 300} + ] + } + } + ], + "bounds": {"width":1200,"height":800} +} """ SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2 = { - "complete": True, - "confidence": 0.78, + "complete": False, + "confidence": 0.85, "object": { - "color": "#333333", + "color": "#654321", "lineWidth": 2, "pathData": { "tool": "shape", "type": "rectangle", - "start": {"x": 500, "y": 300}, - "end": {"x": 700, "y": 420}, + "start": {"x": 470, "y": 360}, + "end": {"x": 530, "y": 450} }, }, } +SHAPE_COMPLETION_FEWSHOT_USER_3 = """ +CanvasState: +{ + "drawings": [ + { + "color": "#FF0000", + "lineWidth": 3, + "pathData": { + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 600, "y": 500}, + {"x": 650, "y": 480}, + {"x": 720, "y": 460}, + {"x": 800, "y": 460}, + {"x": 880, "y": 480}, + {"x": 930, "y": 510} + ] + } + } + ], + "bounds": {"width":1800,"height":800} +} +""" + +SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_3 = { + "complete": False, + "confidence": 0.70, + "object": { + "color": "#000000", + "lineWidth": 3, + "pathData": { + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 680, "y": 510}, + {"x": 700, "y": 540}, + {"x": 730, "y": 550}, + {"x": 760, "y": 540}, + {"x": 780, "y": 510} + ] + }, + }, +} def _get_shape_completion_initial_message( canvas_state: dict[str, typing.Any] @@ -501,6 +669,8 @@ def _get_shape_completion_initial_message( {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_1)}, {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_2}, {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_2)}, + {"role": "user", "content": SHAPE_COMPLETION_FEWSHOT_USER_3}, + {"role": "assistant", "content": json.dumps(SHAPE_COMPLETION_FEWSHOT_ASSISTANT_JSON_3)}, {"role": "user", "content": user_msg}, ] @@ -572,98 +742,211 @@ def complete_shape_from_canvas(canvas_state: dict) -> dict: # === Canvas Beautification (canvas-state) ====================== - -BEAUTIFY_CANVAS_SYSTEM = """ -You are a drawing beautification engine for a collaborative whiteboard app. - -You receive the FULL canvas state as JSON. It typically has: -- bounds: { "width": number, "height": number } -- drawings: array of drawing objects. Each drawing may include: - - color: hex string like "#000000" - - lineWidth: number - - pathData: - For freehand strokes: - { "tool": "freehand", "type": "stroke", - "points": [ { "x": number, "y": number }, ... ] } - For straight line segments: - { "tool": "shape", "type": "line", - "start": { "x": number, "y": number }, - "end": { "x": number, "y": number } } - For rectangles/circles/polygons: - { "tool": "shape", "type": "rectangle" | "circle" | "polygon", - ... geometry fields ... } - -Your job is to BEAUTIFY the drawing while preserving the user's intent: - -- Smooth wobbly freehand strokes into cleaner, more regular curves. -- Snap nearly-straight strokes into clean straight lines. -- When the user clearly tried to draw a common geometric shape - (rectangle, circle, triangle, star, arrow, etc.), convert it into - that shape type with precise geometry. -- Preserve the overall layout and relationships: do NOT drastically - move shapes around, resize everything, or delete important content. -- Preserve colors and approximate lineWidth values whenever possible. -- Do not add text or entirely new objects that weren't implied by the - sketch. Focus on CLEANUP, not content invention. -- Try to keep the number of objects roughly the same (or slightly fewer - if you merge overlapping strokes into one clean shape). - -IMPORTANT: You MUST respond with STRICT JSON and ONLY this top-level shape: - +BEAUTIFY_SYSTEM_PROMPT = """ +You are a sketch beautifier for a canvas drawing app. + +You receive a CanvasState JSON object with: +- width: number +- height: number +- objects: array of drawing objects, each with: + - id: string + - color: "#RRGGBB" + - lineWidth: number + - pathData: + For freehand strokes: + { + "tool": "freehand", + "type": "stroke", + "points": [ { "x": number, "y": number }, ... ] + } + For geometric shapes: + { + "tool": "shape", + "type": "line|rectangle|circle|polygon|text", + "start": { "x": number, "y": number }, + "end": { "x": number, "y": number }, + "points": [ { "x": number, "y": number }, ... ], + "text": "optional" + } + +GOAL +Transform the input CanvasState into a BEAUTIFIED version of the same drawing. +- Keep the overall composition, layout, and intent the same. +- Make the drawing look smoother, cleaner, and more deliberate. +- Always return your highest-quality beautification. + +OUTPUT FORMAT (JSON ONLY, no comments, no markdown): { "objects": [ { + "id": "string", "color": "#RRGGBB", "lineWidth": number, "pathData": { - "tool": "shape" | "freehand", - "type": "line" | "circle" | "rectangle" | "polygon" | "stroke", + "tool": "shape|freehand", + "type": "line|rectangle|circle|polygon|stroke|text", "start": { "x": number, "y": number }, "end": { "x": number, "y": number }, - "points": [ { "x": number, "y": number }, ... ] + "points": [ { "x": number, "y": number }, ... ], + "text": "string" } }, ... ] } -- For "freehand" and "polygon", provide a "points" array. -- For "line", "circle", and "rectangle", provide at least "start" and "end". -- You may omit fields that don't apply (e.g., "points" for a simple line), - but the key "pathData" must exist and include a "type" string. +BEAUTIFICATION RULES + +PRESERVE INTENT +- Do NOT change what the user is drawing: a tree must remain a tree, a car remains a car, a house remains a house, etc. +- Do NOT radically move objects: positions should remain similar; small adjustments to align or straighten are allowed. +- Keep overall proportions and relative sizes of parts (e.g., door vs house, wheels vs car body). + +STROKE SMOOTHING (FREEHAND) +- For freehand strokes (tool = "freehand", type = "stroke"): + - Remove jitter and noise; smooth the path into more confident curves and lines. + - Use a reasonable number of points: not too sparse and not excessively dense. + In general, 16–64 points per long stroke is enough. + - Ensure the stroke flows smoothly with consistent direction and curvature. + - Preserve the approximate start and end positions and overall shape of the stroke. + +GEOMETRIC CLEANUP (SHAPES) +- For lines, rectangles, circles, and polygons (tool = "shape"): + - Straighten almost-straight lines. + - Regularize rectangles so opposite sides are parallel and corners are clean. + - Regularize circles or ellipses to look smooth and round. + - Clean polygon vertices so angles look intentional, not wobbly. +- You MAY, when appropriate, upgrade a clearly intended shape drawn as a messy stroke + into a cleaner geometric shape (e.g., a wobbly "shape" polygon into a neat rectangle), + as long as the user's intent is obvious and the style of the rest of the drawing is respected. + +STYLE PRESERVATION +- Maintain the existing color palette and lineWidth relationships. +- Do NOT randomly change colors. +- Line widths can be slightly adjusted for consistency, but must feel similar to the original. +- If the whole drawing is sketchy and loose, keep a sketchy-but-clean look rather than making it fully technical or CAD-like. + +GLOBAL CONSISTENCY +- Objects that belong together (e.g., house and roof, car body and wheels, tree trunk and foliage) + should remain visually aligned and coherent after beautification. +- You may slightly align related parts (e.g., windows in a row, wheels centered vertically) if it improves cleanliness without changing the composition. + +CONSTRAINTS +- You must return a JSON object with an "objects" array using the same schema as above. +- The number of objects should usually be similar to the input; you may split or merge strokes when it clearly improves the visual quality, but do not randomly add or remove important elements. +- Do NOT output explanations, natural language, or extra fields. +- Do NOT leave the drawing partially processed: every object should be beautified as needed. +""" -If there is nothing reasonable to improve, simply return an "objects" -array that matches the input drawings as-is (copy from canvasState.drawings). +BEAUTIFY_FEWSHOT_USER_1 = """ +CanvasState: +{ + "width": 800, + "height": 600, + "objects": [ + { + "id": "stroke1", + "color": "#000000", + "lineWidth": 3, + "pathData": { + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 100, "y": 300}, + {"x": 130, "y": 295}, + {"x": 160, "y": 290}, + {"x": 190, "y": 292}, + {"x": 220, "y": 300}, + {"x": 250, "y": 310}, + {"x": 280, "y": 315} + ] + } + } + ] +} +""" + +BEAUTIFY_FEWSHOT_ASSISTANT_JSON_1 = { + "objects": [ + { + "id": "stroke1", + "color": "#000000", + "lineWidth": 3, + "pathData": { + "tool": "freehand", + "type": "stroke", + "points": [ + {"x": 100, "y": 300}, + {"x": 130, "y": 295}, + {"x": 160, "y": 292}, + {"x": 190, "y": 295}, + {"x": 220, "y": 302}, + {"x": 250, "y": 310}, + {"x": 280, "y": 315} + ] + } + } + ] +} + + +BEAUTIFY_FEWSHOT_USER_2 = """ +CanvasState: +{ + "width": 800, + "height": 600, + "objects": [ + { + "id": "rect1", + "color": "#333333", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 200, "y": 200}, + "end": {"x": 400, "y": 320} + } + } + ] +} """ +BEAUTIFY_FEWSHOT_ASSISTANT_JSON_2 = { + "objects": [ + { + "id": "rect1", + "color": "#333333", + "lineWidth": 2, + "pathData": { + "tool": "shape", + "type": "rectangle", + "start": {"x": 200, "y": 200}, + "end": {"x": 400, "y": 320} + } + } + ] +} + def _get_beautify_canvas_initial_message( - canvas_state: dict[str, typing.Any], - level: str = "medium", + canvas_state: dict[str, typing.Any] ) -> list[dict]: """ - Build few-shot seeded messages for canvas beautification. - `level` can be 'light' | 'medium' | 'strong' to hint how aggressive - we want the cleanup to be. + Build few-shot seeded messages for beautification. """ + canvas_json = json.dumps(canvas_state, ensure_ascii=False) + return [ {"role": "system", "content": BEAUTIFY_CANVAS_SYSTEM}, - { - "role": "user", - "content": json.dumps( - { - "level": level, - "canvasState": canvas_state, - }, - ensure_ascii=False, - ), - }, + {"role": "user", "content": BEAUTIFY_FEWSHOT_USER_1}, + {"role": "assistant", "content": json.dumps(BEAUTIFY_FEWSHOT_ASSISTANT_JSON_1)}, + {"role": "user", "content": BEAUTIFY_FEWSHOT_USER_2}, + {"role": "assistant", "content": json.dumps(BEAUTIFY_FEWSHOT_ASSISTANT_JSON_2)}, + {"role": "user", "content": f"CanvasState:\n{canvas_json}"}, ] - def openai_beautify_canvas( canvas_state: dict[str, typing.Any], - level: str = "medium", ) -> dict: """ Beautify the canvas using OpenAI. Returns either: @@ -681,7 +964,7 @@ def openai_beautify_canvas( model="gpt-4.1-mini", response_format={"type": "json_object"}, # forces JSON temperature=0.15, - messages=_get_beautify_canvas_initial_message(canvas_state, level=level), + messages=_get_beautify_canvas_initial_message(canvas_state), max_tokens=1200, ) @@ -707,8 +990,7 @@ def openai_beautify_canvas( def ollama_beautify_canvas( - canvas_state: dict[str, typing.Any], - level: str = "medium", + canvas_state: dict[str, typing.Any] ) -> dict: """ Beautify the canvas using a local Ollama model. Same contract as @@ -719,7 +1001,7 @@ def ollama_beautify_canvas( response = ollama.chat( model="llama3:8b", - messages=_get_beautify_canvas_initial_message(canvas_state, level=level), + messages=_get_beautify_canvas_initial_message(canvas_state), ) parsed = json.loads(response["message"]["content"]) @@ -743,8 +1025,7 @@ def ollama_beautify_canvas( def beautify_canvas_state( - canvas_state: dict[str, typing.Any], - level: str = "medium", + canvas_state: dict[str, typing.Any] ) -> dict: """ Perform AI-based canvas beautification with rollback, following the @@ -761,12 +1042,12 @@ def beautify_canvas_state( { "objects": [...] } """ # Primary: OpenAI - model_output = openai_beautify_canvas(canvas_state, level=level) + model_output = openai_beautify_canvas(canvas_state) if "error" not in model_output and "objects" in model_output: return model_output # Fallback: Ollama - fallback_output = ollama_beautify_canvas(canvas_state, level=level) + fallback_output = ollama_beautify_canvas(canvas_state) if "error" not in fallback_output and "objects" in fallback_output: return fallback_output diff --git a/frontend/src/components/AI/AIAssistantPanel.jsx b/frontend/src/components/AI/AIAssistantPanel.jsx index f7c93351..4ed02073 100644 --- a/frontend/src/components/AI/AIAssistantPanel.jsx +++ b/frontend/src/components/AI/AIAssistantPanel.jsx @@ -107,7 +107,7 @@ export default function AIAssistantPanel({
handlePanelItemClick("Beautify sketch")} - aria-pressed={false} // Never active + aria-pressed={false} > diff --git a/frontend/src/components/AI/PromptInput.jsx b/frontend/src/components/AI/PromptInput.jsx index f135985c..c6fbf848 100644 --- a/frontend/src/components/AI/PromptInput.jsx +++ b/frontend/src/components/AI/PromptInput.jsx @@ -9,7 +9,6 @@ export default function PromptInput({ placeholder = 'Describe what to draw…', }) { const [text, setText] = useState(''); - // const [loading, setLoading] = useState(false); const handleSubmit = async () => { if (!text.trim() || loading) return; diff --git a/frontend/src/components/AI/ShapeCompletionOverlay.jsx b/frontend/src/components/AI/ShapeCompletionOverlay.jsx index 925c9ecf..79572f52 100644 --- a/frontend/src/components/AI/ShapeCompletionOverlay.jsx +++ b/frontend/src/components/AI/ShapeCompletionOverlay.jsx @@ -21,15 +21,35 @@ export default function ShapeCompletionOverlay({ const strokeColor = object.color || '#00A0FF'; const strokeWidth = object.lineWidth || 2; - const ghostOpacity = 0.25; // lower than user's strokes + const ghostOpacity = 0.25; const ax = (anchor?.x ?? canvasWidth / 2) + panOffset.x; const ay = (anchor?.y ?? canvasHeight / 2) + panOffset.y; const renderShape = () => { const t = pathData.type; + const tool = pathData.tool || 'shape'; + + if ( + tool === 'freehand' && + t === 'stroke' && + Array.isArray(pathData.points) && + pathData.points.length > 1 + ) { + const pointsAttr = pathData.points.map(p => `${p.x},${p.y}`).join(' '); + return ( + + ); + } - // Line / circle / rectangle using start / end if (['line', 'circle', 'rectangle'].includes(t) && pathData.start && pathData.end) { const { start, end } = pathData; @@ -90,7 +110,6 @@ export default function ShapeCompletionOverlay({ } } - // Polygon (e.g., star, triangle) if (t === 'polygon' && Array.isArray(pathData.points) && pathData.points.length > 1) { const pointsAttr = pathData.points.map(p => `${p.x},${p.y}`).join(' '); return ( @@ -106,13 +125,25 @@ export default function ShapeCompletionOverlay({ ); } - // Fallback: nothing + if (t === 'text' && typeof pathData.text === 'string' && pathData.start) { + return ( + + {pathData.text} + + ); + } + return null; }; return ( <> - {/* Ghost shape overlay – aligned with main canvas */} - {/* Small accept / reject controls near the shape anchor */} { const buildCanvasStateForAI = () => { const canvas = canvasRef.current; - const width = canvas?.width || 1000; - const height = canvas?.height || 1000; + const canvasBounds = getVisibleCanvasBounds(); + const width = canvasBounds?.width || 1000; + const height = canvasBounds?.height || 1000; // Use regular drawings only (exclude filters, etc.) const allDrawings = [ @@ -4140,13 +4146,13 @@ const acceptShapeSuggestion = async () => { pathData: d.pathData, brushType: d.brushType, brushStyle: d.brushStyle, - drawingType: d.drawWithType, + drawingType: d.drawingType, })); return { width, height, objects }; }; - const handleBeautifyCanvas = async (level = "medium") => { + const handleBeautifyCanvas = async () => { if (!userData) return; if (aiAssistLoading) return; @@ -4157,7 +4163,7 @@ const acceptShapeSuggestion = async () => { try { const canvasState = buildCanvasStateForAI(); - const result = await beautifySketch(canvasState, level); + const result = await beautifySketch(canvasState); if (!result || !Array.isArray(result.objects) || result.objects.length === 0) { showLocalSnack("Beautify failed. Please try again."); @@ -4166,19 +4172,15 @@ const acceptShapeSuggestion = async () => { const beautifiedObjects = result.objects; - // Clear the canvas + local state await clearCanvasForRefresh(); - - // Add the beautified objects using the existing AI helper await addAIGeneratedObjects(beautifiedObjects); - // Track this as an undoable action locally setUndoStack((prev) => [...prev, { type: "beautify", ts: Date.now() }]); setRedoStack([]); showLocalSnack("Sketch beautified"); } catch (err) { - console.error("[Beautify] Error:", err); + console.log("[Beautify] Error:", err); showLocalSnack("Beautify failed. Please try again."); } }; @@ -4579,7 +4581,7 @@ const acceptShapeSuggestion = async () => { setAiGenerateService(obj.type); }} onShapeCompletionToggle={handleShapeCompletionToggle} - onBeautify={() => handleBeautifyCanvas("medium")} + onBeautify={() => handleBeautifyCanvas()} /> diff --git a/frontend/src/hooks/useAIAssistant.js b/frontend/src/hooks/useAIAssistant.js index 39793eef..4df6f203 100644 --- a/frontend/src/hooks/useAIAssistant.js +++ b/frontend/src/hooks/useAIAssistant.js @@ -9,8 +9,6 @@ export function useAIAssistant() { setLoading(true); setError(null); - console.log("Body: ", body); - try { const res = await fetch(`http://127.0.0.1:10010/api/ai_assistant/${endpoint}`, { method: "POST", @@ -18,8 +16,6 @@ export function useAIAssistant() { body: JSON.stringify(body), }); - console.log("AI Asisst Response: ", res); - if (!res.ok) { throw new Error(`Request failed: ${res.status}`); } From bad518e9edb2e4aaec503f48a3531445719f21cb Mon Sep 17 00:00:00 2001 From: btouatta Date: Fri, 5 Dec 2025 15:56:29 -0800 Subject: [PATCH 24/26] Working features --- backend/.nfs00000000f392c62d000001f0 | 72805 ------------------------- backend/routes/ai_assistant.py | 2 + backend/services/llm_service.py | 25 +- frontend/src/components/Canvas.js | 194 +- frontend/src/styles/ai-assistant.css | 3 - 5 files changed, 114 insertions(+), 72915 deletions(-) delete mode 100644 backend/.nfs00000000f392c62d000001f0 diff --git a/backend/.nfs00000000f392c62d000001f0 b/backend/.nfs00000000f392c62d000001f0 deleted file mode 100644 index 8bad1295..00000000 --- a/backend/.nfs00000000f392c62d000001f0 +++ /dev/null @@ -1,72805 +0,0 @@ -2025-12-05 13:41:58 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:42:02 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:42:02 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:42:03 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:42:03 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:42:03 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:42:03 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:42:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:42:04] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e44sjxxy HTTP/1.1" 200 - -2025-12-05 13:42:04 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=LkkUHaGYPd5n6cLmAAAB -2025-12-05 13:42:04 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=LkkUHaGYPd5n6cLmAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:42:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:42:04] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e494suh6&sid=XN1fu2SHGq7TtVa7AAAA HTTP/1.1" 200 - -2025-12-05 13:42:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:42:04] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e494rp53&sid=XN1fu2SHGq7TtVa7AAAA HTTP/1.1" 200 - -2025-12-05 13:43:20 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading -2025-12-05 13:43:20 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:43:24 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:43:25 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:43:25 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:43:25 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:43:25 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:43:25 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:43:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:25] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e5wu24ct HTTP/1.1" 200 - -2025-12-05 13:43:25 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=0KCTIE6EyreV8OE4AAAB -2025-12-05 13:43:25 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=0KCTIE6EyreV8OE4AAAB user=693337b5c1663e36f4063368 -2025-12-05 13:43:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:25] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e5zr00x9&sid=F0S-ZvDt-5rtJt2UAAAA HTTP/1.1" 200 - -2025-12-05 13:43:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:25] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e5zr0cvn&sid=F0S-ZvDt-5rtJt2UAAAA HTTP/1.1" 200 - -2025-12-05 13:43:27 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading -2025-12-05 13:43:28 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:43:31 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:43:32 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:43:32 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:43:32 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:43:32 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:43:32 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:43:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e630ab43 HTTP/1.1" 200 - -2025-12-05 13:43:32 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=06aLaqFVgplDq4vdAAAB -2025-12-05 13:43:32 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=06aLaqFVgplDq4vdAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:43:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e65670vn&sid=aTfpNezuptPY0f1pAAAA HTTP/1.1" 200 - -2025-12-05 13:43:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:32] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e6566jda&sid=aTfpNezuptPY0f1pAAAA HTTP/1.1" 200 - -2025-12-05 13:43:34 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading -2025-12-05 13:43:35 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:43:38 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:43:39 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:43:39 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:43:39 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:43:39 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:43:39 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:43:39 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:39] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e68eq2gm HTTP/1.1" 200 - -2025-12-05 13:43:39 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=4FpQgRflrsGiOj14AAAB -2025-12-05 13:43:39 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=4FpQgRflrsGiOj14AAAB user=693337b5c1663e36f4063368 -2025-12-05 13:43:39 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:39] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e6al7euq&sid=KTNt1h2Mp_a8uPw4AAAA HTTP/1.1" 200 - -2025-12-05 13:43:39 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:43:39] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e6al67rd&sid=KTNt1h2Mp_a8uPw4AAAA HTTP/1.1" 200 - -2025-12-05 13:45:17 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:45:17 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:45:21 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:45:22 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:45:22 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:45:22 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:45:22 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:45:22 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:45:22 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:22] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8f43hf1 HTTP/1.1" 200 - -2025-12-05 13:45:22 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=RQoGCla7SPmKF_51AAAB -2025-12-05 13:45:22 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=RQoGCla7SPmKF_51AAAB user=693337b5c1663e36f4063368 -2025-12-05 13:45:22 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:22] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8icq93f&sid=HWyB4aq22f8_Ok2EAAAA HTTP/1.1" 200 - -2025-12-05 13:45:22 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:22] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8icpkfu&sid=HWyB4aq22f8_Ok2EAAAA HTTP/1.1" 200 - -2025-12-05 13:45:27 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:45:27 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:45:31 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:45:32 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:45:32 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:45:32 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:45:32 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:45:32 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:45:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8mtvj1k HTTP/1.1" 200 - -2025-12-05 13:45:32 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=fAWkTLI1GoGg50zcAAAB -2025-12-05 13:45:32 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=fAWkTLI1GoGg50zcAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:45:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8q2t5ma&sid=7KDedzRNjMBLl5efAAAA HTTP/1.1" 200 - -2025-12-05 13:45:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:32] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8q2svwn&sid=7KDedzRNjMBLl5efAAAA HTTP/1.1" 200 - -2025-12-05 13:45:37 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:45:37 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:45:41 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:45:42 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:45:42 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:45:42 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:45:42 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:45:42 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:45:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:42] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8ujmmre HTTP/1.1" 200 - -2025-12-05 13:45:42 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=3JtnFy9X0AfonYT0AAAB -2025-12-05 13:45:42 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=3JtnFy9X0AfonYT0AAAB user=693337b5c1663e36f4063368 -2025-12-05 13:45:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:42] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8xsvb7r&sid=L5FijOOqXYZA1H2hAAAA HTTP/1.1" 200 - -2025-12-05 13:45:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:45:42] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=e8xsuymj&sid=L5FijOOqXYZA1H2hAAAA HTTP/1.1" 200 - -2025-12-05 13:46:52 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:46:53 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:46:57 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:46:58 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:46:58 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:46:58 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:46:58 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:46:58 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:46:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:46:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eah6qxyc HTTP/1.1" 200 - -2025-12-05 13:46:58 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=G2bYxCgTh3loeqHhAAAB -2025-12-05 13:46:58 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=G2bYxCgTh3loeqHhAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:46:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:46:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eak92cjn&sid=ygJJRhHymYksWoQ4AAAA HTTP/1.1" 200 - -2025-12-05 13:46:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:46:58] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eak92jig&sid=ygJJRhHymYksWoQ4AAAA HTTP/1.1" 200 - -2025-12-05 13:47:02 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:47:02 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:47:06 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:47:07 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:47:07 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:47:07 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:47:07 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:47:07 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:47:08 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:08] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eao4rs82 HTTP/1.1" 200 - -2025-12-05 13:47:08 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=3GY1gtap79y9OAbDAAAB -2025-12-05 13:47:08 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=3GY1gtap79y9OAbDAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:47:08 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:08] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eas20i2z&sid=mxZTdbqNIDIBY7cvAAAA HTTP/1.1" 200 - -2025-12-05 13:47:08 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:08] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eas1zfxt&sid=mxZTdbqNIDIBY7cvAAAA HTTP/1.1" 200 - -2025-12-05 13:47:35 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:47:36 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:47:40 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:47:41 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:47:41 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:47:41 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:47:41 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:47:41 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:47:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebed7yje HTTP/1.1" 200 - -2025-12-05 13:47:41 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=0jqZzlYt6GNZfsAhAAAB -2025-12-05 13:47:41 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=0jqZzlYt6GNZfsAhAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:47:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebhbg0kz&sid=Em6LkRcf2hYn51RUAAAA HTTP/1.1" 200 - -2025-12-05 13:47:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:41] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebhbgyhu&sid=Em6LkRcf2hYn51RUAAAA HTTP/1.1" 200 - -2025-12-05 13:47:50 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:47:50 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:47:55 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:47:55 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:47:56 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:47:56 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:47:56 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:47:56 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:47:56 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:56] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebp62eq5 HTTP/1.1" 200 - -2025-12-05 13:47:56 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=r7DKxmneZm5EmQwxAAAB -2025-12-05 13:47:56 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=r7DKxmneZm5EmQwxAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:47:56 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:56] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebsr2q72&sid=kreRxV12yHLrpRKjAAAA HTTP/1.1" 200 - -2025-12-05 13:47:56 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:47:56] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebsr1oyz&sid=kreRxV12yHLrpRKjAAAA HTTP/1.1" 200 - -2025-12-05 13:48:02 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:48:03 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:48:07 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:48:08 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:48:08 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:48:08 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:48:08 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:48:08 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:48:09 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:09] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ebz765q0 HTTP/1.1" 200 - -2025-12-05 13:48:09 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=IYCyIGQWi63MZ14eAAAB -2025-12-05 13:48:09 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=IYCyIGQWi63MZ14eAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:48:09 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:09] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ec37se9p&sid=IguH4qFqvn1QmBLoAAAA HTTP/1.1" 200 - -2025-12-05 13:48:09 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:09] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ec37rt3m&sid=IguH4qFqvn1QmBLoAAAA HTTP/1.1" 200 - -2025-12-05 13:48:19 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/services/llm_service.py', reloading -2025-12-05 13:48:19 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:48:23 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:48:24 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:48:24 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:48:24 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:48:24 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:48:24 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:48:24 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:24] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecbjmwiw HTTP/1.1" 200 - -2025-12-05 13:48:24 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=Kd_Kym6IxK8knBebAAAB -2025-12-05 13:48:24 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=Kd_Kym6IxK8knBebAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:48:24 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:24] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eceesb1x&sid=L9b8xKVnKagyawbSAAAA HTTP/1.1" 200 - -2025-12-05 13:48:24 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:24] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eceeranc&sid=L9b8xKVnKagyawbSAAAA HTTP/1.1" 200 - -2025-12-05 13:48:43 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading -2025-12-05 13:48:43 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:48:47 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:48:48 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:48:48 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:48:48 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:48:49 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:48:49 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:48:49 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:49] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecu2alx0 HTTP/1.1" 200 - -2025-12-05 13:48:49 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=_5nWAWjVY9ItJOzUAAAB -2025-12-05 13:48:49 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=_5nWAWjVY9ItJOzUAAAB user=693337b5c1663e36f4063368 -2025-12-05 13:48:49 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:49] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecxj64cs&sid=ThdHWaVvuzGAIB9VAAAA HTTP/1.1" 200 - -2025-12-05 13:48:49 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:48:49] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ecxj54b4&sid=ThdHWaVvuzGAIB9VAAAA HTTP/1.1" 200 - -2025-12-05 13:49:04 [INFO] werkzeug:97 – * Detected change in '/home/btouatta/Documents/ECS 265/ResCanvas/backend/routes/ai_assistant.py', reloading -2025-12-05 13:49:05 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:49:09 [INFO] middleware.rate_limit:255 – Rate limiting ENABLED: storage=redis://localhost:6379 -2025-12-05 13:49:10 [DEBUG] passlib.registry:296 – registered 'bcrypt' handler: -2025-12-05 13:49:10 [INFO] services.socketio_service:83 – socketio_service: attempting to register routes.socketio_handlers handlers -2025-12-05 13:49:10 [INFO] services.socketio_service:98 – socketio_service: registered handlers from routes.socketio_handlers -2025-12-05 13:49:10 [WARNING] werkzeug:97 – * Debugger is active! -2025-12-05 13:49:10 [INFO] werkzeug:97 – * Debugger PIN: 486-396-234 -2025-12-05 13:49:11 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:11] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eda9mnek HTTP/1.1" 200 - -2025-12-05 13:49:11 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=rn7mEChoVe5Jaig2AAAB -2025-12-05 13:49:11 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=rn7mEChoVe5Jaig2AAAB user=693337b5c1663e36f4063368 -2025-12-05 13:49:11 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:11] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edenv9pj&sid=WJcUM-3L40jWusjyAAAA HTTP/1.1" 200 - -2025-12-05 13:49:11 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:11] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edenvmuv&sid=WJcUM-3L40jWusjyAAAA HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=WJcUM-3L40jWusjyAAAA HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:25] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:25 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} -2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:26 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edqgzgxv HTTP/1.1" 200 - -2025-12-05 13:49:26 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=ac7PjBQZNZQef5kTAAAD -2025-12-05 13:49:26 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=ac7PjBQZNZQef5kTAAAD user=693337b5c1663e36f4063368 -2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edqhb298&sid=ME9TcIC7EmYrltysAAAC HTTP/1.1" 200 - -2025-12-05 13:49:26 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:26] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edqha15n&sid=ME9TcIC7EmYrltysAAAC HTTP/1.1" 200 - -2025-12-05 13:49:26 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 -2025-12-05 13:49:26 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=ac7PjBQZNZQef5kTAAAD room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara -2025-12-05 13:49:26 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'ac7PjBQZNZQef5kTAAAD', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} -2025-12-05 13:49:26 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:26 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:26 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=ac7PjBQZNZQef5kTAAAD had_cached_claims=True -2025-12-05 13:49:27 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:27 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:27 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:27 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:27 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:27 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:27 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:27 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:27 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:27 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:27 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:27 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:27 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:27 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:27 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:27] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:27 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:28 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:28 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:28 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:28 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:28 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:28 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:28 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:28 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:28 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:28 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:28 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:28 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:28 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:28 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:28 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:28 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:28 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:28] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:28 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:29 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:29 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:30 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:30 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:30 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:30 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:30 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:30 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:30 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:30 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:30 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:30 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:30 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:30 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:30 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:30 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:30 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:30] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=ME9TcIC7EmYrltysAAAC HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:31] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:31 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:32 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:32 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edv3mhha HTTP/1.1" 200 - -2025-12-05 13:49:32 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=Jrrtdn1JqDu4SkDZAAAF -2025-12-05 13:49:32 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=Jrrtdn1JqDu4SkDZAAAF user=693337b5c1663e36f4063368 -2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edv3vcft&sid=vR4EhT0qfu4uv9wvAAAE HTTP/1.1" 200 - -2025-12-05 13:49:32 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:32] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=edv3usc9&sid=vR4EhT0qfu4uv9wvAAAE HTTP/1.1" 200 - -2025-12-05 13:49:32 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 -2025-12-05 13:49:32 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=Jrrtdn1JqDu4SkDZAAAF room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara -2025-12-05 13:49:32 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'Jrrtdn1JqDu4SkDZAAAF', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} -2025-12-05 13:49:32 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=Jrrtdn1JqDu4SkDZAAAF had_cached_claims=True -2025-12-05 13:49:33 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:33 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:33 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:33 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:33 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:33 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:33 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:33 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:33 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:33 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:33 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:33 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:33 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:33 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:33 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:33] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:33 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:33 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:33 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:34 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:34 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:34 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:34 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:34 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:34 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:34 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:34 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:34 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:34 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:34 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:34 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:34 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:34 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:34 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:34] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:34 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:35 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:35 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:35 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:35 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:35 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:35 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:35 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:35 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:35 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:35 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:35 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:35 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:35 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:35 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:35 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:35 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:35 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:35] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=vR4EhT0qfu4uv9wvAAAE HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:40] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:40 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:41 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:41 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ee21m40i HTTP/1.1" 200 - -2025-12-05 13:49:41 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=op9Ci6dAzqydBWJbAAAH -2025-12-05 13:49:41 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=op9Ci6dAzqydBWJbAAAH user=693337b5c1663e36f4063368 -2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ee21vzaf&sid=BBrbtykpS2oxaYvuAAAG HTTP/1.1" 200 - -2025-12-05 13:49:41 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:41] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=ee21uua5&sid=BBrbtykpS2oxaYvuAAAG HTTP/1.1" 200 - -2025-12-05 13:49:41 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 -2025-12-05 13:49:41 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=op9Ci6dAzqydBWJbAAAH room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara -2025-12-05 13:49:41 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'op9Ci6dAzqydBWJbAAAH', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} -2025-12-05 13:49:41 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=op9Ci6dAzqydBWJbAAAH had_cached_claims=True -2025-12-05 13:49:42 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:42 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:42 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:42 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:42 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:42 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:42 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:42 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:42 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:42 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:42 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:42 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:42 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:42 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:42 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:42] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:42 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:42 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:42 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:43 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:43 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:43 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:43 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:43 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:43 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:43 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:43 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:43 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:43 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:43 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:43 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:43 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:43 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:43 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:43] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:43 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:44 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:44 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:44 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:44 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:44 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:44 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:44 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:44 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:44 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:44 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:44 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:44 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:44 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:44 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:44 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:44 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:44 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:44] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=BBrbtykpS2oxaYvuAAAG HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "OPTIONS /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} -2025-12-05 13:49:57 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:57 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:57] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:58 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eef5unxm HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=HwlCgOJhcM7mCCWxAAAJ -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=HwlCgOJhcM7mCCWxAAAJ user=693337b5c1663e36f4063368 -2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eef6q7en&sid=f-H49NUyWfouRGswAAAI HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eef6pcy6&sid=f-H49NUyWfouRGswAAAI HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 -2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:58] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=HwlCgOJhcM7mCCWxAAAJ room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'HwlCgOJhcM7mCCWxAAAJ', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} -2025-12-05 13:49:58 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=HwlCgOJhcM7mCCWxAAAJ had_cached_claims=True -2025-12-05 13:49:59 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:49:59 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:59] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:49:59 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:49:59 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:49:59 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:49:59 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:49:59 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:49:59 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:49:59 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:59 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:49:59 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:59 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:49:59 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:49:59 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:49:59 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:49:59 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:49:59] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:49:59 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:49:59 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} -2025-12-05 13:49:59 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=HwlCgOJhcM7mCCWxAAAJ room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara -2025-12-05 13:49:59 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'HwlCgOJhcM7mCCWxAAAJ', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} -2025-12-05 13:49:59 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=HwlCgOJhcM7mCCWxAAAJ had_cached_claims=True -2025-12-05 13:49:59 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:49:59 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:50:00 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:50:00 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:50:00 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:50:00 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:50:00 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:50:00 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:50:00 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:50:00 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:00 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:50:00 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:00 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:50:00 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:50:00 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:00 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:50:00 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=websocket&sid=f-H49NUyWfouRGswAAAI HTTP/1.1" 200 - -2025-12-05 13:50:00 [INFO] routes.socketio_handlers:164 – socket: emitting user_left to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'username': 'btouattara', 'members': []} -2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:50:00 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:00] "POST /rooms/693337c7c1663e36f406336a/reset_my_stacks HTTP/1.1" 200 - -2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /rooms/693337c7c1663e36f406336a/undo_redo_status HTTP/1.1" 200 - -2025-12-05 13:50:01 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:50:01 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:50:01 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eehh6t1u HTTP/1.1" 200 - -2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:50:01 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:50:01 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:50:01 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:50:01 [INFO] routes.socketio_handlers:25 – socket: connect attempt token_present=True remote_addr=127.0.0.1 transport=polling sid=m18YlUK9qfl01DLMAAAL -2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eehhkuf3&sid=NpPo63MDbKr1DeWTAAAK HTTP/1.1" 200 - -2025-12-05 13:50:01 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:50:01 [INFO] routes.socketio_handlers:35 – socket: stored claims for sid=m18YlUK9qfl01DLMAAAL user=693337b5c1663e36f4063368 -2025-12-05 13:50:01 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "POST /socket.io/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJyZXNjYW52YXMiLCJzdWIiOiI2OTMzMzdiNWMxNjYzZTM2ZjQwNjMzNjgiLCJ1c2VybmFtZSI6ImJ0b3VhdHRhcmEiLCJleHAiOjE3NjU1NzUyNjR9.wpBGN02-MFtLLYe3Ga9NpfvNq-yhs2k6w_YA5xofefU&EIO=4&transport=polling&t=eehhjw4h&sid=NpPo63MDbKr1DeWTAAAK HTTP/1.1" 200 - -2025-12-05 13:50:01 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:50:01 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:01 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:50:01 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:01 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:50:01 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:50:01 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:01 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:01 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:01] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:50:01 [INFO] routes.socketio_handlers:72 – socket: decoded claims from payload for user=693337b5c1663e36f4063368 -2025-12-05 13:50:01 [INFO] routes.socketio_handlers:95 – socket: join_room request sid=m18YlUK9qfl01DLMAAAL room=693337c7c1663e36f406336a token_present=True user=693337b5c1663e36f4063368 username=btouattara -2025-12-05 13:50:01 [INFO] routes.socketio_handlers:110 – socket: debug broadcast to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'sid': 'm18YlUK9qfl01DLMAAAL', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara'} -2025-12-05 13:50:01 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:50:01 [INFO] routes.socketio_handlers:126 – socket: emitting user_joined to room 693337c7c1663e36f406336a payload={'roomId': '693337c7c1663e36f406336a', 'userId': '693337b5c1663e36f4063368', 'username': 'btouattara', 'members': []} sid=m18YlUK9qfl01DLMAAAL had_cached_claims=True -2025-12-05 13:50:02 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:50:02 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:50:02 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:50:02 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:50:02 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:50:03 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:50:03 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:50:03 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:50:03 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:50:03 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:50:03 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:50:03 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:03 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:50:03 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:03 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:50:03 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:50:03 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:03 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:03 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:03] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:50:03 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:50:03 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:50:03 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:50:04 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:50:04 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:50:04 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:50:04 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:50:04 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:50:04 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:50:04 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:50:04 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:04 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:50:04 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:04 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:50:04 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:50:04 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:04 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:04 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:04] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:50:04 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:50:05 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:50:05 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:50:05 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:50:05 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:50:05 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:50:05 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:50:05 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:50:05 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:50:05 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:50:05 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:05 [WARNING] routes.rooms:1458 – -Stroke 1 complete data: -2025-12-05 13:50:05 [WARNING] routes.rooms:1459 – { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:05 [WARNING] routes.rooms:1461 – ================================================================================ -2025-12-05 13:50:05 [INFO] routes.rooms:1464 – GET strokes debug - returning 6 strokes -2025-12-05 13:50:05 [INFO] routes.rooms:1466 – Stroke 0: { - "drawingId": "drawing_1764970477037_oi8l0skpm", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 464, - "y": 301.234375 - }, - { - "x": 467, - "y": 300.234375 - }, - { - "x": 468, - "y": 297.234375 - }, - { - "x": 473, - "y": 290.234375 - }, - { - "x": 476, - "y": 282.234375 - }, - { - "x": 482, - "y": 274.234375 - }, - { - "x": 493, - "y": 255.234375 - }, - { - "x": 497, - "y": 247.234375 - }, - { - "x": 502, - "y": 236.234375 - }, - { - "x": 506, - "y": 230.234375 - }, - { - "x": 507, - "y": 224.234375 - }, - { - "x": 511, - "y": 219.234375 - }, - { - "x": 512, - "y": 215.234375 - }, - { - "x": 513, - "y": 212.234375 - }, - { - "x": 513, - "y": 211.234375 - }, - { - "x": 514, - "y": 209.234375 - }, - { - "x": 515, - "y": 208.234375 - }, - { - "x": 515, - "y": 207.234375 - }, - { - "x": 516, - "y": 206.234375 - }, - { - "x": 517, - "y": 204.234375 - }, - { - "x": 517, - "y": 203.234375 - }, - { - "x": 518, - "y": 201.234375 - }, - { - "x": 520, - "y": 199.234375 - }, - { - "x": 521, - "y": 197.234375 - }, - { - "x": 522, - "y": 196.234375 - }, - { - "x": 523, - "y": 198.234375 - }, - { - "x": 525, - "y": 200.234375 - }, - { - "x": 525, - "y": 203.234375 - }, - { - "x": 527, - "y": 207.234375 - }, - { - "x": 530, - "y": 209.234375 - }, - { - "x": 531, - "y": 211.234375 - }, - { - "x": 532, - "y": 213.234375 - }, - { - "x": 533, - "y": 216.234375 - }, - { - "x": 535, - "y": 218.234375 - }, - { - "x": 536, - "y": 222.234375 - }, - { - "x": 536, - "y": 223.234375 - }, - { - "x": 537, - "y": 226.234375 - }, - { - "x": 538, - "y": 229.234375 - }, - { - "x": 540, - "y": 232.234375 - }, - { - "x": 541, - "y": 234.234375 - }, - { - "x": 542, - "y": 238.234375 - }, - { - "x": 543, - "y": 242.234375 - }, - { - "x": 545, - "y": 245.234375 - }, - { - "x": 546, - "y": 247.234375 - }, - { - "x": 547, - "y": 249.234375 - }, - { - "x": 547, - "y": 250.234375 - }, - { - "x": 548, - "y": 253.234375 - }, - { - "x": 548, - "y": 254.234375 - }, - { - "x": 551, - "y": 258.234375 - }, - { - "x": 552, - "y": 259.234375 - }, - { - "x": 553, - "y": 261.234375 - }, - { - "x": 553, - "y": 262.234375 - }, - { - "x": 555, - "y": 264.234375 - }, - { - "x": 555, - "y": 265.234375 - }, - { - "x": 556, - "y": 266.234375 - }, - { - "x": 556, - "y": 267.234375 - }, - { - "x": 557, - "y": 269.234375 - }, - { - "x": 557, - "y": 270.234375 - }, - { - "x": 558, - "y": 271.234375 - }, - { - "x": 558, - "y": 272.234375 - }, - { - "x": 558, - "y": 273.234375 - }, - { - "x": 558, - "y": 274.234375 - }, - { - "x": 559, - "y": 275.234375 - }, - { - "x": 560, - "y": 276.234375 - }, - { - "x": 561, - "y": 278.234375 - }, - { - "x": 561, - "y": 279.234375 - }, - { - "x": 562, - "y": 281.234375 - }, - { - "x": 562, - "y": 282.234375 - }, - { - "x": 563, - "y": 283.234375 - }, - { - "x": 563, - "y": 284.234375 - }, - { - "x": 564, - "y": 284.234375 - }, - { - "x": 565, - "y": 285.234375 - }, - { - "x": 565, - "y": 286.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 565, - "y": 287.234375 - }, - { - "x": 566, - "y": 288.234375 - }, - { - "x": 567, - "y": 290.234375 - }, - { - "x": 567, - "y": 291.234375 - }, - { - "x": 569, - "y": 293.234375 - }, - { - "x": 570, - "y": 296.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 570, - "y": 297.234375 - }, - { - "x": 571, - "y": 297.234375 - }, - { - "x": 572, - "y": 297.234375 - }, - { - "x": 573, - "y": 297.234375 - }, - { - "x": 574, - "y": 297.234375 - }, - { - "x": 576, - "y": 297.234375 - }, - { - "x": 578, - "y": 297.234375 - }, - { - "x": 581, - "y": 297.234375 - }, - { - "x": 582, - "y": 297.234375 - }, - { - "x": 583, - "y": 297.234375 - }, - { - "x": 586, - "y": 297.234375 - }, - { - "x": 587, - "y": 297.234375 - }, - { - "x": 588, - "y": 297.234375 - }, - { - "x": 589, - "y": 297.234375 - }, - { - "x": 591, - "y": 297.234375 - }, - { - "x": 592, - "y": 297.234375 - }, - { - "x": 594, - "y": 297.234375 - }, - { - "x": 596, - "y": 297.234375 - }, - { - "x": 597, - "y": 297.234375 - }, - { - "x": 599, - "y": 297.234375 - }, - { - "x": 601, - "y": 297.234375 - }, - { - "x": 603, - "y": 297.234375 - }, - { - "x": 607, - "y": 297.234375 - }, - { - "x": 608, - "y": 297.234375 - }, - { - "x": 611, - "y": 297.234375 - }, - { - "x": 613, - "y": 297.234375 - }, - { - "x": 616, - "y": 297.234375 - }, - { - "x": 618, - "y": 297.234375 - }, - { - "x": 621, - "y": 297.234375 - }, - { - "x": 622, - "y": 297.234375 - }, - { - "x": 624, - "y": 297.234375 - }, - { - "x": 626, - "y": 297.234375 - }, - { - "x": 627, - "y": 297.234375 - }, - { - "x": 629, - "y": 297.234375 - }, - { - "x": 631, - "y": 297.234375 - }, - { - "x": 633, - "y": 297.234375 - }, - { - "x": 636, - "y": 297.234375 - }, - { - "x": 637, - "y": 297.234375 - }, - { - "x": 638, - "y": 297.234375 - }, - { - "x": 639, - "y": 297.234375 - }, - { - "x": 642, - "y": 297.234375 - }, - { - "x": 643, - "y": 297.234375 - }, - { - "x": 646, - "y": 297.234375 - }, - { - "x": 647, - "y": 297.234375 - }, - { - "x": 648, - "y": 297.234375 - }, - { - "x": 651, - "y": 297.234375 - }, - { - "x": 652, - "y": 297.234375 - }, - { - "x": 653, - "y": 297.234375 - }, - { - "x": 654, - "y": 297.234375 - }, - { - "x": 656, - "y": 297.234375 - }, - { - "x": 658, - "y": 297.234375 - }, - { - "x": 659, - "y": 297.234375 - }, - { - "x": 662, - "y": 297.234375 - }, - { - "x": 663, - "y": 297.234375 - }, - { - "x": 664, - "y": 297.234375 - }, - { - "x": 666, - "y": 297.234375 - }, - { - "x": 668, - "y": 297.234375 - }, - { - "x": 669, - "y": 297.234375 - }, - { - "x": 671, - "y": 297.234375 - }, - { - "x": 672, - "y": 297.234375 - }, - { - "x": 673, - "y": 297.234375 - }, - { - "x": 676, - "y": 297.234375 - }, - { - "x": 677, - "y": 297.234375 - }, - { - "x": 678, - "y": 297.234375 - }, - { - "x": 679, - "y": 297.234375 - }, - { - "x": 681, - "y": 297.234375 - }, - { - "x": 682, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 683, - "y": 297.234375 - }, - { - "x": 685, - "y": 297.234375 - }, - { - "x": 686, - "y": 298.234375 - }, - { - "x": 686, - "y": 299.234375 - }, - { - "x": 685, - "y": 300.234375 - }, - { - "x": 684, - "y": 301.234375 - }, - { - "x": 683, - "y": 303.234375 - }, - { - "x": 681, - "y": 304.234375 - }, - { - "x": 680, - "y": 306.234375 - }, - { - "x": 679, - "y": 308.234375 - }, - { - "x": 678, - "y": 310.234375 - }, - { - "x": 676, - "y": 311.234375 - }, - { - "x": 674, - "y": 312.234375 - }, - { - "x": 672, - "y": 313.234375 - }, - { - "x": 670, - "y": 314.234375 - }, - { - "x": 669, - "y": 316.234375 - }, - { - "x": 668, - "y": 317.234375 - }, - { - "x": 666, - "y": 319.234375 - }, - { - "x": 665, - "y": 320.234375 - }, - { - "x": 664, - "y": 323.234375 - }, - { - "x": 663, - "y": 325.234375 - }, - { - "x": 662, - "y": 327.234375 - }, - { - "x": 659, - "y": 330.234375 - }, - { - "x": 657, - "y": 332.234375 - }, - { - "x": 656, - "y": 333.234375 - }, - { - "x": 655, - "y": 334.234375 - }, - { - "x": 654, - "y": 335.234375 - }, - { - "x": 652, - "y": 337.234375 - }, - { - "x": 651, - "y": 338.234375 - }, - { - "x": 651, - "y": 339.234375 - }, - { - "x": 650, - "y": 341.234375 - }, - { - "x": 649, - "y": 342.234375 - }, - { - "x": 648, - "y": 344.234375 - }, - { - "x": 647, - "y": 346.234375 - }, - { - "x": 646, - "y": 347.234375 - }, - { - "x": 646, - "y": 349.234375 - }, - { - "x": 645, - "y": 350.234375 - }, - { - "x": 644, - "y": 351.234375 - }, - { - "x": 643, - "y": 353.234375 - }, - { - "x": 643, - "y": 354.234375 - }, - { - "x": 641, - "y": 356.234375 - }, - { - "x": 640, - "y": 357.234375 - }, - { - "x": 639, - "y": 359.234375 - }, - { - "x": 636, - "y": 362.234375 - }, - { - "x": 635, - "y": 363.234375 - }, - { - "x": 634, - "y": 365.234375 - }, - { - "x": 632, - "y": 368.234375 - }, - { - "x": 631, - "y": 369.234375 - }, - { - "x": 630, - "y": 371.234375 - }, - { - "x": 629, - "y": 372.234375 - }, - { - "x": 628, - "y": 373.234375 - }, - { - "x": 628, - "y": 375.234375 - }, - { - "x": 627, - "y": 376.234375 - }, - { - "x": 625, - "y": 377.234375 - }, - { - "x": 623, - "y": 379.234375 - }, - { - "x": 621, - "y": 381.234375 - }, - { - "x": 620, - "y": 382.234375 - }, - { - "x": 619, - "y": 382.234375 - }, - { - "x": 616, - "y": 383.234375 - }, - { - "x": 616, - "y": 384.234375 - }, - { - "x": 615, - "y": 385.234375 - }, - { - "x": 609, - "y": 391.234375 - }, - { - "x": 608, - "y": 392.234375 - }, - { - "x": 607, - "y": 393.234375 - }, - { - "x": 605, - "y": 394.234375 - }, - { - "x": 604, - "y": 394.234375 - }, - { - "x": 602, - "y": 396.234375 - }, - { - "x": 601, - "y": 397.234375 - }, - { - "x": 599, - "y": 398.234375 - }, - { - "x": 598, - "y": 399.234375 - }, - { - "x": 597, - "y": 400.234375 - }, - { - "x": 596, - "y": 402.234375 - }, - { - "x": 594, - "y": 403.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 594, - "y": 405.234375 - }, - { - "x": 593, - "y": 406.234375 - }, - { - "x": 593, - "y": 407.234375 - }, - { - "x": 593, - "y": 408.234375 - }, - { - "x": 595, - "y": 412.234375 - }, - { - "x": 596, - "y": 414.234375 - }, - { - "x": 597, - "y": 417.234375 - }, - { - "x": 598, - "y": 420.234375 - }, - { - "x": 602, - "y": 423.234375 - }, - { - "x": 603, - "y": 425.234375 - }, - { - "x": 604, - "y": 426.234375 - }, - { - "x": 604, - "y": 429.234375 - }, - { - "x": 606, - "y": 430.234375 - }, - { - "x": 607, - "y": 431.234375 - }, - { - "x": 609, - "y": 433.234375 - }, - { - "x": 609, - "y": 435.234375 - }, - { - "x": 611, - "y": 437.234375 - }, - { - "x": 612, - "y": 438.234375 - }, - { - "x": 614, - "y": 439.234375 - }, - { - "x": 614, - "y": 440.234375 - }, - { - "x": 616, - "y": 442.234375 - }, - { - "x": 617, - "y": 443.234375 - }, - { - "x": 618, - "y": 444.234375 - }, - { - "x": 619, - "y": 446.234375 - }, - { - "x": 620, - "y": 448.234375 - }, - { - "x": 621, - "y": 449.234375 - }, - { - "x": 622, - "y": 450.234375 - }, - { - "x": 623, - "y": 453.234375 - }, - { - "x": 623, - "y": 454.234375 - }, - { - "x": 624, - "y": 455.234375 - }, - { - "x": 626, - "y": 457.234375 - }, - { - "x": 627, - "y": 458.234375 - }, - { - "x": 627, - "y": 459.234375 - }, - { - "x": 628, - "y": 462.234375 - }, - { - "x": 629, - "y": 465.234375 - }, - { - "x": 631, - "y": 467.234375 - }, - { - "x": 633, - "y": 471.234375 - }, - { - "x": 634, - "y": 473.234375 - }, - { - "x": 634, - "y": 475.234375 - }, - { - "x": 636, - "y": 477.234375 - }, - { - "x": 637, - "y": 480.234375 - }, - { - "x": 638, - "y": 482.234375 - }, - { - "x": 638, - "y": 484.234375 - }, - { - "x": 639, - "y": 485.234375 - }, - { - "x": 641, - "y": 488.234375 - }, - { - "x": 642, - "y": 489.234375 - }, - { - "x": 642, - "y": 490.234375 - }, - { - "x": 642, - "y": 491.234375 - }, - { - "x": 643, - "y": 492.234375 - }, - { - "x": 643, - "y": 494.234375 - }, - { - "x": 644, - "y": 495.234375 - }, - { - "x": 644, - "y": 496.234375 - }, - { - "x": 644, - "y": 497.234375 - }, - { - "x": 646, - "y": 499.234375 - }, - { - "x": 646, - "y": 501.234375 - }, - { - "x": 647, - "y": 502.234375 - }, - { - "x": 647, - "y": 504.234375 - }, - { - "x": 647, - "y": 505.234375 - }, - { - "x": 647, - "y": 506.234375 - }, - { - "x": 648, - "y": 507.234375 - }, - { - "x": 648, - "y": 509.234375 - }, - { - "x": 649, - "y": 511.234375 - }, - { - "x": 649, - "y": 512.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 513.234375 - }, - { - "x": 650, - "y": 514.234375 - }, - { - "x": 647, - "y": 514.234375 - }, - { - "x": 644, - "y": 512.234375 - }, - { - "x": 643, - "y": 511.234375 - }, - { - "x": 641, - "y": 511.234375 - }, - { - "x": 637, - "y": 509.234375 - }, - { - "x": 635, - "y": 508.234375 - }, - { - "x": 634, - "y": 507.234375 - }, - { - "x": 631, - "y": 506.234375 - }, - { - "x": 629, - "y": 504.234375 - }, - { - "x": 626, - "y": 503.234375 - }, - { - "x": 623, - "y": 501.234375 - }, - { - "x": 621, - "y": 501.234375 - }, - { - "x": 618, - "y": 498.234375 - }, - { - "x": 614, - "y": 497.234375 - }, - { - "x": 610, - "y": 495.234375 - }, - { - "x": 609, - "y": 494.234375 - }, - { - "x": 605, - "y": 491.234375 - }, - { - "x": 604, - "y": 490.234375 - }, - { - "x": 601, - "y": 488.234375 - }, - { - "x": 599, - "y": 487.234375 - }, - { - "x": 597, - "y": 486.234375 - }, - { - "x": 596, - "y": 485.234375 - }, - { - "x": 593, - "y": 484.234375 - }, - { - "x": 591, - "y": 482.234375 - }, - { - "x": 588, - "y": 480.234375 - }, - { - "x": 586, - "y": 478.234375 - }, - { - "x": 584, - "y": 477.234375 - }, - { - "x": 580, - "y": 475.234375 - }, - { - "x": 578, - "y": 473.234375 - }, - { - "x": 575, - "y": 471.234375 - }, - { - "x": 571, - "y": 468.234375 - }, - { - "x": 569, - "y": 467.234375 - }, - { - "x": 566, - "y": 465.234375 - }, - { - "x": 562, - "y": 461.234375 - }, - { - "x": 558, - "y": 459.234375 - }, - { - "x": 556, - "y": 457.234375 - }, - { - "x": 553, - "y": 455.234375 - }, - { - "x": 550, - "y": 452.234375 - }, - { - "x": 548, - "y": 450.234375 - }, - { - "x": 543, - "y": 446.234375 - }, - { - "x": 541, - "y": 444.234375 - }, - { - "x": 535, - "y": 441.234375 - }, - { - "x": 530, - "y": 437.234375 - }, - { - "x": 525, - "y": 433.234375 - }, - { - "x": 521, - "y": 431.234375 - }, - { - "x": 518, - "y": 428.234375 - }, - { - "x": 515, - "y": 426.234375 - }, - { - "x": 513, - "y": 426.234375 - }, - { - "x": 512, - "y": 425.234375 - }, - { - "x": 510, - "y": 424.234375 - }, - { - "x": 508, - "y": 422.234375 - }, - { - "x": 507, - "y": 422.234375 - }, - { - "x": 506, - "y": 422.234375 - }, - { - "x": 506, - "y": 421.234375 - }, - { - "x": 506, - "y": 420.234375 - }, - { - "x": 505, - "y": 419.234375 - }, - { - "x": 504, - "y": 418.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 503, - "y": 417.234375 - }, - { - "x": 501, - "y": 420.234375 - }, - { - "x": 499, - "y": 423.234375 - }, - { - "x": 498, - "y": 425.234375 - }, - { - "x": 496, - "y": 428.234375 - }, - { - "x": 492, - "y": 432.234375 - }, - { - "x": 489, - "y": 435.234375 - }, - { - "x": 487, - "y": 437.234375 - }, - { - "x": 481, - "y": 441.234375 - }, - { - "x": 476, - "y": 443.234375 - }, - { - "x": 472, - "y": 447.234375 - }, - { - "x": 469, - "y": 448.234375 - }, - { - "x": 466, - "y": 451.234375 - }, - { - "x": 463, - "y": 453.234375 - }, - { - "x": 460, - "y": 454.234375 - }, - { - "x": 456, - "y": 457.234375 - }, - { - "x": 453, - "y": 460.234375 - }, - { - "x": 449, - "y": 463.234375 - }, - { - "x": 445, - "y": 465.234375 - }, - { - "x": 440, - "y": 469.234375 - }, - { - "x": 437, - "y": 471.234375 - }, - { - "x": 434, - "y": 474.234375 - }, - { - "x": 430, - "y": 477.234375 - }, - { - "x": 426, - "y": 481.234375 - }, - { - "x": 423, - "y": 484.234375 - }, - { - "x": 420, - "y": 486.234375 - }, - { - "x": 418, - "y": 488.234375 - }, - { - "x": 415, - "y": 491.234375 - }, - { - "x": 414, - "y": 492.234375 - }, - { - "x": 414, - "y": 494.234375 - }, - { - "x": 414, - "y": 495.234375 - }, - { - "x": 413, - "y": 497.234375 - }, - { - "x": 413, - "y": 499.234375 - }, - { - "x": 412, - "y": 501.234375 - }, - { - "x": 411, - "y": 502.234375 - }, - { - "x": 410, - "y": 503.234375 - }, - { - "x": 410, - "y": 504.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 505.234375 - }, - { - "x": 409, - "y": 506.234375 - }, - { - "x": 408, - "y": 507.234375 - }, - { - "x": 408, - "y": 508.234375 - }, - { - "x": 407, - "y": 509.234375 - }, - { - "x": 406, - "y": 511.234375 - }, - { - "x": 405, - "y": 512.234375 - }, - { - "x": 404, - "y": 514.234375 - }, - { - "x": 403, - "y": 515.234375 - }, - { - "x": 401, - "y": 516.234375 - }, - { - "x": 400, - "y": 517.234375 - }, - { - "x": 399, - "y": 519.234375 - }, - { - "x": 398, - "y": 520.234375 - }, - { - "x": 395, - "y": 521.234375 - }, - { - "x": 394, - "y": 522.234375 - }, - { - "x": 393, - "y": 522.234375 - }, - { - "x": 391, - "y": 522.234375 - }, - { - "x": 389, - "y": 523.234375 - }, - { - "x": 388, - "y": 524.234375 - }, - { - "x": 386, - "y": 524.234375 - }, - { - "x": 385, - "y": 525.234375 - }, - { - "x": 384, - "y": 525.234375 - }, - { - "x": 383, - "y": 525.234375 - }, - { - "x": 383, - "y": 526.234375 - }, - { - "x": 382, - "y": 526.234375 - }, - { - "x": 380, - "y": 524.234375 - }, - { - "x": 379, - "y": 522.234375 - }, - { - "x": 378, - "y": 519.234375 - }, - { - "x": 376, - "y": 515.234375 - }, - { - "x": 376, - "y": 513.234375 - }, - { - "x": 375, - "y": 509.234375 - }, - { - "x": 375, - "y": 507.234375 - }, - { - "x": 375, - "y": 503.234375 - }, - { - "x": 375, - "y": 498.234375 - }, - { - "x": 375, - "y": 494.234375 - }, - { - "x": 375, - "y": 491.234375 - }, - { - "x": 375, - "y": 486.234375 - }, - { - "x": 375, - "y": 482.234375 - }, - { - "x": 375, - "y": 477.234375 - }, - { - "x": 375, - "y": 474.234375 - }, - { - "x": 375, - "y": 470.234375 - }, - { - "x": 376, - "y": 467.234375 - }, - { - "x": 378, - "y": 464.234375 - }, - { - "x": 378, - "y": 461.234375 - }, - { - "x": 379, - "y": 457.234375 - }, - { - "x": 380, - "y": 453.234375 - }, - { - "x": 382, - "y": 450.234375 - }, - { - "x": 383, - "y": 448.234375 - }, - { - "x": 384, - "y": 444.234375 - }, - { - "x": 385, - "y": 442.234375 - }, - { - "x": 387, - "y": 440.234375 - }, - { - "x": 389, - "y": 438.234375 - }, - { - "x": 391, - "y": 435.234375 - }, - { - "x": 393, - "y": 432.234375 - }, - { - "x": 397, - "y": 429.234375 - }, - { - "x": 399, - "y": 427.234375 - }, - { - "x": 400, - "y": 425.234375 - }, - { - "x": 403, - "y": 422.234375 - }, - { - "x": 404, - "y": 419.234375 - }, - { - "x": 405, - "y": 417.234375 - }, - { - "x": 406, - "y": 416.234375 - }, - { - "x": 408, - "y": 414.234375 - }, - { - "x": 409, - "y": 413.234375 - }, - { - "x": 409, - "y": 412.234375 - }, - { - "x": 410, - "y": 410.234375 - }, - { - "x": 411, - "y": 408.234375 - }, - { - "x": 412, - "y": 407.234375 - }, - { - "x": 413, - "y": 406.234375 - }, - { - "x": 414, - "y": 405.234375 - }, - { - "x": 415, - "y": 404.234375 - }, - { - "x": 415, - "y": 403.234375 - }, - { - "x": 417, - "y": 401.234375 - }, - { - "x": 417, - "y": 400.234375 - }, - { - "x": 418, - "y": 399.234375 - }, - { - "x": 419, - "y": 398.234375 - }, - { - "x": 419, - "y": 397.234375 - }, - { - "x": 419, - "y": 395.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 420, - "y": 393.234375 - }, - { - "x": 421, - "y": 392.234375 - }, - { - "x": 422, - "y": 391.234375 - }, - { - "x": 422, - "y": 390.234375 - }, - { - "x": 422, - "y": 389.234375 - }, - { - "x": 423, - "y": 388.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 386.234375 - }, - { - "x": 423, - "y": 385.234375 - }, - { - "x": 424, - "y": 384.234375 - } - ], - "timestamp": 1764970477176, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970477176, - "id": "drawing_1764970477037_oi8l0skpm" -} -2025-12-05 13:50:05 [INFO] routes.rooms:1466 – Stroke 1: { - "drawingId": "drawing_1764970479164_2ihxo34kt", - "color": "#000000", - "lineWidth": 5, - "pathData": [ - { - "x": 424, - "y": 384.234375 - }, - { - "x": 423, - "y": 383.234375 - }, - { - "x": 421, - "y": 383.234375 - }, - { - "x": 418, - "y": 383.234375 - }, - { - "x": 414, - "y": 383.234375 - }, - { - "x": 411, - "y": 383.234375 - }, - { - "x": 405, - "y": 383.234375 - }, - { - "x": 402, - "y": 381.234375 - }, - { - "x": 400, - "y": 381.234375 - }, - { - "x": 397, - "y": 381.234375 - }, - { - "x": 395, - "y": 380.234375 - }, - { - "x": 394, - "y": 380.234375 - }, - { - "x": 391, - "y": 380.234375 - }, - { - "x": 390, - "y": 380.234375 - }, - { - "x": 387, - "y": 380.234375 - }, - { - "x": 386, - "y": 379.234375 - }, - { - "x": 384, - "y": 379.234375 - }, - { - "x": 382, - "y": 379.234375 - }, - { - "x": 381, - "y": 379.234375 - }, - { - "x": 380, - "y": 379.234375 - }, - { - "x": 378, - "y": 378.234375 - }, - { - "x": 376, - "y": 378.234375 - }, - { - "x": 375, - "y": 378.234375 - }, - { - "x": 372, - "y": 378.234375 - }, - { - "x": 370, - "y": 377.234375 - }, - { - "x": 369, - "y": 376.234375 - }, - { - "x": 366, - "y": 375.234375 - }, - { - "x": 363, - "y": 374.234375 - }, - { - "x": 361, - "y": 374.234375 - }, - { - "x": 359, - "y": 373.234375 - }, - { - "x": 354, - "y": 371.234375 - }, - { - "x": 351, - "y": 369.234375 - }, - { - "x": 349, - "y": 368.234375 - }, - { - "x": 345, - "y": 367.234375 - }, - { - "x": 343, - "y": 365.234375 - }, - { - "x": 341, - "y": 364.234375 - }, - { - "x": 339, - "y": 364.234375 - }, - { - "x": 336, - "y": 363.234375 - }, - { - "x": 335, - "y": 363.234375 - }, - { - "x": 334, - "y": 362.234375 - }, - { - "x": 333, - "y": 362.234375 - }, - { - "x": 330, - "y": 362.234375 - }, - { - "x": 326, - "y": 362.234375 - }, - { - "x": 324, - "y": 362.234375 - }, - { - "x": 322, - "y": 360.234375 - }, - { - "x": 319, - "y": 360.234375 - }, - { - "x": 316, - "y": 359.234375 - }, - { - "x": 315, - "y": 359.234375 - }, - { - "x": 314, - "y": 359.234375 - }, - { - "x": 313, - "y": 359.234375 - }, - { - "x": 310, - "y": 359.234375 - }, - { - "x": 309, - "y": 359.234375 - }, - { - "x": 307, - "y": 358.234375 - }, - { - "x": 306, - "y": 358.234375 - }, - { - "x": 305, - "y": 358.234375 - }, - { - "x": 308, - "y": 358.234375 - }, - { - "x": 312, - "y": 355.234375 - }, - { - "x": 316, - "y": 354.234375 - }, - { - "x": 323, - "y": 350.234375 - }, - { - "x": 327, - "y": 349.234375 - }, - { - "x": 331, - "y": 348.234375 - }, - { - "x": 333, - "y": 347.234375 - }, - { - "x": 337, - "y": 345.234375 - }, - { - "x": 339, - "y": 344.234375 - }, - { - "x": 341, - "y": 344.234375 - }, - { - "x": 343, - "y": 343.234375 - }, - { - "x": 346, - "y": 342.234375 - }, - { - "x": 348, - "y": 342.234375 - }, - { - "x": 352, - "y": 339.234375 - }, - { - "x": 356, - "y": 339.234375 - }, - { - "x": 359, - "y": 338.234375 - }, - { - "x": 363, - "y": 338.234375 - }, - { - "x": 367, - "y": 337.234375 - }, - { - "x": 373, - "y": 337.234375 - }, - { - "x": 378, - "y": 336.234375 - }, - { - "x": 384, - "y": 336.234375 - }, - { - "x": 390, - "y": 334.234375 - }, - { - "x": 397, - "y": 332.234375 - }, - { - "x": 401, - "y": 331.234375 - }, - { - "x": 405, - "y": 330.234375 - }, - { - "x": 408, - "y": 330.234375 - }, - { - "x": 411, - "y": 328.234375 - }, - { - "x": 414, - "y": 327.234375 - }, - { - "x": 415, - "y": 327.234375 - }, - { - "x": 418, - "y": 326.234375 - }, - { - "x": 419, - "y": 325.234375 - }, - { - "x": 421, - "y": 323.234375 - }, - { - "x": 423, - "y": 322.234375 - }, - { - "x": 425, - "y": 321.234375 - }, - { - "x": 428, - "y": 320.234375 - }, - { - "x": 430, - "y": 320.234375 - }, - { - "x": 432, - "y": 318.234375 - }, - { - "x": 434, - "y": 318.234375 - }, - { - "x": 435, - "y": 317.234375 - }, - { - "x": 437, - "y": 316.234375 - }, - { - "x": 438, - "y": 316.234375 - }, - { - "x": 440, - "y": 315.234375 - }, - { - "x": 442, - "y": 314.234375 - }, - { - "x": 444, - "y": 312.234375 - }, - { - "x": 445, - "y": 312.234375 - }, - { - "x": 446, - "y": 311.234375 - }, - { - "x": 448, - "y": 310.234375 - }, - { - "x": 450, - "y": 309.234375 - }, - { - "x": 451, - "y": 308.234375 - }, - { - "x": 452, - "y": 307.234375 - }, - { - "x": 453, - "y": 307.234375 - }, - { - "x": 454, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 455, - "y": 306.234375 - }, - { - "x": 457, - "y": 305.234375 - }, - { - "x": 458, - "y": 305.234375 - }, - { - "x": 460, - "y": 304.234375 - }, - { - "x": 461, - "y": 303.234375 - } - ], - "timestamp": 1764970487863, - "user": "btouattara", - "roomId": "693337c7c1663e36f406336a", - "skipUndoStack": false, - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {}, - "metadata": { - "brushStyle": "round", - "brushType": "normal", - "brushParams": {}, - "drawingType": "stroke", - "stampData": null, - "stampSettings": null, - "filterType": null, - "filterParams": {} - }, - "ts": 1764970487863, - "id": "drawing_1764970479164_2ihxo34kt" -} -2025-12-05 13:50:05 [INFO] werkzeug:97 – 127.0.0.1 - - [05/Dec/2025 13:50:05] "GET /rooms/693337c7c1663e36f406336a/strokes HTTP/1.1" 200 - -2025-12-05 13:50:05 [INFO] routes.rooms:915 – get_strokes: roomId=693337c7c1663e36f406336a user=693337b5c1663e36f4063368 owner=693337b5c1663e36f4063368 room_type=public -2025-12-05 13:50:06 [INFO] routes.rooms:944 – Retrieved 115 strokes from Redis cache for room 693337c7c1663e36f406336a -2025-12-05 13:50:06 [DEBUG] routes.rooms:965 – Loaded 0 undone strokes from Redis for room 693337c7c1663e36f406336a -2025-12-05 13:50:06 [DEBUG] routes.rooms:1029 – Total 0 undone strokes after MongoDB recovery for room 693337c7c1663e36f406336a -2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970477037_oi8l0skpm, brushType=normal, brushParams={} -2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970479164_2ihxo34kt, brushType=normal, brushParams={} -2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_ge3s7, brushType=normal, brushParams={} -2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970749865_p3fbw, brushType=normal, brushParams={} -2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970772424_evkbs, brushType=normal, brushParams={} -2025-12-05 13:50:06 [WARNING] routes.rooms:1317 – GET STROKE DEBUG (public) - roomId=693337c7c1663e36f406336a, strokeId=drawing_1764970787970_9vjou3m4q, brushType=normal, brushParams={} -2025-12-05 13:50:06 [WARNING] routes.rooms:1445 – ================================================================================ -2025-12-05 13:50:06 [WARNING] routes.rooms:1446 – GET /rooms/693337c7c1663e36f406336a/strokes - FINAL RESPONSE -2025-12-05 13:50:06 [WARNING] routes.rooms:1447 – Total strokes being returned: 6 -2025-12-05 13:50:06 [WARNING] routes.rooms:1450 – Brush strokes in response: 0 -2025-12-05 13:50:06 [WARNING] routes.rooms:1458 – -Stroke 0 complete data: -2025-12-05 13:53:10 [INFO] werkzeug:97 – * Restarting with stat -2025-12-05 13:55:04 [INFO] werkzeug:97 – * Restarting with stat diff --git a/backend/routes/ai_assistant.py b/backend/routes/ai_assistant.py index c685600f..5bec5d71 100644 --- a/backend/routes/ai_assistant.py +++ b/backend/routes/ai_assistant.py @@ -118,6 +118,8 @@ def beautify_sketch(): }), 400 result = beautify_canvas_state(canvas_state) + # print("\n\ncanvas_state!!!", canvas_state, "\n\n") + # print("\n\nResult!!!", result, "\n\n") if not isinstance(result, dict) or "objects" not in result: logger.warning("Beautify returned invalid payload: %r", result) diff --git a/backend/services/llm_service.py b/backend/services/llm_service.py index 9c90b222..771567ef 100644 --- a/backend/services/llm_service.py +++ b/backend/services/llm_service.py @@ -937,7 +937,7 @@ def _get_beautify_canvas_initial_message( canvas_json = json.dumps(canvas_state, ensure_ascii=False) return [ - {"role": "system", "content": BEAUTIFY_CANVAS_SYSTEM}, + {"role": "system", "content": BEAUTIFY_SYSTEM_PROMPT}, {"role": "user", "content": BEAUTIFY_FEWSHOT_USER_1}, {"role": "assistant", "content": json.dumps(BEAUTIFY_FEWSHOT_ASSISTANT_JSON_1)}, {"role": "user", "content": BEAUTIFY_FEWSHOT_USER_2}, @@ -963,25 +963,16 @@ def openai_beautify_canvas( resp = client.chat.completions.create( model="gpt-4.1-mini", response_format={"type": "json_object"}, # forces JSON - temperature=0.15, + temperature=0.1, messages=_get_beautify_canvas_initial_message(canvas_state), - max_tokens=1200, + max_tokens=10000, ) content = resp.choices[0].message.content - parsed = json.loads(content) - - if not isinstance(parsed, dict) or "objects" not in parsed: - return { - "error": "openai_beautify_invalid_output", - "detail": "Missing 'objects' field in model response.", - } - if not isinstance(parsed["objects"], list): - return { - "error": "openai_beautify_invalid_output", - "detail": "'objects' is not a list in model response.", - } + print(f"\n\n{content}\n\n") + parsed = json.loads(content) + print(f"\n\n{parsed}\n\n") return parsed @@ -1046,11 +1037,13 @@ def beautify_canvas_state( if "error" not in model_output and "objects" in model_output: return model_output + print(f"\n\nFAILED OPENAI API!: {model_output} \n\n") + # Fallback: Ollama fallback_output = ollama_beautify_canvas(canvas_state) if "error" not in fallback_output and "objects" in fallback_output: return fallback_output # Rollback: both failed => return original drawings as objects - original_drawings = canvas_state.get("drawings", []) + original_drawings = canvas_state.get("objects", []) return {"objects": original_drawings} diff --git a/frontend/src/components/Canvas.js b/frontend/src/components/Canvas.js index f01b7a38..5f7103b0 100644 --- a/frontend/src/components/Canvas.js +++ b/frontend/src/components/Canvas.js @@ -3903,19 +3903,16 @@ function Canvas({ setIsRefreshing(false); }, 500); }); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedUser]); useEffect(() => { setUndoAvailable(undoStack.length > 0); setRedoAvailable(redoStack.length > 0); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [undoStack, redoStack]); // Add AI-generated objects to canvas and backend const addAIGeneratedObjects = async (objects) => { if (!Array.isArray(objects) || objects.length === 0) { - console.log("Skipping 0..."); return; } @@ -3932,13 +3929,10 @@ function Canvas({ ); newDrawing.roomId = currentRoomId; - console.log("New drawing: ", newDrawing); - userData.addDrawing(newDrawing); setPendingDrawings(prev => [...prev, newDrawing]); created.push(newDrawing); - // enqueue backend save; use skipUndoStack to avoid 1 undo per object (optional) submissionQueueRef.current.push(async () => { try { await submitToDatabase( @@ -3953,13 +3947,12 @@ function Canvas({ } } catch (e) { console.error("AI object save failed:", e); - setPendingDrawings(prev => prev.filter(d => d.drawingId !== newDrawing.drawingId)); + // setPendingDrawings(prev => prev.filter(d => d.drawingId !== newDrawing.drawingId)); handleAuthError(e); } }); } - // force a repaint now (avoid “State unchanged” cache) lastDrawnStateRef.current = null; requestAnimationFrame(() => { drawAllDrawings(); }); processSubmissionQueue(); @@ -3992,7 +3985,7 @@ function Canvas({ const width = (ix1 - ix0) * scaleX; const height = (iy1 - iy0) * scaleY; - // Apply inner padding — shrink region equally from all sides + // Apply inner padding const padX = padding * scaleX; const padY = padding * scaleY; @@ -4023,8 +4016,6 @@ function Canvas({ const resp = await textToDrawing(prompt, canvasState); const payload = typeof resp === 'string' ? JSON.parse(resp) : resp; - console.log(resp); - if (payload && Array.isArray(payload.objects)) { await addAIGeneratedObjects(payload.objects); showLocalSnack("AI objects rendered to canvas."); @@ -4036,80 +4027,77 @@ function Canvas({ const handleShapeAutoCompletion = async () => { if (!editingEnabled) { - showLocalSnack("Shape completion is disabled in view-only mode."); - return; + showLocalSnack("Shape completion is disabled in view-only mode."); + return; } try { - const canvasBounds = getVisibleCanvasBounds(); - const canvasState = { - drawings: [...userData.drawings, ...pendingDrawings], - bounds: { - width: (canvasBounds?.width || canvasWidth), - height: (canvasBounds?.height || canvasHeight) - }, - }; - const suggestion = await shapeCompletion(canvasState); - console.log("suggestion: ", suggestion); - if (!suggestion || suggestion.error || !suggestion.object) { - showLocalSnack("AI could not infer a shape."); - return; - } + const canvasBounds = getVisibleCanvasBounds(); + const canvasState = { + drawings: [...userData.drawings, ...pendingDrawings], + bounds: { + width: (canvasBounds?.width || canvasWidth), + height: (canvasBounds?.height || canvasHeight) + }, + }; + const suggestion = await shapeCompletion(canvasState); + console.log("suggestion: ", suggestion); + if (!suggestion || suggestion.error || !suggestion.object) { + showLocalSnack("AI could not infer a shape."); + return; + } - const { pathData } = suggestion.object || {}; - const anchor = computeSuggestionAnchor(pathData, canvasWidth, canvasHeight); + const { pathData } = suggestion.object || {}; + const anchor = computeSuggestionAnchor(pathData, canvasWidth, canvasHeight); - setShapeSuggestion(suggestion); - setShapeAnchor(anchor); + setShapeSuggestion(suggestion); + setShapeAnchor(anchor); } catch (e) { - console.error("Shape completion error:", e); - showLocalSnack("Unexpected error during shape completion."); + console.error("Shape completion error:", e); + showLocalSnack("Unexpected error during shape completion."); } }; const handleShapeCompletionToggle = (enabled) => { setShapeCompletionEnabled(enabled); if (!enabled) { - setShapeSuggestion(null); - setShapeAnchor(null); + setShapeSuggestion(null); + setShapeAnchor(null); } }; function computeSuggestionAnchor(pathData, canvasWidth, canvasHeight) { - if (!pathData) { - return { x: canvasWidth / 2, y: canvasHeight / 2 }; - } - - // Polygon: average of bounding box - if (Array.isArray(pathData.points) && pathData.points.length > 0) { - let minX = pathData.points[0].x; - let maxX = pathData.points[0].x; - let minY = pathData.points[0].y; - let maxY = pathData.points[0].y; - - for (const p of pathData.points) { - minX = Math.min(minX, p.x); - maxX = Math.max(maxX, p.x); - minY = Math.min(minY, p.y); - maxY = Math.max(maxY, p.y); - } + if (!pathData) { + return { x: canvasWidth / 2, y: canvasHeight / 2 }; + } - return { - x: (minX + maxX) / 2, - y: (minY + maxY) / 2, - }; + if (Array.isArray(pathData.points) && pathData.points.length > 0) { + let minX = pathData.points[0].x; + let maxX = pathData.points[0].x; + let minY = pathData.points[0].y; + let maxY = pathData.points[0].y; + + for (const p of pathData.points) { + minX = Math.min(minX, p.x); + maxX = Math.max(maxX, p.x); + minY = Math.min(minY, p.y); + maxY = Math.max(maxY, p.y); } - // Circle/rectangle/line: center between start / end - if (pathData.start && pathData.end) { - return { - x: (pathData.start.x + pathData.end.x) / 2, - y: (pathData.start.y + pathData.end.y) / 2, - }; - } + return { + x: (minX + maxX) / 2, + y: (minY + maxY) / 2, + }; + } - // Fallback - return { x: canvasWidth / 2, y: canvasHeight / 2 }; + if (pathData.start && pathData.end) { + return { + x: (pathData.start.x + pathData.end.x) / 2, + y: (pathData.start.y + pathData.end.y) / 2, + }; + } + + return { x: canvasWidth / 2, y: canvasHeight / 2 }; } const acceptShapeSuggestion = async () => { @@ -4128,28 +4116,26 @@ const acceptShapeSuggestion = async () => { }; const buildCanvasStateForAI = () => { - const canvas = canvasRef.current; - const canvasBounds = getVisibleCanvasBounds(); - const width = canvasBounds?.width || 1000; - const height = canvasBounds?.height || 1000; - - // Use regular drawings only (exclude filters, etc.) - const allDrawings = [ - ...(userData?.drawings || []), - ...(pendingDrawings || []), - ].filter((d) => d.drawingType !== "filter"); - - const objects = allDrawings.map((d) => ({ - id: d.drawingId, - color: d.color, - lineWidth: d.lineWidth, - pathData: d.pathData, - brushType: d.brushType, - brushStyle: d.brushStyle, - drawingType: d.drawingType, - })); - - return { width, height, objects }; + const canvasBounds = getVisibleCanvasBounds(); + const width = canvasBounds?.width || 1000; + const height = canvasBounds?.height || 1000; + + const allDrawings = [ + ...(userData?.drawings || []), + ...(pendingDrawings || []), + ].filter((d) => d.drawingType !== "filter"); + + const objects = allDrawings.map((d) => ({ + id: d.drawingId, + color: d.color, + lineWidth: d.lineWidth, + pathData: d.pathData, + brushType: d.brushType, + brushStyle: d.brushStyle, + drawingType: d.drawingType, + })); + + return { width, height, objects }; }; const handleBeautifyCanvas = async () => { @@ -4172,11 +4158,37 @@ const acceptShapeSuggestion = async () => { const beautifiedObjects = result.objects; - await clearCanvasForRefresh(); - await addAIGeneratedObjects(beautifiedObjects); + // Clears the canvas state + await clearCanvas(); + try { + const resp = await clearBackendCanvas({ + roomId: currentRoomId, + auth, + }); - setUndoStack((prev) => [...prev, { type: "beautify", ts: Date.now() }]); - setRedoStack([]); + if (resp && resp.clearedAt && currentRoomId) { + roomClearedAtRef.current[currentRoomId] = resp.clearedAt; + } + } catch (e) { + console.error("Failed to clear backend:", e); + } + + try { + await checkUndoRedoAvailability( + auth, + setUndoAvailable, + setRedoAvailable, + currentRoomId + ); + } catch (e) { } + setUserList([]); + try { + setSelectedUser(""); + } catch (e) { + /* ignore if setter missing */ + } + + await addAIGeneratedObjects(beautifiedObjects); showLocalSnack("Sketch beautified"); } catch (err) { diff --git a/frontend/src/styles/ai-assistant.css b/frontend/src/styles/ai-assistant.css index 8222c0dc..261fa49d 100644 --- a/frontend/src/styles/ai-assistant.css +++ b/frontend/src/styles/ai-assistant.css @@ -1,4 +1,3 @@ -/* AI Assistant Panel Style */ .ai-assistant-panel-container { display: flex; min-width: 250px; @@ -15,7 +14,6 @@ .ai-assistant-panel-container-open { position: absolute; left: 0; - /* bottom: -50px; */ top: -75px; transition-duration: .4s; } @@ -23,7 +21,6 @@ .ai-assistant-panel-container-close { position: absolute; left: -300px; - /* bottom: -50px; */ top: -75px; transition-duration: .4s; } From a61a0e0ae71ae9729e68eaec0a48a5f2a1bbf40e Mon Sep 17 00:00:00 2001 From: btouatta Date: Fri, 5 Dec 2025 18:26:38 -0800 Subject: [PATCH 25/26] Isolated components for clarity --- backend/app.py | 42 +- .../src/components/AI/AIAssistantPanel.jsx | 47 +- frontend/src/components/AI/PromptInput.jsx | 38 +- .../components/AI/ShapeCompletionOverlay.jsx | 471 +++++++++++------- frontend/src/components/Canvas.js | 272 +++------- frontend/src/styles/ai-assistant.css | 16 + 6 files changed, 455 insertions(+), 431 deletions(-) diff --git a/backend/app.py b/backend/app.py index db24aaea..0fe62c57 100644 --- a/backend/app.py +++ b/backend/app.py @@ -195,25 +195,25 @@ def handle_all_exceptions(e): app.register_blueprint(analytics_bp) if __name__ == '__main__': - # print(SIGNER_PUBLIC_KEY, SIGNER_PRIVATE_KEY, RECIPIENT_PUBLIC_KEY) - # if not redis_client.exists('res-canvas-draw-count'): - # init_count = {"id": "res-canvas-draw-count", "value": 0} - # logger = __import__('logging').getLogger(__name__) - # logger.error("Initialize res-canvas-draw-count if not present in Redis: ", init_count) - # init_payload = { - # "operation": "CREATE", - # "amount": 1, - # "signerPublicKey": SIGNER_PUBLIC_KEY, - # "signerPrivateKey": SIGNER_PRIVATE_KEY, - # "recipientPublicKey": RECIPIENT_PUBLIC_KEY, - # "asset": { - # "data": { - # "id": "res-canvas-draw-count", - # "value": 0 - # } - # } - # } - - # commit_transaction_via_graphql(init_payload) - # redis_client.set('res-canvas-draw-count', 0) + print(SIGNER_PUBLIC_KEY, SIGNER_PRIVATE_KEY, RECIPIENT_PUBLIC_KEY) + if not redis_client.exists('res-canvas-draw-count'): + init_count = {"id": "res-canvas-draw-count", "value": 0} + logger = __import__('logging').getLogger(__name__) + logger.error("Initialize res-canvas-draw-count if not present in Redis: ", init_count) + init_payload = { + "operation": "CREATE", + "amount": 1, + "signerPublicKey": SIGNER_PUBLIC_KEY, + "signerPrivateKey": SIGNER_PRIVATE_KEY, + "recipientPublicKey": RECIPIENT_PUBLIC_KEY, + "asset": { + "data": { + "id": "res-canvas-draw-count", + "value": 0 + } + } + } + + commit_transaction_via_graphql(init_payload) + redis_client.set('res-canvas-draw-count', 0) socketio.run(app, debug=True, host="0.0.0.0", port=10010, allow_unsafe_werkzeug=True) diff --git a/frontend/src/components/AI/AIAssistantPanel.jsx b/frontend/src/components/AI/AIAssistantPanel.jsx index 4ed02073..ef3f9f69 100644 --- a/frontend/src/components/AI/AIAssistantPanel.jsx +++ b/frontend/src/components/AI/AIAssistantPanel.jsx @@ -5,24 +5,51 @@ import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; import ImageIcon from '@mui/icons-material/Image'; import RoundedCornerIcon from '@mui/icons-material/RoundedCorner'; import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; +import { useAIAssistant } from "../../hooks/useAIAssistant"; export default function AIAssistantPanel({ open, - onClose, - isBusy, - error, showPromptInput, onShapeCompletionToggle, - onBeautify, + getBeautifyCanvasState, + clearCanvas, + showLocalSnack, + addAIGeneratedObjects }) { const [activeButton, setActiveButton] = useState(""); + const { aiAssistLoading, beautifySketch } = useAIAssistant(); - const handlePanelItemClick = (itemTitle) => { - // If it's the beautify button, do NOT toggle - if (itemTitle === "Beautify sketch") { - if (typeof onBeautify === "function" && !isBusy) { - onBeautify(); + const handleBeautify = async () => { + if (aiAssistLoading) return; + + try { + const canvasState = getBeautifyCanvasState(); + const result = await beautifySketch(canvasState); + + if (!result || !Array.isArray(result.objects) || result.objects.length === 0) { + showLocalSnack("Beautify failed. Please try again."); + return; } + + const beautifiedObjects = result.objects; + + // CLear canvas before rendering beatutified version + clearCanvas(); + + // Add beatified version to the canvas + await addAIGeneratedObjects(beautifiedObjects); + + showLocalSnack("Sketch beautified"); + } catch (err) { + showLocalSnack("Beautify error"); + console.error(err); + } + }; + + + const handlePanelItemClick = async (itemTitle) => { + if (itemTitle === "Beautify sketch") { + await handleBeautify() return; } @@ -55,7 +82,6 @@ export default function AIAssistantPanel({ }; const renderStyleClass = (itemTitle) => { - // Beautify sketch should never be active if (itemTitle === "Beautify sketch") { return "ai-asisstant-panel-item"; } @@ -115,7 +141,6 @@ export default function AIAssistantPanel({
- ); } diff --git a/frontend/src/components/AI/PromptInput.jsx b/frontend/src/components/AI/PromptInput.jsx index c6fbf848..1482b8ef 100644 --- a/frontend/src/components/AI/PromptInput.jsx +++ b/frontend/src/components/AI/PromptInput.jsx @@ -1,18 +1,38 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; import { Button, TextareaAutosize, Box, CircularProgress } from '@mui/material'; +import { useAIAssistant } from '../../hooks/useAIAssistant'; + export default function PromptInput({ - show=false, - loading=false, - onSubmit=()=>{}, + show = false, placeholder = 'Describe what to draw…', + getVisibleCanvasBounds, + addAIGeneratedObjects, + showLocalSnack, }) { + + const { textToDrawing, aiAssistLoading } = useAIAssistant(); const [text, setText] = useState(''); const handleSubmit = async () => { - if (!text.trim() || loading) return; - onSubmit?.(text.trim()); + if (!text.trim() || aiAssistLoading) return; + + try { + const canvasState = getVisibleCanvasBounds(); + const resp = await textToDrawing(text.trim(), canvasState); + const payload = typeof resp === 'string' ? JSON.parse(resp) : resp; + + if (payload && Array.isArray(payload.objects)) { + await addAIGeneratedObjects(payload.objects); + showLocalSnack('AI objects rendered to canvas.'); + setText(''); + } else { + showLocalSnack('An error occurred while generating the sketch.'); + } + } catch (e) { + console.log(e) + showLocalSnack('Failed to generate sketch.'); + } }; const handleKeyDownPress = (e) => { @@ -48,7 +68,7 @@ export default function PromptInput({ value={text} onChange={(e) => setText(e.target.value)} onKeyDown={handleKeyDownPress} - disabled={loading} + disabled={aiAssistLoading} minRows={1} style={{ width: 'auto', @@ -65,7 +85,7 @@ export default function PromptInput({