npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

blizzard-casc

v1.0.5

Published

Utility for interacting with the CASC CDN servers used to distribute Blizzard Entertainment game content.

Downloads

12

Readme

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().