Beta 7 with some repo names changed.
This commit is contained in:
1 parent
0f7b40cca7
commit
963c19493a
3408 files changed
+462217
-15516
No files matched your search
+132
@@ -0,0 +1,132 @@
|
||||
/**
|
||||
* Implementation of the [multibase](https://github.com/multiformats/multibase) specification.
|
||||
* @module Multibase
|
||||
*/
|
||||
'use strict'
|
||||
|
||||
const { Buffer } = require('buffer')
|
||||
const constants = require('./constants')
|
||||
|
||||
exports = module.exports = multibase
|
||||
exports.encode = encode
|
||||
exports.decode = decode
|
||||
exports.isEncoded = isEncoded
|
||||
exports.names = Object.freeze(Object.keys(constants.names))
|
||||
exports.codes = Object.freeze(Object.keys(constants.codes))
|
||||
|
||||
const errNotSupported = new Error('Unsupported encoding')
|
||||
|
||||
/**
|
||||
* Create a new buffer with the multibase varint+code.
|
||||
*
|
||||
* @param {string|number} nameOrCode - The multibase name or code number.
|
||||
* @param {Buffer} buf - The data to be prefixed with multibase.
|
||||
* @memberof Multibase
|
||||
* @returns {Buffer}
|
||||
*/
|
||||
function multibase (nameOrCode, buf) {
|
||||
if (!buf) {
|
||||
throw new Error('requires an encoded buffer')
|
||||
}
|
||||
const base = getBase(nameOrCode)
|
||||
const codeBuf = Buffer.from(base.code)
|
||||
|
||||
const name = base.name
|
||||
validEncode(name, buf)
|
||||
return Buffer.concat([codeBuf, buf])
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode data with the specified base and add the multibase prefix.
|
||||
*
|
||||
* @param {string|number} nameOrCode - The multibase name or code number.
|
||||
* @param {Buffer} buf - The data to be encoded.
|
||||
* @returns {Buffer}
|
||||
* @memberof Multibase
|
||||
*/
|
||||
function encode (nameOrCode, buf) {
|
||||
const base = getBase(nameOrCode)
|
||||
const name = base.name
|
||||
|
||||
return multibase(name, Buffer.from(base.encode(buf)))
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a buffer or string encoded with multibase header, decodes it and
|
||||
* returns the decoded buffer
|
||||
*
|
||||
* @param {Buffer|string} bufOrString
|
||||
* @returns {Buffer}
|
||||
* @memberof Multibase
|
||||
*
|
||||
*/
|
||||
function decode (bufOrString) {
|
||||
if (Buffer.isBuffer(bufOrString)) {
|
||||
bufOrString = bufOrString.toString()
|
||||
}
|
||||
|
||||
const code = bufOrString.substring(0, 1)
|
||||
bufOrString = bufOrString.substring(1, bufOrString.length)
|
||||
|
||||
if (typeof bufOrString === 'string') {
|
||||
bufOrString = Buffer.from(bufOrString)
|
||||
}
|
||||
|
||||
const base = getBase(code)
|
||||
return Buffer.from(base.decode(bufOrString.toString()))
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the given data multibase encoded?
|
||||
*
|
||||
* @param {Buffer|string} bufOrString
|
||||
* @returns {boolean}
|
||||
* @memberof Multibase
|
||||
*/
|
||||
function isEncoded (bufOrString) {
|
||||
if (Buffer.isBuffer(bufOrString)) {
|
||||
bufOrString = bufOrString.toString()
|
||||
}
|
||||
|
||||
// Ensure bufOrString is a string
|
||||
if (Object.prototype.toString.call(bufOrString) !== '[object String]') {
|
||||
return false
|
||||
}
|
||||
|
||||
const code = bufOrString.substring(0, 1)
|
||||
try {
|
||||
const base = getBase(code)
|
||||
return base.name
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {Buffer} buf
|
||||
* @private
|
||||
* @returns {undefined}
|
||||
*/
|
||||
function validEncode (name, buf) {
|
||||
const base = getBase(name)
|
||||
base.decode(buf.toString())
|
||||
}
|
||||
|
||||
function getBase (nameOrCode) {
|
||||
let base
|
||||
|
||||
if (constants.names[nameOrCode]) {
|
||||
base = constants.names[nameOrCode]
|
||||
} else if (constants.codes[nameOrCode]) {
|
||||
base = constants.codes[nameOrCode]
|
||||
} else {
|
||||
throw errNotSupported
|
||||
}
|
||||
|
||||
if (!base.isImplemented()) {
|
||||
throw new Error('Base ' + nameOrCode + ' is not implemented yet')
|
||||
}
|
||||
|
||||
return base
|
||||
}
|
||||
Reference in new issue
Block a user