borc
Version:
Encode and parse data in the Concise Binary Object Representation (CBOR) data format (RFC7049).
79 lines (73 loc) • 2.19 kB
JavaScript
'use strict'
/**
* A CBOR tagged item, where the tag does not have semantics specified at the
* moment, or those semantics threw an error during parsing. Typically this will
* be an extension point you're not yet expecting.
*/
class Tagged {
/**
* Creates an instance of Tagged.
*
* @param {number} tag - the number of the tag
* @param {any} value - the value inside the tag
* @param {Error} err - the error that was thrown parsing the tag, or null
*/
constructor (tag, value, err) {
this.tag = tag
this.value = value
this.err = err
if (typeof this.tag !== 'number') {
throw new Error('Invalid tag type (' + (typeof this.tag) + ')')
}
if ((this.tag < 0) || ((this.tag | 0) !== this.tag)) {
throw new Error('Tag must be a positive integer: ' + this.tag)
}
}
/**
* Convert to a String
*
* @returns {string} string of the form '1(2)'
*/
toString () {
return `${this.tag}(${JSON.stringify(this.value)})`
}
/**
* Push the simple value onto the CBOR stream
*
* @param {cbor.Encoder} gen - The generator to push onto
* @returns {number}
*/
encodeCBOR (gen) {
gen._pushTag(this.tag)
return gen.pushAny(this.value)
}
/**
* If we have a converter for this type, do the conversion. Some converters
* are built-in. Additional ones can be passed in. If you want to remove
* a built-in converter, pass a converter in whose value is 'null' instead
* of a function.
*
* @param {Object} converters - keys in the object are a tag number, the value
* is a function that takes the decoded CBOR and returns a JavaScript value
* of the appropriate type. Throw an exception in the function on errors.
* @returns {any} - the converted item
*/
convert (converters) {
let er, f
f = converters != null ? converters[this.tag] : undefined
if (typeof f !== 'function') {
f = Tagged['_tag' + this.tag]
if (typeof f !== 'function') {
return this
}
}
try {
return f.call(Tagged, this.value)
} catch (error) {
er = error
this.err = er
return this
}
}
}
module.exports = Tagged