This library allows you to access SteamCMD via Node.js on Windows, Linux, or macOS.
Install
the dependencies for node-pty
npm install --global windows-build-tools
sudo apt install -y make python build-essential
Xcode Command Line Tools. These might be installed already. If you can’t install this package, then run:
xcode-select --install
If you’re still having trouble, then see the troubleshooting section below.
Install the package
npm install steamcmd-interface
Import the class and create a new instance using the init
function. This
is an asynchronous function that downloads all the binaries, creates a new
instance of SteamCmd, ensures that it can run, and then returns the instance.
import { SteamCmd } from 'steamcmd-interface'
const steamCmd = await SteamCmd.init({})
Now you can use the instance to interact with SteamCMD. You can log in with your user account or anonymously (default), update apps, or run a series of commands.
The updateApp
function is an async generator that reports on the progress
of the update as it gets output from the underling SteamCMD process.
// Downloads CS:GO dedicated server to the default install directory.
for await(const progress of steamCmd.updateApp(740)) {
// Logs something like "downloading 1.2%"
console.log(`${progress.state} ${progress.progressPercent}%`)
}
A new SteamCmd
object cannot be created using the new
keyword. It will
throw an error. You must use the SteamCmd.init
async function. This is because
construction is fundamentally asynchronous.
An option object can be passed to the SteamCmd.init
function to configure
the behaviour of the instance. The following options are available:
binDir
: The path to which the SteamCMD binaries will be downloaded to.
Default to "[the module's base directory]/temp/install_dir/[platform string]"installDir
: To where SteamCMD will download all applications. Default to
"[the module's base directory]/temp/install_dir"username
: The username to log in as. Defaults to "anonymous"SteamCmd.init({
installDir: process.cwd()
})
Setting a username for downloading purchased games.
Note that this will only work if you successfully logged in once and SteamCMD has your credentials cached. See the "Logging In" section below for more details.
SteamCmd.init({
username: 'example'
})
SteamCmd offers two login-related functions:
isLoggedIn
simply tests if the currently saved username is logged in with
SteamCMD. If this returns true, then SteamCMD has access to your library, and
you can run actions related to your library, such as downloading games.login
uses the given username, password, and Steam Guard code to log in.
This will resolve if the login was successful or throw an error if the login
failed.const steamCmd = await SteamCmd.init()
console.log(await steamCmd.isLoggedIn()) // Logs "true"
const steamCmd = await SteamCmd.init({
username: 'example'
})
console.log(await steamCmd.isLoggedIn()) // Logs "false"
const steamCmd = await SteamCmd.init({
// Specifying the username here is not strictly necessary, because the
// call to "login" below will update the internally saved username.
username: 'example'
})
await steamCmd.login('example', 'password123', 'AABB2')
console.log(await steamCmd.isLoggedIn()) // Logs "true"
const steamCmd = await SteamCmd.init({
username: 'example'
})
console.log(await steamCmd.isLoggedIn()) // Logs "true"
You can download games into the installation directory by using the updateApp
function. It's an asynchronous generator function that yields an object that
reports on the current progress of the update. If you’re logged in, then you
will have access to your Steam library.
You have to give updateApp
the app ID of the game that you want to download.
You can search for your game to get the app ID on
Steam DB.
This function also optionally accepts the platform type and bitness of the application. This will allow you to download, for example, Windows games on a Mac. If omitted, then the platform and bitness of the current operating system are used.
const steamCmd = await SteamCmd.init()
// Downloads Windows 32bit CS:GO dedicated server to the default install
// directory.
for await(const progress of steamCmd.updateApp(740, 'windows', 32)) {
// Logs something like
// {
// stateCode: '0x61',
// state: 'downloading',
// progressPercent: 0.65,
// progressAmount: 156521223,
// progressTotalAmount: 24015919696
// }
console.log(progress)
}
// Once the loop above has completed then the app has been successfully
// downloaded and installed.
You can run a series of commands using the run
function. It accepts an array
of strings. Each sting must be a command that SteamCMD can run. An exhaustive
list of all available commands is available in
this repository.
This function is an asynchronous generator function. It yields each line of output from SteamCMD. It will throw an error if an error occurred.
const steamCmd = await SteamCmd.init()
// Uninstall the CS:GO dedicated server
const commands = [
'app_uninstall -complete 740'
]
for await(const line of steamCmd.run(commands)) {
console.log(line)
}
Some function can throw a SteamCmdError
error (most notably the run
and
updateApp
generators). This error object's message
property is generated
based on the exit code that the SteamCMD binary returned. In addition, the
original exit code can be retrieved via the exitCode
property.
The class also has a few useful statics, such as the EXIT_CODES
object, and
the getErrorMessage
function.
const steamCmd = await SteamCmd.init()
// Try to download Half-Life 2
try {
for await(const progress of steamCmd.updateApp(220)) {
console.log(progress)
}
} catch (error) {
// Logs "The application failed to install for some reason. Reasons include:
// you do not own the application, you do not have enough hard drive space, a
// network error occurred, or the application is not available for your
// selected platform." This is because we logged in anonymously above and are
// therefore not allowed to download Half-Life 2.
console.log(error.message)
// Logs "8"
console.log(error.exitCode)
// Logs "The application failed to install for some reason. Reasons include:
// you do not own the application, you do not have enough hard drive space, a
// network error occurred, or the application is not available for your
// selected platform."
console.log(SteamCmdError.getErrorMessage(error.exitCode))
// Logs all the currently known exit codes.
console.log(SteamCmdError.EXIT_CODES)
}
You can enable debug logging where SteamCmd will log each line of output to the console. There are two ways you can enable debug logging:
enableDebugLogging
to true
in the init
function.
SteamCmd.init({ enableDebugLogging: true })
By setting a class variable to true. This is useful for enabling or disabling debug logging after initialisation.
const steamCmd = await SteamCmd.init()
// ... Later ...
steamCmd.enableDebugLogging = true
gyp ERR! find VS gyp ERR! find VS msvs_version not set from command line or npm config
npm config set msvs_version 2017
. This is because native extensions on
Windows are built using the Visual Studio build tools. If no version is set,
then the build fails.Error: The module '[...]/pty.node' was compiled against a different Node.js
npm rebuild
gyp: No Xcode or CLT version detected!
xcode-select --install
sudo rm -rf $(xcode-select --print-path)
xcode-select --install