💡 Add comments

This commit is contained in:
C-3PO 2018-06-22 11:42:00 +02:00
parent ca2862fb3d
commit fdf40e8d11
Signed by: c3po
GPG key ID: 62993C4BB4D86F24
3 changed files with 29 additions and 14 deletions

View file

@ -17,7 +17,7 @@ export const set = (key: string, value: any) => {
if (typeof value !== 'number') { throw new Error(`release must be a number but it's a "${typeof value}".`); } if (typeof value !== 'number') { throw new Error(`release must be a number but it's a "${typeof value}".`); }
if ((value | 0) !== value) { throw new Error(`release must be an integer but it's ${value}.`); } if ((value | 0) !== value) { throw new Error(`release must be an integer but it's ${value}.`); }
if (value < 0) { throw new Error(`release must be a non-negative integer but it's ${value}.`); } if (value < 0) { throw new Error(`release must be a non-negative integer but it's ${value}.`); }
if (settings.from !== undefined && value <= settings.from ) { throw new Error(`release must be bigger than from but ${value} is not bigger than ${settings.from}.`); } if (settings.from !== undefined && value <= settings.from ) { throw new Error(`release must be greater than from but ${value} is not greater than ${settings.from}.`); }
settings.release = value; settings.release = value;
break; break;
case 'from': case 'from':
@ -25,7 +25,7 @@ export const set = (key: string, value: any) => {
if (typeof value !== 'number') { throw new Error(`from must be a number but it's a "${typeof value}".`); } if (typeof value !== 'number') { throw new Error(`from must be a number but it's a "${typeof value}".`); }
if ((value | 0) !== value) { throw new Error(`from must be an integer but it's ${value}.`); } if ((value | 0) !== value) { throw new Error(`from must be an integer but it's ${value}.`); }
if (value < -1) { throw new Error(`from must be a non-negative integer or -1, but it's ${value}.`); } if (value < -1) { throw new Error(`from must be a non-negative integer or -1, but it's ${value}.`); }
if (settings.release !== undefined && value >= settings.release ) { throw new Error(`from must be smaller than release but ${value} is not smaller than ${settings.release}.`); } if (settings.release !== undefined && value >= settings.release ) { throw new Error(`from must be less than release but ${value} is not less than ${settings.release}.`); }
settings.from = value; settings.from = value;
break; break;
case 'outputType': case 'outputType':

View file

@ -9,13 +9,13 @@ export default function getSolidpkg(product: Product, from: number, to: number):
} }
if (typeof from !== 'number' || (from | 0) !== from || from < -1) { if (typeof from !== 'number' || (from | 0) !== from || from < -1) {
throw new Error(`from must be an integer at least -1 but it is "${from}"`); throw new Error(`from must be an integer greater than or equal to -1 but it is "${from}"`);
} }
if (typeof to !== 'number' || (to | 0) !== to || to < 0) { if (typeof to !== 'number' || (to | 0) !== to || to < 0) {
throw new Error(`to must be an integer at least 0 but it is "${to}"`); throw new Error(`to must be an integer greater than or equal to 0 but it is "${to}"`);
} }
if (from >= to) { if (from >= to) {
throw new Error(`from must be smaller than to but "${from}" is not smaller than "${to}".`); throw new Error(`from must be less than to but "${from}" is not less than "${to}".`);
} }
return getUrlContents({ host: 'cdn-patch.swtor.com', path: `/patch/${product}/${product}_${from}to${to}.solidpkg` }); return getUrlContents({ host: 'cdn-patch.swtor.com', path: `/patch/${product}/${product}_${from}to${to}.solidpkg` });

View file

