counter-strike-2-demo-parser
v0.1.0
Published
CS2 demo (.dem) parser written from scratch in TypeScript. No third-party demo libraries.
Downloads
110
Maintainers
Readme
cs2-dem-parser
Parser de demos de CS2 (.dem) escrito desde cero en TypeScript.
Sin librerías de parsing de terceros — solo snappyjs para descompresión.
npm install cs2-dem-parserUso básico
import { parseDemo } from 'cs2-dem-parser'
const demo = parseDemo('./mi_partida.dem')
console.log(demo.map) // "de_dust2"
console.log(demo.tickrate) // 64
console.log(demo.players) // [{ steamId, name, entityIndex }]
console.log(demo.rounds) // [{ roundNumber, winningSide, reason, playerStats }]API
parseDemo(filepath: string): ParsedDemo
Función de conveniencia. Parsea el archivo y retorna el resultado.
new DemoParser(filepath: string)
Clase principal si necesitás más control:
import { DemoParser } from 'cs2-dem-parser'
const parser = new DemoParser('./partida.dem')
const demo = parser.parse()Tipos
interface ParsedDemo {
filename: string
map: string
tickrate: number
duration: number // segundos
players: ParsedPlayer[]
rounds: ParsedRound[]
}
interface ParsedPlayer {
steamId: string
name: string
entityIndex: number
}
interface ParsedRound {
roundNumber: number
winningSide: 'CT' | 'T'
reason: ParsedWinReason
startTick: number
endTick: number
playerStats: ParsedPlayerRoundStats[]
}
interface ParsedPlayerRoundStats {
steamId: string
team: 'CT' | 'T'
kills: number
deaths: number
assists: number
damage: number
survived: boolean
}
type ParsedWinReason =
| 'CT_WIN_ELIMINATION'
| 'T_WIN_ELIMINATION'
| 'CT_WIN_DEFUSE'
| 'T_WIN_BOMB_EXPLODED'
| 'CT_WIN_TIME'
| 'UNKNOWN'Uso avanzado — pipeline manual
Podés acceder a las capas internas para construir tu propio pipeline:
import {
DemoReader,
extractNetMessages,
parseGameEventList,
decodeGameEvent,
EVENTS_OF_INTEREST,
} from 'cs2-dem-parser'
const reader = new DemoReader('./partida.dem')
reader.readFileHeader()
for (const message of reader.messages()) {
// Procesar cada mensaje a tu manera
const netMsgs = extractNetMessages(message.data)
for (const nm of netMsgs) {
// ...
}
}Estructura interna
src/
├── index.ts ← API pública
├── parser/
│ ├── demoParser.ts ← Orquestador principal
│ ├── demoReader.ts ← Lee el stream de mensajes del .dem
│ ├── packetParser.ts ← Extrae net messages de CDemoPacket
│ ├── gameEventListParser.ts ← Parsea el schema de eventos
│ ├── gameEventDecoder.ts ← Decodifica eventos individuales
│ └── stringTableParser.ts ← Resuelve jugadores por entityIndex
├── proto/
│ ├── protobufDecoder.ts ← Decoder protobuf minimal (desde cero)
│ └── gameEvents.ts ← Tipos y constantes de game events
├── types/
│ └── demo.ts ← Tipos públicos
└── utils/
├── bufferReader.ts ← Lector de bajo nivel sobre Buffer
└── snappy.ts ← Wrapper de descompresión SnappyLimitaciones
- Funciona con demos de matchmaking de Valve. Demos de FACEIT/ESEA pueden necesitar ajustes en el string table parser.
- Las SendTables (posición tick a tick, HP, equipamiento) no están implementadas — es trabajo futuro.
- Requiere Node.js >= 18.
Publicar en npm
# 1. Cambiar el "name" en package.json si está tomado
# 2. Login en npm
npm login
# 3. Build + tests + publish
npm publishLicencia
MIT
