Miss any of our Open RFC calls?Watch the recordings here! »

blizzard-casc

1.0.5 • Public • Published

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 = require('blizzard-casc');
 
let casc = new CASC(); // Create new instance.
let cdnList = await casc.downloadCDNList(); // Obtain CDN list.
let versionList = await casc.downloadVersionList(); // 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.downloadConfigFile(selectedVersion.CDNConfig);
let buildConfig = await casc.downloadConfigFile(selectedVersion.BuildConfig);
 
// 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 cdnConfig.archives)
    archives[archive] = await casc.parseIndexFile(archive, archives);
    
// 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.parseEncodingFile(buildConfig.encoding[1]);
 
// 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.parseRootFile(rootKey);
 
// 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().

Install

npm i blizzard-casc

DownloadsWeekly Downloads

8

Version

1.0.5

License

MIT

Unpacked Size

33.2 kB

Total Files

5

Last publish

Collaborators

  • avatar