Community코딩 & 개발github.com

socketio-docs

공식 Socket.IO v4 문서를 기반으로 Socket.IO 4.8 서버 및 클라이언트를 구축, 구성 및 디버깅합니다.

socketio-docs란 무엇인가요?

이 스킬은 Socket.IO 4.8 서버와 클라이언트를 공식 문서에 따라 올바르게 구축, 구성, 디버깅하기 위한 규칙과 함정들을 제공합니다. Node.js 환경(Express, Fastify, Koa, Bun, uWebSockets.js)에서 Socket.IO 서버를 작성하거나, socket.io-client를 사용하는 클라이언트 애플리케이션을 개발할 때 유용합니다. 이 스킬은 이벤트 전송(acknowledgement, timeout, emitWithAck), 방과 네임스페이스 브로드캐스팅, 미들웨어 인증(auth 옵션), CORS 설정, 리버스 프록시 및 스티키 세션, Redis/Redis Streams/Postgres/MongoDB/Cluster 어댑터를 통한 확장, 연결 상태 복구 및 전달 보장, 재연결 설정, 테스트 작성, 연결 문제 해결, v2/v3 마이그레이션 등 Socket.IO 개발 시 자주 실수하는 부분을 상세히 다룹니다. 코드 예제와 함께 각 규칙의 공식 문서 링크를 제공하여 정확한 참조가 가능합니다. 주의사항: 순수 WebSocket 서버(ws) 및 Socket.IO 없는 WebSocket 사용에는 적용되지 않습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/quentin-autret/claude-skills/tree/main/skills/socketio-docs

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Socket.IO 4.8

개요

이 스킬은 Socket.IO 4.8에서 자주 실수하기 쉬운 규칙들을 다룹니다: 임시 socket.id를 사용자 키로 사용하기, 리스너가 두 번 등록되는 문제, timeout()에 따라 콜백 형태가 달라지는 acknowledgement, WebSocket을 보호하지 않는 CORS, 로드 밸런서 뒤에서 잊혀진 스티키 세션, 더 이상 작동하지 않는 v2 또는 v3 API 등. 각 주장은 출처인 페이지 URL을 함께 제공합니다. 참조 파일들은 도메인별 세부 정보를 담고 있습니다.

지원 버전

Socket.IO 4.8 (서버 socket.io, 클라이언트 socket.io-client), 문서 v4. JS 클라이언트 3.x 및 4.x는 서버 3.x 및 4.x와 통신 가능합니다. https://socket.io/docs/v4/client-installation/#version-compatibility

빠른 시작

import express from "express";
import { createServer } from "node:http";
import { Server } from "socket.io";

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { cors: { origin: ["https://example.com"] } });

io.on("connection", (socket) => {
  socket.on("hello", (arg, callback) => callback("got it"));
});

httpServer.listen(3000);

https://socket.io/docs/v4/server-initialization/#with-express

import { io } from "socket.io-client";
const socket = io("https://server-domain.com", { auth: { token: "abc" } });
const answer = await socket.timeout(5000).emitWithAck("hello", "world");

https://socket.io/docs/v4/client-api/#socketemitwithackeventname-args

규칙 및 함정

연결 및 식별

  • Socket.IO는 WebSocket 구현체가 아닙니다: 일반 WebSocket 클라이언트는 Socket.IO 서버에 접속할 수 없고, Socket.IO 클라이언트는 일반 WebSocket 서버에 접속할 수 없습니다. https://socket.io/docs/v4/#what-socketio-is-not
  • 연결 상태 복구가 활성화되지 않은 경우, socket.id는 재연결 및 페이지 새로고침 시마다 변경되며, 탭마다 다르고 메시지 큐가 없습니다. 쿠키 또는 auth에 담긴 자체 세션 ID로 사용자를 식별하고, 사용자 ID를 이름으로 하는 방을 통해 사용자의 모든 탭에 도달하세요. https://socket.io/docs/v4/server-socket-instance/#socketid
io.on("connection", async (socket) => {
  const userId = await computeUserIdFromHeaders(socket.handshake.headers);
  socket.join(userId);
  io.to(userId).emit("hi");
});

