| 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 | 
| } |