UNPKG

watch-xdelta

Version:

smart-watch xdelta script

63 lines (52 loc) 1.61 kB
/** * header头信息有关的操作 */ 'use strict'; import co from 'co'; import bfs from 'babel-fs'; export const DIFF_INDEX = 20; // diff文件在头信息中的起始位置 /** * 初始化差分文件的头信息, 具体结构可以看doc/header.docx * @param {Number} diffLen diff块的总大小 * @param {Number} blk 分块的数量 * @param {Number} blksize 分块的大小 * @param {Number} oldFromLenB 老固件有多少个字节 * @param {Number} newFromLenB 新固件有多少个字节 * @return{Promise.<Buffer>} 头信息 * */ export const generatorHeader = co.wrap(function *({blk, blksize, oldFromLenB, newFromLenB, xdeltaFiles}) { let buf = new Buffer(DIFF_INDEX + xdeltaFiles.length*4); //wth1 buf.writeUInt8(0x77,0); buf.writeUInt8(0x74,1); buf.writeUInt8(0x68,2); buf.writeUInt8(0x31,3); //block-size buf.writeUInt32LE(blksize, 4); //diffNum buf.writeUInt32LE(blk, 8); //oldFromLenB buf.writeUInt32LE(oldFromLenB, 12); //newFromLenB buf.writeUInt32LE(newFromLenB, 16); //diffLen1...diffLenN yield fillInDiff(buf, DIFF_INDEX, xdeltaFiles); return buf; }); /** * 填充每个diff文件的大小 * @param {Buffer} buf 头信息 * @param {Number} xdeltaIndex 第一个diff文件的位置 * @param {Array} xdeltaFiles diff文件数组 * */ const fillInDiff = co.wrap(function *(buf, xdeltaIndex, xdeltaFiles) { for(let i=0, len=xdeltaFiles.length; i<len; i++) { let file = xdeltaFiles[i]; let dStat = yield bfs.stat(file); let dSize = dStat.size; buf.writeUInt32LE(dSize, xdeltaIndex); xdeltaIndex += 4; } });