You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.3 KiB
JavaScript

"use strict";
const generateID = require("../../generate-id");
const BLOB_INTERNAL = Buffer.from([ 0 ]);
const BLOB_EXTERNAL = Buffer.from([ 1 ]);
module.exports = {
encode: function (value, _asIndexKey) {
if (value.length < 256) {
return {
value: [
BLOB_INTERNAL,
Buffer.from([ value.length ]),
value
],
auxiliaryBlob: undefined
};
} else {
let blobID = generateID();
return {
value: [
BLOB_EXTERNAL,
blobID
],
auxiliaryBlob: {
key: blobID,
value: value
}
};
}
},
decode: function (buffer, offset) {
let blobType = buffer.readUInt8(offset);
if (blobType === 0) {
// Internal blob
let blobLength = buffer.readUInt8(offset + 1);
let blobPosition = offset + 2;
let bytes = buffer.slice(blobPosition, blobPosition + blobLength);
return {
bytesRead: 2 + blobLength,
value: bytes,
auxiliaryBlob: undefined
};
} else if (blobType === 1) {
// External blob
let idPosition = offset + 1;
return {
bytesRead: 13, // a blob ID is always 12 bytes
value: undefined,
auxiliaryBlob: {
key: buffer.slice(idPosition, idPosition + 12),
transform: (blob) => blob
}
};
} else {
throw new Error(`Invalid blob type: ${blobType}`);
}
}
};