blob: 4c6a058eb2f9964e5b90ad56566365ed716a581e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { typof, bufferToBase64, base64ToBuffer } from '../shared/utils'
/**
* Normalize a primitive value.
* @param {any} v
* @return {primitive}
*/
export function normalizePrimitive (v) {
const type = typof(v)
switch (type) {
case 'Undefined':
case 'Null':
return ''
case 'RegExp':
return v.toString()
case 'Date':
return v.toISOString()
case 'Number':
case 'String':
case 'Boolean':
case 'Array':
case 'Object':
return v
case 'ArrayBuffer':
return {
'@type': 'binary',
dataType: type,
base64: bufferToBase64(v)
}
case 'Int8Array':
case 'Uint8Array':
case 'Uint8ClampedArray':
case 'Int16Array':
case 'Uint16Array':
case 'Int32Array':
case 'Uint32Array':
case 'Float32Array':
case 'Float64Array':
return {
'@type': 'binary',
dataType: type,
base64: bufferToBase64(v.buffer)
}
default:
return JSON.stringify(v)
}
}
export function decodePrimitive (data) {
if (typof(data) === 'Object') {
// decode base64 into binary
if (data['@type'] && data['@type'] === 'binary') {
return base64ToBuffer(data.base64 || '')
}
const realData = {}
for (const key in data) {
realData[key] = decodePrimitive(data[key])
}
return realData
}
if (typof(data) === 'Array') {
return data.map(decodePrimitive)
}
return data
}