https://socket.io/docs/v4/rooms/#sample-use-cases

  • 연결 미들웨어에서 socket.handshake.auth로 인증합니다. 모든 코드 경로에서 next()를 호출하세요; 그렇지 않으면 연결이 타임아웃되어 닫힐 때까지 대기 상태로 남습니다. next(err)는 클라이언트에 connect_error로 전달되며, err.data에 세부 정보가 포함됩니다. https://socket.io/docs/v4/middlewares/
io.use((socket, next) => {
  if (isValid(socket.handshake.auth.token)) return next();
  const err = new Error("not authorized");
  err.data = { content: "Please retry later" };
  next(err);
});

https://socket.io/docs/v4/middlewares/#handling-middleware-error

이벤트 및 Acknowledgement

const responses = await io.timeout(10000).emitWithAck("some-event");

https://socket.io/docs/v4/server-api/#serveremitwithackeventname-args

  • 리스너에는 내장된 오류 처리 및 유효성 검사가 없습니다. 각 핸들러에서 오류를 포착하고, 스키마 라이브러리로 페이로드를 검증하며, 콜백을 사용하기 전에 typeof callback === "function"을 확인하세요. https://socket.io/docs/v4/listening-to-events/#validation
  • connect, connect_error, disconnect, disconnecting, newListener 또는 removeListener를 애플리케이션 이벤트로 절대 사용하지 마세요: socket.emit("disconnecting")과 같이 예약된 이름을 사용하면 오류가 발생합니다. https://socket.io/docs/v4/emit-cheatsheet/

브로드캐스팅 및 방

전달

  • 기본 보장은 최대 한 번(at most once)이며 서버는 메시지를 저장하지 않습니다: 연결이 끊긴 클라이언트는 브로드캐스트를 영원히 놓칩니다. auth에 보내진 오프셋을 사용하여 데이터베이스에서 재생하거나, 연결 상태 복구를 활성화하세요. https://socket.io/docs/v4/delivery-guarantees#at-most-once
  • 클라이언트는 오프라인 중에 emit을 버퍼링하고 재연결 시 플러시합니다. socket.connected를 확인하거나 드롭 가능한 데이터에는 socket.volatile.emit(...)을 사용하세요. https://socket.io/docs/v4/client-offline-behavior/#buffered-events
  • 클라이언트에서 서버로 최소 한 번(at least once): io({ retries: 3, ackTimeout: 10000 }). 정확히 한 번(exactly once)을 위해서는 고유 제약 조건 아래에 클라이언트 생성 ID를 저장하세요. 성공 시와 중복 시에는 승인하지만, 다른 오류에서는 승인하지 않아 클라이언트가 타임아웃되어 재시도하도록 합니다. https://socket.io/docs/v4/tutorial/step-8
  • 연결 상태 복구는 선택 사항이며, 제한된 maxDisconnectionDuration이 필요하고 실패할 수 있습니다: socket.recovered를 분기하여 확인하세요. Redis (Pub/Sub) 어댑터는 이를 지원하지 않으며, Redis Streams 어댑터는 지원합니다. https://socket.io/docs/v4/connection-state-recovery
const io = new Server(httpServer, {
  connectionStateRecovery: { maxDisconnectionDuration: 2 * 60 * 1000, skipMiddlewares: false },
});

https://socket.io/docs/v4/connection-state-recovery#usage

CORS 및 배포

참조 파일

