screeps-api
    Preparing search index...

    screeps-api

    Screeps API

    License Version Downloads Docs Test Status Lint Status

    npm

    As of v1.0, all endpoint methods are asynchronous.

    import { ScreepsHttpClient, ScreepsSocketClient } from 'screeps-api'
    import { writeFile } from 'node:fs/promises'

    // `ScreepsHttpClient.fromConfig()` finds your configuration file and picks
    // server and client configs from it.
    // It supports @tedivm's Unified Credentials File format
    // (https://github.com/screepers/screepers-standards/blob/master/SS3-Unified_Credentials_File.md)
    // and screeps.json
    // (https://github.com/screepers/screeps-typescript-starter/blob/master/screeps.sample.json)

    // This example initializes the HTTP client using the `servers` section 'main'
    // and the `configs` section 'nuke-announcer' from the config file.
    // In a real application, consider reading the server/app names from env vars,
    // or accepting `--server <serverName>` and `--app <appName>` CLI arguments.
    const api = await ScreepsHttpClient.fromConfig('main', { app: 'nuke-announcer' })

    // Client config can be accessed like this:
    console.log(api.appConfig)

    // HTTP API

    // Dump entire Memory object to a file
    api.userMemoryGet()
    .then(memory => {
    writeFile('memory.json', JSON.stringify(memory), { encoding: 'utf-8' })
    })
    .catch(console.error)

    // Dump a subset of Memory to a file
    api.userMemoryGet('rooms.W0N0')
    .then((memory) => {
    writeFile('memory.rooms.W0N0.json', JSON.stringify(memory), { encoding: 'utf-8' })
    })
    .catch(console.error)

    // Get user info
    api.authMe().then(me => console.log('My user info:', me)).catch(console.error)

    // Download code from the "default" branch and log it
    api.userCodeGet('default')
    .then((data) => console.log('My code:', JSON.stringify(data, undefined, 2)))
    .catch(console.error)

    // Upload code to the "apiDemo" branch
    api.userCodeSet({
    branch: 'apiDemo',
    modules: {
    main: 'module.exports.loop = function() { console.log("Hello, world!") }'
    }
    }).catch(console.error)

    // WebSocket API

    // Connect and authenticate
    await api.socket.connect()

    // Events follow this format:
    // {
    // type: 'room',
    // id: 'shard0', // Only on certain events, otherwise undefined
    // path: 'E3N3', // Only on certain events, otherwise an empty string
    // data: { ... }
    // }
    api.socket.on(ScreepsSocketClient.CONNECTED, () => {
    console.log('WebSocket client connected')
    })
    api.socket.on(ScreepsSocketClient.DISCONNECTED, () => {
    console.log('WebSocket client disconnected')
    })
    api.socket.on(ScreepsSocketClient.AUTH, (event) => {
    // Contains either 'ok' or 'failed'
    console.log('WebSocket auth:', event.data.status)
    })

    // Subscriptions can be queued even before the client connects or auths
    function onConsole(event) {
    const { messages, error, shard } = event.data
    const shardTag = shard ? `[${shard}] ` : ''
    if (error) console.error(shardTag + error)

    // messages is undefined if nothing was logged or evaluated
    if (!messages) return

    // `console.log()` output from the previous tick
    messages.log.map(l => shardTag + l).forEach(console.info)

    // `POST /api/user/console` results from the previous tick
    messages.results.map(r => `< ${r}`).forEach(console.info)
    }
    api.socket.subscribe('console')
    api.socket.on('console', onConsole)

    // Starting in v1.0, you can also pass a handler straight to subscribe!
    api.socket.subscribe('console', onConsole)

    // Starting in v2.0, you can use specialized subscribe methods for each known
    // event type. These specialized versions automatically determine the correct
    // event string to use and provide better type safety for callback arguments.
    api.socket.subscribeUserConsole(onConsole)

    // ScreepsSocketClient tracks which callbacks are registered for which events.
    // By default, `subscribe` and its specialized versions will ignore duplicate
    // callbacks for any given event, so after running all of the previous examples,
    // `onConsole` will still only be invoked once per `UserConsoleEvent`.

    // Watch CPU/Memory usage
    api.socket.subscribeUserCpu((event) => {
    console.log('CPU used:', event.data.cpu)
    console.log('Memory used (bytes):', event.data.memory)
    })

    // Watch for updates to Memory paths
    api.socket.subscribeUserMemory('stats', (event) => {
    console.log('Memory.stats:', JSON.stringify(event.data, undefined, 2))
    })
    api.socket.subscribeUserMemory('rooms.E0N0', (event) => {
    console.log('Memory.rooms.E0N0:', JSON.stringify(event.data, undefined, 2))
    })

    As of v1.7, a small CLI program (screeps-api) is included.

    Server/auth credentials are located using ScreepsConfigManager.loadConfig(). All commands aside from help accept a --server <name> option to specify the name of the server to use from your config file.

    > screeps-api --help
    Usage: screeps-api [options] [command]

    Options:
    -V, --version output the version number
    -h, --help display help for command

    Commands:
    call [options] <cmd> [args...] Call an API endpoint method on ScreepsHttpClient
    memory [options] [path] Read from or write to Memory
    segment [options] <segments> Read or write RawMemory segments
    download [options] Download code and WASM binaries
    upload [options] <files...> Upload code and WASM binaries
    help [command] display help for command

    Check the docs for a detailed list of supported endpoints:

    Please note that the listed endpoints and WebSocket events are not exhaustive.

    First, make sure you're using a compatible version of Node.js. We recommend installing a node version manager like nvm or a general runtime version manager like asdf, mise-en-place, etc. Once you have one of these installed and configured for node, ensure you have the target version of node installed:

    # nvm example:
    nvm install "$(cat .node-version)"

    This project uses the yarn package manager. The correct yarn version is pinned in package.json using corepack. To ensure you're using the correct version of yarn instead of the legacy v1.x:

    # Enable corepack: https://yarnpkg.com/corepack
    corepack enable

    # If using asdf, update node shims after enabling corepack:
    # https://github.com/asdf-vm/asdf-nodejs#corepack
    if [[ -n "$(which asdf)" ]] ; then asdf reshim nodejs ; fi

    # Install dependencies using the version of yarn from package.json's
    # "packageManager" field:
    yarn install

    The documentation goes into detail on how to set up a configuration file, but the simplest way to get started is to copy a screeps.yaml or screeps.json file to the repo root directory.

    tsx is used to execute TypeScript scripts without having to run tsc to transpile them:

    # Run an example script
    yarn exec tsx examples/console.ts

    # Run the screeps-api CLI tool
    yarn exec tsx bin/screeps-api.ts call version

    # package.json defines a cli script to make testing the CLI more convenient.
    # The following command is functionally identical to the previous one:
    yarn cli call version