From 686c30808e621b6380a4cf3e092a4bde3bec0214 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Sat, 19 Apr 2025 13:42:24 +0800 Subject: [PATCH] test --- .gitignore | 1 + examples/images/lime-cat.jpg | Bin 0 -> 43369 bytes output.png | Bin 0 -> 14615 bytes package.json | 30 ++ pnpm-lock.yaml | 988 +++++++++++++++++++++++++++++++++++ src/2d/canvas.ts | 30 ++ ws/public/index.html | 41 ++ ws/server.ts | 54 ++ 8 files changed, 1144 insertions(+) create mode 100644 .gitignore create mode 100644 examples/images/lime-cat.jpg create mode 100644 output.png create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/2d/canvas.ts create mode 100644 ws/public/index.html create mode 100644 ws/server.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/examples/images/lime-cat.jpg b/examples/images/lime-cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5db7f2cac0eb2ea7df78017d502d77d5463080b6 GIT binary patch literal 43369 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 eW3%XD>m^9*g?IMMimPV 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 (https://www.xiongxiao.me)", + "license": "MIT", + "packageManager": "pnpm@10.6.2", + "type": "module", + "dependencies": { + "canvas": "^3.1.0", + "express": "^5.1.0", + "socket.io": "^4.8.1" + }, + "pnpm": { + "ignoredBuiltDependencies": [ + "canvas" + ], + "onlyBuiltDependencies": [ + "canvas" + ] + }, + "devDependencies": { + "@types/node": "^22.14.1" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..feb76e7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,988 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + canvas: + specifier: ^3.1.0 + version: 3.1.0 + express: + specifier: ^5.1.0 + version: 5.1.0 + socket.io: + specifier: ^4.8.1 + version: 4.8.1 + devDependencies: + '@types/node': + specifier: ^22.14.1 + version: 22.14.1 + +packages: + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/node@22.14.1': + resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + engines: {node: '>=10'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + '@socket.io/component-emitter@3.1.2': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.14.1 + + '@types/node@22.14.1': + dependencies: + undici-types: 6.21.0 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.0 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + canvas@3.1.0: + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + + chownr@1.1.4: {} + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + depd@2.0.0: {} + + detect-libc@2.0.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.17 + '@types/node': 22.14.1 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + expand-template@2.0.3: {} + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + finalhandler@2.1.0: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs-constants@1.0.0: {} + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + github-from-package@0.0.0: {} + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ipaddr.js@1.9.1: {} + + is-promise@4.0.0: {} + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mimic-response@3.1.0: {} + + minimist@1.2.8: {} + + mkdirp-classic@0.5.3: {} + + ms@2.1.3: {} + + napi-build-utils@2.0.0: {} + + negotiator@0.6.3: {} + + negotiator@1.0.0: {} + + node-abi@3.74.0: + dependencies: + semver: 7.7.1 + + node-addon-api@7.1.1: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + parseurl@1.3.3: {} + + path-to-regexp@8.2.0: {} + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + router@2.2.0: + dependencies: + debug: 4.4.0 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@7.7.1: {} + + send@1.2.0: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + statuses@2.0.1: {} + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-json-comments@2.0.1: {} + + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + toidentifier@1.0.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + undici-types@6.21.0: {} + + unpipe@1.0.0: {} + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + + wrappy@1.0.2: {} + + ws@8.17.1: {} diff --git a/src/2d/canvas.ts b/src/2d/canvas.ts new file mode 100644 index 0000000..dae2c6d --- /dev/null +++ b/src/2d/canvas.ts @@ -0,0 +1,30 @@ +import { createCanvas, loadImage } from 'canvas'; +import * as fs from 'fs'; + +const canvas = createCanvas(200, 200); +const ctx = canvas.getContext('2d'); + +// Write "Awesome!" +ctx.font = '30px Impact'; +ctx.rotate(0.1); +ctx.fillText('Awesome!', 50, 100); + +// Draw line under text +var text = ctx.measureText('Awesome!'); +ctx.strokeStyle = 'rgba(0,0,0,0.5)'; +ctx.beginPath(); +ctx.lineTo(50, 102); +ctx.lineTo(50 + text.width, 102); +ctx.stroke(); + +// Draw cat with lime helmet +const main = async () => { + const image = await loadImage('examples/images/lime-cat.jpg'); + ctx.drawImage(image, 50, 0, 70, 70); + console.log(''); + + // Save to file + fs.writeFileSync('output.png', canvas.toBuffer()); +}; + +main(); diff --git a/ws/public/index.html b/ws/public/index.html new file mode 100644 index 0000000..7c58f54 --- /dev/null +++ b/ws/public/index.html @@ -0,0 +1,41 @@ + + + + + 3D 可视化 + + + + + + + + \ No newline at end of file diff --git a/ws/server.ts b/ws/server.ts new file mode 100644 index 0000000..89c3e0f --- /dev/null +++ b/ws/server.ts @@ -0,0 +1,54 @@ +// server.js +import express from 'express'; +const app = express(); +import http from 'http'; +import { Server } from 'socket.io'; +// const http = require('http').createServer(app); +const httpServer = http.createServer(app); +const io = new Server(httpServer); + +// 提供静态网页 +app.use(express.static('public')); + +// 3D 数据生成逻辑 +function generate3DData() { + return { + vertices: [ + /* 3D 顶点数据 */ + ], + colors: [ + /* 颜色数据 */ + ], + }; +} +function generate3DData2() { + // 创建一个包含 1000 个随机点的数组 + const points: any = []; + for (let i = 0; i < 1000; i++) { + points.push([Math.random() * 2000 - 1000, Math.random() * 2000 - 1000, Math.random() * 2000 - 1000]); + } + return { + vertices: points, + colors: points.map(() => [1, 1, 1, 1]), + }; +} + +// WebSocket 通信 +io.on('connection', (socket) => { + console.log('客户端已连接'); + + // 每帧发送数据 (60fps) + // const interval = setInterval(() => { + // socket.emit('frame', generate3DData()); + // }, 16); + const interval = setInterval(() => { + socket.emit('frame', generate3DData()); + }, 2000); + socket.on('disconnect', () => { + clearInterval(interval); + }); +}); + +httpServer.listen(3003, () => { + console.log('服务已启动: http://localhost:3003'); +});