파일읽을 내용
references/server-setup.md설치, Express/Koa/Fastify/Hono/HTTPS/HTTP/2/Bun/uWebSockets.js 초기화, 서버 옵션 및 기본값, 번들링, 핸들러 레이아웃
references/middleware-and-auth.md연결, 소켓 및 엔진 미들웨어, 자격 증명, 사용자 식별, 헤더 훅, allowRequest, 클라이언트 인증서
references/cors-and-proxies.mdCORS 옵션 및 오류, 쿠키, nginx, Apache, Caddy, http-proxy, 클라우드 로드 밸런서, ws와 포트 공유
references/server-api.md서버 및 소켓 인스턴스, io의 네임스페이스, 유틸리티 메서드, serverSideEmit, 연결 해제 이유, 엔진 이벤트 및 오류 코드, 종료
references/client.md번들, 초기화, 소켓 이벤트, connect_error 및 disconnect, Manager 및 다중화, 모든 클라이언트 옵션, 번들러
references/events-rooms-namespaces.md직렬화, acknowledgement, catch-all 리스너, 유효성 검사, 오류 처리, 브로드캐스팅, 방, 동적 네임스페이스
references/delivery-and-recovery.md전달 보장, 재시도, 정확히 한 번, 오프셋 재생, 연결 상태 복구
references/multiple-nodes.md스티키 세션, 여러 노드에 대한 프록시 설정, 대안, Node.js 클러스터, PM2
references/adapters.mdRedis, 샤딩된 Redis, Redis Streams, Postgres, MongoDB, Cluster, AWS SQS, Azure, GCP 어댑터, 기능 매트릭스, 이미터
references/performance-and-operations.md네이티브 애드온, wsEngine, 메모리, 사용자 정의 파서, OS 제한, 부하 테스트, Admin UI, 디버그 로그
references/typescript.md서버, 클라이언트 및 네임스페이스의 이벤트 인터페이스, SocketData, 타입화된 테스트
references/testing-and-troubleshooting.md서버 통합 테스트, 가짜 소켓을 사용한 클라이언트 테스트, 연결 실패, 연결 해제, 롱폴링 중단
references/migrations-and-protocol.mdv2에서 v3 및 v3에서 v4 변경 사항, allowEIO3을 사용한 롤링 업그레이드, Engine.IO 및 Socket.IO 와이어 프로토콜

이전 패턴

이전 사용법대체 방법출처
origins 또는 handlePreflightRequest 옵션cors: { origin: [...] }https://socket.io/docs/v4/migrating-from-2-x-to-3-0/#cors-handling
io.set("authorization", fn)io.use((socket, next) => ...)https://socket.io/docs/v4/migrating-from-2-x-to-3-0/#ioset-is-removed
Socket query 옵션의 토큰auth 옵션, socket.handshake.auth로 읽음https://socket.io/docs/v4/migrating-from-2-x-to-3-0/
연결 거부에 대한 클라이언트 error 이벤트connect_error, err.message 및 err.data 포함https://socket.io/docs/v4/migrating-from-2-x-to-3-0/
Socket의 socket.on("reconnect_attempt")Manager의 socket.io.on("reconnect_attempt")https://socket.io/docs/v4/client-socket-instance/#events
지연 시간 측정을 위한 클라이언트 pong 이벤트간격을 두고 socket.volatile.emit("ping", cb)https://socket.io/docs/v4/migrating-from-2-x-to-3-0/#no-more-pong-event-for-retrieving-latency
Namespace.connected 객체Namespace.sockets, Maphttps://socket.io/docs/v4/migrating-from-2-x-to-3-0/
Object.keys(socket.rooms)socket.rooms는 Sethttps://socket.io/docs/v4/migrating-from-2-x-to-3-0/
socket.join(room, cb)socket.join(room), 비동기 어댑터로 awaithttps://socket.io/docs/v4/migrating-from-2-x-to-3-0/
Namespace.clients(cb) (v2), 이후 allSockets() (v3, 다음 주요 버전에서 제거 예정)fetchSockets()https://socket.io/docs/v4/server-api/#namespaceallsockets
socket.binary(false)사용자 정의 parserhttps://socket.io/docs/v4/migrating-from-2-x-to-3-0/
socket.emit("a").emit("b")개별 호출, emit()은 true 반환https://socket.io/docs/v4/migrating-from-2-x-to-3-0/
socket.io 또는 socket.io-client의 기본 importimport { Server } from "socket.io", import { io } from "socket.io-client"https://socket.io/docs/v4/migrating-from-3-x-to-4-0/

Individual skills in this repo

This repo contains 16 individual skills — each has its own dedicated page.

eslint-docs

