Merge pull request #21664 from overleaf/jpa-blob-hash

[overleaf-editor-core] stricter types for Blob interface

GitOrigin-RevId: 8595fce0d5c98074d2313be5a5634e80f92c68b5
This commit is contained in:
Jakob Ackermann 2024-11-08 09:33:36 +01:00 committed by Copybot
parent 122d89a831
commit a3d8caf87b
4 changed files with 18 additions and 34 deletions

View file

@ -40,6 +40,11 @@ class Blob {
static NotFoundError = NotFoundError
/**
* @param {string} hash
* @param {number} byteLength
* @param {number} [stringLength]
*/
constructor(hash, byteLength, stringLength) {
this.setHash(hash)
this.setByteLength(byteLength)
@ -63,14 +68,14 @@ class Blob {
/**
* Hex hash.
* @return {?String}
* @return {String}
*/
getHash() {
return this.hash
}
setHash(hash) {
assert.maybe.match(hash, Blob.HEX_HASH_RX, 'bad hash')
assert.match(hash, Blob.HEX_HASH_RX, 'bad hash')
this.hash = hash
}
@ -83,7 +88,7 @@ class Blob {
}
setByteLength(byteLength) {
assert.maybe.integer(byteLength, 'bad byteLength')
assert.integer(byteLength, 'bad byteLength')
this.byteLength = byteLength
}

View file

@ -63,20 +63,14 @@ class FileData {
*/
static createLazyFromBlobs(blob, rangesBlob) {
assert.instance(blob, Blob, 'FileData: bad blob')
if (blob.getStringLength() == null) {
return new BinaryFileData(
// TODO(das7pad): see call-sites
// @ts-ignore
blob.getHash(),
blob.getByteLength()
)
const stringLength = blob.getStringLength()
if (stringLength == null) {
return new BinaryFileData(blob.getHash(), blob.getByteLength())
}
return new LazyStringFileData(
// TODO(das7pad): see call-sites
// @ts-ignore
blob.getHash(),
rangesBlob?.getHash(),
blob.getStringLength()
stringLength
)
}

View file

@ -142,12 +142,8 @@ class StringFileData extends FileData {
trackedChanges: this.trackedChanges.toRaw(),
}
const rangesBlob = await blobStore.putObject(ranges)
// TODO(das7pad): Provide interface that guarantees hash exists?
// @ts-ignore
return { hash: blob.getHash(), rangesHash: rangesBlob.getHash() }
}
// TODO(das7pad): Provide interface that guarantees hash exists?
// @ts-ignore
return { hash: blob.getHash() }
}
}

View file

@ -79,23 +79,12 @@ function getBackend(projectId) {
}
async function makeBlobForFile(pathname) {
async function getByteLengthOfFile() {
const stat = await fs.promises.stat(pathname)
return stat.size
}
async function getHashOfFile(blob) {
const stream = fs.createReadStream(pathname)
const hash = await blobHash.fromStream(blob.getByteLength(), stream)
return hash
}
const blob = new Blob()
const byteLength = await getByteLengthOfFile()
blob.setByteLength(byteLength)
const hash = await getHashOfFile(blob)
blob.setHash(hash)
return blob
const { size: byteLength } = await fs.promises.stat(pathname)
const hash = await blobHash.fromStream(
byteLength,
fs.createReadStream(pathname)
)
return new Blob(hash, byteLength)
}
async function getStringLengthOfFile(byteLength, pathname) {