blizzard-casc
Utility for interacting with the CASC CDN servers used to distribute Blizzard Entertainment game content.
Game | Supported |
---|---|
World of Warcraft | Yes |
Diablo 3 | No |
Hearthstone | No |
Heroes of the Storm | No |
Starcraft 1 | No |
Starcraft 2 | No |
Destiny 2 | No |
Q: I copied the example code and it doesn't work.
A: Read through the comments in the example rather than copy/pasting.
Q: Why isn't there a single function that just downloads the exact file I want?
A: This is intended as an interface that handles the dirty work for writing tools that interact with CASC. If you're using this module, you should be taking consideration and indexing/caching the results of these functions rather than railing Blizzard's CDN, bundling everything into memory and hoping for the best.
Installing
npm install blizzard-casc
Example Usage
// WARNING: This example is intended to outline the functionality of the API provided// by this module and is NOT an example of implementation. Don't just copy/paste. // Import CASC class module.const CASC = ; let casc = ; // Create new instance.let cdnList = await casc; // Obtain CDN list.let versionList = await casc; // Obtain version list. // Do something intelligent to select a CDN from the list => selectedCdn// Do something intelligent to select a matching version => selectedVersion // Obtain the CDN and build config structures for this version.let cdnConfig = await casc;let buildConfig = await casc; // parseIndexFile() can parse pre-downloaded archives or download by key.// Index these using a database or hash-table, whatever works for your application.// Be sure to index entries using the archive keys, you'll need this later for reading files.let archives = {};for let archive of cdnConfigarchives archivesarchive = await casc; // parseEncodingFile() can parse pre-downloaded encoding files or download by key.// Again, you should index these entries in a database or hash table.let encoding = await casc; // Match buildConfig.root[0] with an encoding entry using your method of indexing => rootKey // parseRootFile() can parse pre-downloaded files or download by key, as shown here.// Index results and cache where needed! This goes for all these calls!let root = await casc; // root.Entries contains all the entries.// root.Types contains locale/content pairs which cross-reference by index to root.Entries[].Type. // Using the above, we can produce the following workflow to obtain files.// 1. Obtain Jenkins96 hash for a file path. (https://github.com/Kruithne/node-jenkins96)// 2. Look-up the root entry for this file, matching the hash to the `Hash` property.// Note: There may be multiple. Use locale/content flags to get the file version you want.// 3. Obtain encoding entry which has the `Hash` matching the `Key` from the root entry.// 4. Obtain the archive entry which has the `Hash` matching they `Key` from the encoding entry.// 5. Download the archive using the archive key you indexed the archive index with.// 6. Copy the data [offset -> offset + size] (values from the archive entry) from the archive.// 7. Open the data using the BLTEReader class (https://github.com/Kruithne/node-blte).// 8. If encrypted, ensure you have the correct encryption keys added to the BLTEReader class.// 9. Read your data. Done.
API
patchServer
: string
Returns the URL of the patch server this instance will use. If not set using setPatchServer()
, will return PATCH_SERVER_US
by default.
targetProduct
: string
Return the target product as set by setTargetProduct()
. If accessed before a product is set, an error will be thrown.
cdnServer
: string
Return the CDN server used to obtain data. If not set using setCDNServer()
, an error will be thrown.
cdnPath
: string
Return the CDN path used to obtain data. If not set using setCDNServer()
, an error will be thrown.
setPatchServer(url)
Set the URL of the patch server to be used for obtaining config.
This can be a custom URL or one of the pre-defined PATCH_SERVER_*
constants provided by the CASC
class.
Parameter | Type | Description |
---|---|---|
url | string |
Expected format: http://hostname:port |
setCDNServer(host, path)
Set the CDN server host to be used for obtaining data. For most purposes, the hostname and path should be obtained using downloadCDNList()
.
Parameter | Type | Description |
---|---|---|
host | string |
Hostname (e.g edgecast.blizzard.com ). |
path | string |
CDN path (e.g tpr/wow ). |
setTargetProduct(tag)
Set the target product to obtain data for. Use the PRODUCT_*
constants provided by the CASC
class.
Parameter | Type | Description |
---|---|---|
tag | string |
Product tag (e.g wow_beta ). |
async downloadCDNList()
Download the CDN list from the patch server.
// Example response, trimmed for documentation purposes. Name: 'eu' Path: 'tpr/wow' Hosts: 'edgecast.blizzard.com blzddist1-a.akamaihd.net level3.blizzard.com' ConfigPath: 'tpr/configs/data' length: 1
async downloadVersionList()
Download the build version list from the patch server.
// Example response, trimmed for documentation purposes. Region: 'us' BuildConfig: '9af48e10cc8066587aa2004c47a0d4f7' CDNConfig: 'c343ed36eb3616c4b7b682f904601675' KeyRing: '' BuildId: '25383' VersionsName: '7.3.2.25383' ProductConfig: '' length: 1
async downloadConfigFile(key)
Download a config file from the CDN server.
Parameter | Type | Description |
---|---|---|
key | string |
Key of the config file to download. |
async downloadIndexFile(key)
Download an index file from the CDN server.
Parameter | Type | Description |
---|---|---|
key | string |
Key of the index file to download. |
async downloadDataFile(key)
Download a data file from the CDN server.
Parameter | Type | Description |
---|---|---|
key | string |
Key of the data file to download. |
async parseIndexFile(archive)
Parse an index file and return the entries from it. You can provide a pre-downloaded archive file either as a Buffer or Bufo object, or provide an archive key (string) and it will be downloaded providing the CASC instance is set-up to download.
Parameter | Type | Description |
---|---|---|
archive | Buffer\|Bufo|\string |
Archive key, or pre-existing data buffer. |
async parseEncodingFile(encoding)
Parse an encoding file and return all entries from it. You can provide a pre-downloaded encoding file as an BLTEReader instance, or provide an encoding key (string) and it will be downloaded providing the CASC instance is set-up to download.
Parameter | Type | Description |
---|---|---|
encoding | `BLTEReader|string | Encoding key or pre-loaded data. |
async parseRootFile(root)
Parse an root file and return all entries from it, along with an index of flag pairs. You can provide a pre-downloaded encoding file as an BLTEReader instance, or provide a root key (string) and it will be downloaded providing the CASC instance is set-up to download.
The return result of this function is an object containing Entries
, which is an array of entries, and Types
, which is an array of content/locale pairs cross-referenced by index using the Type
property in each entry.
Parameter | Type | Description |
---|---|---|
encoding | `BLTEReader|string | Encoding key or pre-loaded data. |
CASC.LOCALE_FLAG
: object
Static constant defining locale flags for root file entries.
All: 0xFFFFFFFF None: 0 enUS: 0x2 koKR: 0x4 frFR: 0x10 deDE: 0x20 zhCN: 0x40 esES: 0x80 zhTW: 0x100 enGB: 0x200 enCH: 0x400 enTW: 0x800 esMX: 0x1000 ruRU: 0x2000 ptBR: 0x4000 itIT: 0x8000 ptPT: 0x10000 enSG: 0x20000000 plPL: 0x40000000 All_WoW: 0x1F3F6
CASC.CONTENT_FLAG
: object
Static constant defining content flags for root file entries.
None: 0 F00000001: 0x1 F00000002: 0x2 F00000004: 0x4 F00000008: 0x8 F00000010: 0x10 LowViolence: 0x80 F10000000: 0x10000000 F20000000: 0x20000000 Bundle: 0x40000000 NoCompression: 0x80000000
CASC.PATCH_SERVER_EU
: string
Static constant defining the EU patch server URL. For use with setPatchServer()
.
CASC.PATCH_SERVER_US
: string
Static constant defining the US patch server URL. For use with setPatchServer()
.
CASC.PATCH_SERVER_KR
: string
Static constant defining the KR patch server URL. For use with setPatchServer()
.
CASC.PATCH_SERVER_CN
: string
Static constant defining the CN patch server URL. For use with setPatchServer()
.
CASC.PRODUCT_WOW
: string
Static constant defining the product tag for World of Warcraft. For use with setTargetProduct()
.
CASC.PRODUCT_WOW_PTR
: string
Static constant defining the product tag for World of Warcraft (PTR). For use with setTargetProduct()
.
CASC.PRODUCT_WOW_BETA
: string
Static constant defining the product tag for World of Warcraft (Beta). For use with setTargetProduct()
.
CASC.PRODUCT_DIABLO_3
: string
Static constant defining the product tag for Diablo 3. For use with setTargetProduct()
.
CASC.PRODUCT_DIABLO_3_PTR
: string
Static constant defining the product tag for Diablo 3 (PTR). For use with setTargetProduct()
.
CASC.PRODUCT_DIABLO_3_BETA
: string
Static constant defining the product tag for Diablo 3 (Beta). For use with setTargetProduct()
.
CASC.PRODUCT_STARCRAFT_2
: string
Static constant defining the product tag for Starcraft 2. For use with setTargetProduct()
.
CASC.PRODUCT_STARCRAFT_2_PTR
: string
Static constant defining the product tag for Starcraft 2 (PTR). For use with setTargetProduct()
.
CASC.PRODUCT_STARCRAFT_2_BETA
: string
Static constant defining the product tag for Starcraft 2 (Beta). For use with setTargetProduct()
.
CASC.PRODUCT_HEROES
: string
Static constant defining the product tag for Heroes of the Storm. For use with setTargetProduct()
.
CASC.PRODUCT_HEROES_PTR
: string
Static constant defining the product tag for Heros of the Storm (PTR). For use with setTargetProduct()
.
CASC.PRODUCT_HEARTHSTONE
: string
Static constant defining the product tag for Hearthstone. For use with setTargetProduct()
.
CASC.PRODUCT_OVERWATCH
: string
Static constant defining the product tag for Overwatch. For use with setTargetProduct()
.
CASC.PRODUCT_STARCRAFT_1
: string
Static constant defining the product tag for Starcraft 1. For use with setTargetProduct()
.
CASC.PRODUCT_STARCRAFT_1_PTR
: string
Static constant defining the product tag for Starcraft 1 (PTR). For use with setTargetProduct()
.
CASC.PRODUCT_WARCRAFT_3
: string
Static constant defining the product tag for Warcraft 3. For use with setTargetProduct()
.
CASC.PRODUCT_DESTINY_2
: string
Static constant defining the product tag for Destiny 2. For use with setTargetProduct()
.
CASC.PRODUCT_BNET_AGENT
: string
Static constant defining the product tag for the Battle.net agent. For use with setTargetProduct()
.
CASC.PRODUCT_BNET_APP
: string
Static constant defining the product tag for the Battle.net app. For use with setTargetProduct()
.
CASC.PRODUCT_BNET_CLIENT
: string
Static constant defining the product tag for the Battle.net client. For use with setTargetProduct()
.