Teaches current ESLint 10 practices drawn from the official documentation. Use when writing, reviewing or fixing an eslint.config.js (flat config, defineConfig, files, ignores, globalIgnores, extends, languageOptions, globals, parsers, processors), configuring ESLint rules and severities, disable comments and inline config, running the CLI in CI (--fix, --cache, --quiet, --max-warnings, bulk suppressions, formatters, feature flags, MCP server), writing custom rules (meta, schema, fixes, suggestions, selectors, scope, code paths) and testing them with RuleTester, building plugins, shareable configs, custom parsers, processors or formatters, using the Node.js API (ESLint, Linter), or migrating to ESLint 9 or 10 from eslintrc. Triggers on eslint, eslint.config.js, flat config, .eslintrc, .eslintignore, @eslint/js, js/recommended, eslint-disable, no-unused-vars, no-restricted-imports, no-restricted-syntax, RuleTester, eslint-plugin, eslint-config, FlatCompat, context.getScope is not a function, ESLint 10.

grafana-cloud-docs

Grafana Cloud pitfalls, defaults, limits and current patterns from the Grafana, Mimir, Loki and Tempo docs, each tied to its docs URL. Use when sending OpenTelemetry data to Grafana Cloud, writing PromQL, LogQL or TraceQL, controlling cardinality and cost, designing alert rules, routing notifications, provisioning alerting, building Synthetic Monitoring checks, using the /apis dashboard API, choosing access policy tokens or service accounts, or migrating off API keys, the Loki Exporter and legacy /api routes.

javascript-docs

Teaches current JavaScript (ECMAScript) practice drawn from the MDN JavaScript documentation. Use when writing, reviewing or fixing modern JavaScript, choosing a built-in API, or replacing a deprecated pattern. Covers equality and coercion, let/const and the temporal dead zone, strict mode, ASI, functions, classes and private fields, objects, prototypes, Proxy, Reflect, Symbol, eval, operators (??, ?., spread, BigInt arithmetic), statements, Promise, async/await, Promise.try, iterators and iterator helpers, generators, using/await using, DisposableStack, WeakRef, Array (toSorted, at, groupBy, fromAsync), Map, Set methods, WeakMap, strings and Unicode, encodeURIComponent, RegExp (v flag, RegExp.escape, lastIndex), Number, Math, BigInt, JSON (rawJSON, revivers), typed arrays, ArrayBuffer, base64, SharedArrayBuffer, Atomics, Temporal, Date, Intl (DateTimeFormat, NumberFormat, Collator, Segmenter, PluralRules), errors (cause, Error.isError), ES modules, import attributes, import.meta, dynamic import.

next-intl-docs

Teaches current next-intl 4 practices for internationalizing Next.js apps, drawn from the official documentation. Use when setting up next-intl with the App Router, writing i18n/request.ts, adding a [locale] segment with defineRouting, createMiddleware in proxy.ts (formerly middleware.ts), building locale switchers with createNavigation, translating with useTranslations or getTranslations, passing messages to NextIntlClientProvider, writing ICU messages (plurals, select, rich text), formatting dates, numbers and lists with useFormatter, translating metadata, Server Actions, Route Handlers, localized 404 and error pages, static rendering with next/root-params, type-safe messages through AppConfig, testing with Jest, Vitest, Storybook, or extracting inline messages with useExtracted. Triggers on next-intl, useTranslations, getTranslations, NextIntlClientProvider, getRequestConfig, i18n routing, locale prefix, localePrefix, NEXT_LOCALE, hreflang, setRequestLocale, ICU messages, App Router internationalization.

nodejs-docs

Teaches Node.js practice drawn from the official Node.js API documentation, with pitfalls, surprising defaults, deprecations and replacements, each backed by its nodejs.org URL. Use when writing, reviewing, debugging or upgrading Node.js code, or choosing a built-in module (fs, crypto, streams, http, process, CLI flags, node:test, ESM/CommonJS, package.json exports, TypeScript type stripping, child_process, worker_threads, node:sqlite, deprecations).

playwright-docs

Pitfalls, surprising defaults and recommended patterns of Playwright Test for JavaScript and TypeScript, distilled from the official docs. Use when writing, reviewing, debugging or configuring Playwright tests (@playwright/test, playwright.config.ts, npx playwright test), including flaky tests, locators (getByRole, filter, strict mode), web-first assertions (expect, toHaveText, toBeVisible, expect.poll, toPass), fixtures, storageState authentication, project dependencies, timeouts, retries, network mocking (page.route, routeFromHAR, routeWebSocket), API testing, clock, aria snapshots, toHaveScreenshot, axe accessibility scans, traces, UI mode, reporters, CI, Docker, sharding, test locks, component testing with stories and mount, codegen, Playwright MCP, playwright-cli and migration from Puppeteer, Protractor, Testing Library or older Playwright versions.

