UNPKG

sw-delta

Version:

A browser cache that only downloads the diff of modified files

52 lines (41 loc) 1.69 kB
var DeltaApplier = function() { 'use strict'; this.applyDelta = function(oldString, delta) { // Extract the separator, which is the first char in the delta var separator = delta.substr(0, 1); var diffArray = delta.split(separator); diffArray.shift(); var newString = ''; var oldStringCursor = 0; var charIndex = 0; var deletedChars = 0; var regex = /(\d+)([+-])([\s\S]+)/m; var adding, chunks, numberOfCharsToRemove; for (var i = 0, max = diffArray.length; i < max; i++) { chunks = regex.exec(diffArray[i]); charIndex += parseInt(chunks[1], 10); var numberOfMissingChars = charIndex - deletedChars - newString.length; if (numberOfMissingChars > 0) { newString += oldString.substr(oldStringCursor, numberOfMissingChars); oldStringCursor += numberOfMissingChars; } adding = (chunks[2] === '+'); if (adding) { newString += chunks[3]; charIndex += chunks[3].length; } else { // Removing numberOfCharsToRemove = parseInt(chunks[3], 10); deletedChars += numberOfCharsToRemove; oldStringCursor += numberOfCharsToRemove; charIndex += numberOfCharsToRemove; } } // At the end, copy the remaining chars from the oldString if (oldStringCursor < oldString.length) { newString += oldString.substring(oldStringCursor); } return newString; }; }; module.exports = new DeltaApplier();