| function stringify (value, space) { |
| return JSON.stringify(value, replacer, space) |
| } |
| |
| function parse (text) { |
| return JSON.parse(text, reviver) |
| } |
| |
| function replacer (key, value) { |
| if (isBufferLike(value)) { |
| if (isArray(value.data)) { |
| if (value.data.length > 0) { |
| value.data = 'base64:' + Buffer.from(value.data).toString('base64') |
| } else { |
| value.data = '' |
| } |
| } |
| } |
| return value |
| } |
| |
| function reviver (key, value) { |
| if (isBufferLike(value)) { |
| if (isArray(value.data)) { |
| return Buffer.from(value.data) |
| } else if (isString(value.data)) { |
| if (value.data.startsWith('base64:')) { |
| return Buffer.from(value.data.slice('base64:'.length), 'base64') |
| } |
| // Assume that the string is UTF-8 encoded (or empty). |
| return Buffer.from(value.data) |
| } |
| } |
| return value |
| } |
| |
| function isBufferLike (x) { |
| return ( |
| isObject(x) && x.type === 'Buffer' && (isArray(x.data) || isString(x.data)) |
| ) |
| } |
| |
| function isArray (x) { |
| return Array.isArray(x) |
| } |
| |
| function isString (x) { |
| return typeof x === 'string' |
| } |
| |
| function isObject (x) { |
| return typeof x === 'object' && x !== null |
| } |
| |
| module.exports = { |
| stringify, |
| parse, |
| replacer, |
| reviver |
| } |