postgresql-docs

Pitfalls, surprising defaults, PostgreSQL 18 changes and recommended patterns from the official PostgreSQL 18 documentation, each backed by its postgresql.org URL. Use when writing or reviewing PostgreSQL SQL, schema design, migrations and ALTER TABLE locks, indexes, transactions, isolation levels and retries, locking, upsert and MERGE, COPY, JSONB, timestamptz, generated and identity columns, partitioning, EXPLAIN, vacuum, roles, row-level security, PL/pgSQL, full-text search, connection settings, and upgrades to PostgreSQL 18.

react-docs

Writes, reviews and upgrades React 19.3 code from the official react.dev documentation. Use when writing components and Hooks, removing unnecessary useEffect calls, fixing Effect dependencies with useEffectEvent, building forms with Actions (useActionState, useOptimistic, useFormStatus, form action), using Server Components, 'use client', 'use server' and Server Functions, Suspense, use(), useTransition, useDeferredValue, ViewTransition, Activity, adopting React Compiler and eslint-plugin-react-hooks, deciding on useMemo, useCallback and memo, server rendering and hydration (createRoot, hydrateRoot, renderToPipeableStream, prerender), or migrating from React 18 (forwardRef, Context.Provider, ReactDOM.render, propTypes, defaultProps). Triggers on React, JSX, hooks, useState, useEffect, useRef, useContext, Server Components, RSC, Actions, React Compiler, Strict Mode, hydration mismatch, React 19 upgrade.

rust-std-docs

Gives current guidance from the official Rust standard library docs (std 1.99.1 stable) on pitfalls, panics, platform differences, discouraged APIs and newer stable replacements. Use when writing, reviewing or refactoring Rust code that uses std, especially collections (Vec, HashMap, BTreeMap, BinaryHeap, entry, extract_if, sort), Option/Result/error handling (expect, ?, Error, ExitCode, panic), iterators (collect, flatten, Peekable, try_fold), Box/Rc/RefCell/Cow/Pin/mem::take, Arc/Mutex/RwLock/OnceLock/LazyLock/thread::scope/mpsc/Condvar/atomics, String/str/fmt/format!/OsString/CString, io/fs/path (BufWriter, OpenOptions, PathBuf::join), process/env/net/time (Command, set_var, TcpStream, Instant, Duration), From/TryFrom/AsRef/Ord/Drop/Deref/Clone, and unsafe raw pointers, MaybeUninit, transmute, NonNull or integer overflow and float ordering.

tailwindcss-docs

Teaches current Tailwind CSS v4 practices drawn from the official documentation. Use for any task that touches Tailwind CSS v4, even a small one, because many v3 habits silently break in v4. Use when writing or reviewing Tailwind CSS v4 code (utility classes, variants, arbitrary values, theme variables in @theme, @utility, @custom-variant, @apply, @reference, @source), setting up Tailwind in a framework or build tool (Vite plugin, PostCSS plugin, CLI, Next.js, SvelteKit, Nuxt, Angular, Laravel, Rails), customizing the theme (colors, fonts, breakpoints, spacing, animations), building dark mode with a class or data attribute, or migrating a project from Tailwind v3 (tailwind.config.js, @tailwind directives, darkMode class, safelist, bg-opacity, renamed shadow and outline utilities). Triggers on tailwindcss, @import "tailwindcss", @tailwindcss/vite, @tailwindcss/postcss, @tailwindcss/cli, @theme, @custom-variant dark, npx @tailwindcss/upgrade, upgrade to Tailwind v4.

tauri-docs

Tauri 2 apps, tauri.conf.json, capabilities and permissions, commands and invoke, events and channels, plugins, bundling, signing and the updater, migration from Tauri 1. Guides Tauri 2 work from the official v2 documentation, including scopes, managed state, plugin authoring, CSP and the isolation pattern, testing and debugging, Linux, Windows and macOS packages, and mobile and store releases. Use when writing or reviewing a Tauri 2 app, adding a plugin or a capability, fixing a "not allowed" or "forbidden path" error, wiring IPC between Rust and the webview, packaging, signing or publishing a desktop or mobile build, or upgrading a Tauri 1 or 2.0 beta project.