@ -1,3 +1,8 @@
/**
* The file format used by Solid State Networks is based on the .zip format.
* Check the .ZIP File Format Specification <https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT>.
*/
import { TextDecoder } from 'util'; import { TextDecoder } from 'util';
import modifyPassword from './modifyPassword'; import modifyPassword from './modifyPassword';
@ -50,7 +55,7 @@ export default function readSolidpkg(buffer: Buffer) {
throw new Error(`Central dir points before file start (0x${(pos - centralDirSize).toString(16)})`); throw new Error(`Central dir points before file start (0x${(pos - centralDirSize).toString(16)})`);
} }
//--------------- READ CENTRAL DIR --------------- //--------------- READ CENTRAL DIRECTORY ---------------
//Go to start of central dir //Go to start of central dir
pos -= 20 + centralDirSize; pos -= 20 + centralDirSize;
@ -62,31 +67,41 @@ export default function readSolidpkg(buffer: Buffer) {
} }
} }
pos += 4; //skip version pos += 4; //skip version made by and version needed to extract
/** The bitflag stores whether the file is encrypted or not. Most files are encrypted but there are /** The general purpose bit flag stores whether the file is encrypted or not.
* some exceptions: assets_swtor_test_main_248to249.solidpkg, assets_swtor_test_en_us_270to271.solidpkg, and * Most files are encrypted but there are some exceptions: assets_swtor_test_main_248to249.solidpkg,
* retailclient_publictest_246to247.solidpkg are not encrypted. * assets_swtor_test_en_us_270to271.solidpkg, and retailclient_publictest_246to247.solidpkg are not encrypted.
*/ */
const bitFlag = dv.getUint16(pos, true); pos += 2; const bitFlag = dv.getUint16(pos, true); pos += 2;
/** Type of compression, 8 = DEFLATE. Files are always compressed. */ /** Compression method, always set to 8 = DEFLATE. */
const compression = dv.getUint16(pos, true); pos += 2; const compression = dv.getUint16(pos, true); pos += 2;
if (compression !== COMPRESSION_DEFLATE) { if (compression !== COMPRESSION_DEFLATE) {
throw new Error(`File is not using DEFLATE compression but "${compression}"`); throw new Error(`File is not using DEFLATE compression but "${compression}"`);
} }
/** last mod file time */
const lastMod1 = dv.getUint16(pos, true); pos += 2; const lastMod1 = dv.getUint16(pos, true); pos += 2;
/** last mod file date */
const lastMod2 = dv.getUint16(pos, true); pos += 2; const lastMod2 = dv.getUint16(pos, true); pos += 2;
/** crc-32 */
const fileCrc = dv.getUint32(pos, true); pos += 4; const fileCrc = dv.getUint32(pos, true); pos += 4;
/** compressed size */
const comprSize = dv.getUint32(pos, true); pos += 4; const comprSize = dv.getUint32(pos, true); pos += 4;
/** uncompressed size */
const uncomprSize = dv.getUint32(pos, true); pos += 4; const uncomprSize = dv.getUint32(pos, true); pos += 4;
/** file name length */
const fileNameLength = dv.getUint16(pos, true); pos += 2; const fileNameLength = dv.getUint16(pos, true); pos += 2;
/** extra field length */
const extraFieldLength = dv.getUint16(pos, true); pos += 2; const extraFieldLength = dv.getUint16(pos, true); pos += 2;
/** file comment length */
const fileCommentLength = dv.getUint16(pos, true); pos += 2; const fileCommentLength = dv.getUint16(pos, true); pos += 2;
pos += 8; //skip disk num start and file attributes pos += 8; //skip disk number start, internal file attributes and external file attributes
/** relative offset of local header */
const relOffset = dv.getUint32(pos, true); pos += 4; const relOffset = dv.getUint32(pos, true); pos += 4;
const fileName = Decoder.decode(new DataView(arrayBuffer, pos, fileNameLength)); pos += fileNameLength; //skip file name /** file name (variable size) */
const fileName = Decoder.decode(new DataView(arrayBuffer, pos, fileNameLength)); pos += fileNameLength;
if (fileName !== 'metafile.solid') { if (fileName !== 'metafile.solid') {
throw new Error(`Expected file name to be "metafile.solid" but it was "${fileName}".`); throw new Error(`Expected file name to be "metafile.solid" but it was "${fileName}".`);
} }
@ -100,7 +115,7 @@ export default function readSolidpkg(buffer: Buffer) {
switch (fieldId) { switch (fieldId) {
case 0x8810: { //password case 0x8810: { //password
if (fieldLength > 120) { if (fieldLength > 120) {
throw new Error(`Password is too long, it should be 120 characters at most but is ${fieldLength} characters long.`); throw new Error(`Password is too long, it should be 120 characters at most but it is ${fieldLength} characters long.`);
} }
const passwordLength = fieldLength; const passwordLength = fieldLength;
encodedPassword = new Uint8Array(arrayBuffer, pos, fieldLength); encodedPassword = new Uint8Array(arrayBuffer, pos, fieldLength);