tokio-docs

Gives current guidance from the official tokio documentation (tokio 1.54.1) on async Rust pitfalls, cancel safety, blocking code, surprising defaults and deprecated APIs. Use when writing, reviewing or debugging async Rust code that uses tokio, especially the runtime (#[tokio::main], #[tokio::test], Builder, enable_all, block_on, current_thread, LocalRuntime, shutdown, feature flags), tasks (spawn, JoinHandle, JoinSet, abort, spawn_blocking, block_in_place, LocalSet, spawn_local, task_local), select!, join!, try_join!, cancellation and graceful shutdown, sync primitives (Mutex across .await, RwLock, Semaphore, Notify, OnceCell), channels (mpsc backpressure, oneshot, broadcast lag, watch), time (sleep, interval, MissedTickBehavior, timeout, paused time, start_paused), I/O and networking (AsyncReadExt, BufWriter flush, split, io::copy, framing, TcpListener, TcpStream, UdpSocket), tokio::fs, process (Command, kill_on_drop, Child), signals (ctrl_c, Windows console events) and Windows named pipes.

typescript-docs

Configures, writes and upgrades TypeScript 6.0 code and tsconfig.json from the official TypeScript documentation. Use when upgrading from TypeScript 5.x to 6.0 (strict, types, rootDir, baseUrl, moduleResolution node, target es5, outFile, esModuleInterop), choosing module and moduleResolution, writing package.json exports and imports, fixing ESM and CommonJS interop, enabling verbatimModuleSyntax or erasableSyntaxOnly, setting up project references and tsc --build, writing .d.ts files, checking JavaScript with JSDoc, or debugging narrowing, generics, mapped types, decorators and enums. Triggers on TypeScript, tsc, tsconfig, TS5112, ignoreDeprecations, nodenext, bundler, .d.ts, @ts-check, TypeScript 6 upgrade.

typesense-docs

Pitfalls, surprising defaults and recommended patterns of the Typesense search engine, distilled from the official docs. Use when designing a Typesense collection schema, writing search parameters (q, query_by, filter_by, sort_by, facet_by, group_by), tuning typo tolerance and ranking, building vector, semantic or hybrid search, conversational RAG or natural language search, creating API keys and scoped search keys for multi-tenancy, indexing and import (JSONL, upsert, emplace, dirty_values), syncing from a primary database, reindexing through aliases, managing synonyms (synonym sets), curation sets and stopwords, joins, analytics rules and query suggestions, InstantSearch, migrating from Algolia, or running, clustering, backing up and upgrading a Typesense server.

vite-docs

Teaches current Vite 8 practices drawn from the official documentation. Use when writing or fixing a vite.config, migrating from Vite 7 (Rolldown and Oxc replacing Rollup and esbuild), configuring the dev server, proxy or HMR, handling import.meta.env and modes, tuning the production build, library mode, SSR, writing a Vite plugin, using the HMR or JavaScript API, or the Environment API. Triggers on vite.config, defineConfig, rolldownOptions, import.meta.env, loadEnv, optimizeDeps, ssrLoadModule, ModuleRunner, this.environment, upgrade to Vite 8.

vitest-docs

Teaches current Vitest 5 practices drawn from the official documentation. Use when writing, reviewing or fixing Vitest tests (test, describe, expect, test.for, fixtures with test.extend, hooks, snapshots), mocking with vi (vi.fn, vi.spyOn, vi.mock, vi.when, fake timers, stubGlobal, stubEnv), configuring vitest.config or projects, choosing an environment or pool, filtering and running tests in CI, measuring coverage with v8 or istanbul, debugging slow or flaky suites, testing components in browser mode with Playwright, or migrating from Jest, Mocha or Vitest 4. Triggers on vitest, vi.mock, vi.fn, vitest.config, toMatchSnapshot, expect.poll, coverage thresholds, browser mode, @vitest/browser-playwright, jsdom, happy-dom, migrate Jest to Vitest, upgrade Vitest 5.

관련 스킬