diff --git a/CHANGELOG.md b/CHANGELOG.md index af4f8c1..46946fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 1.1.0 + +added support for base 58 + ## 1.0.0 initial release diff --git a/README.md b/README.md index 1144d48..85743d3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # @sapphirecode/encoding-helper -version: 1.0.x +version: 1.1.x Converting strings between different encodings @@ -21,11 +21,26 @@ const encoding = require('@sapphirecode/encoding-helper'); const hex = encoding.to_hex('abc'); // convert any encoding to hex, default is utf-8 const b64 = encoding.to_b64(hex, 'hex'); // convert any encoding to base64, default is utf-8 +const b58 = encoding.to_b58(hex, 'hex'); // convert any encoding to base58, default is utf-8 const utf8 = encoding.to_utf8(hex, 'hex'); // convert any encoding to utf-8, no default const hexn = encoding.num_to_hex(10); // convert a number to hex const num = encoding.hex_to_num('a'); // convert hex to a number ``` +supported input encodings: + +- default supported by buffer: + - ascii + - base64 + - binary + - hex + - latin1 + - ucs-2 + - utf-8 + - utf16le +- additional encodings: + - base58 + ## License MIT © Timo Hocker diff --git a/index.js b/index.js index b1c9871..c32a3c7 100644 --- a/index.js +++ b/index.js @@ -6,10 +6,18 @@ */ -// @ts-nocheck /* eslint-disable no-magic-numbers */ 'use strict'; +const b58 = require ('b58'); + +function get_buffer (str, encoding) { + if (encoding === 'base58') + return b58.decode (str); + + return Buffer.from (str, encoding); +} + /** * encode a string to base64 * @@ -18,10 +26,22 @@ * @returns {string} base64 */ function to_b64 (str, encoding = '') { - const buf = Buffer.from (str, encoding); + const buf = get_buffer (str, encoding); return buf.toString ('base64'); } +/** + * encode a string to base58 + * + * @param {string} str string to encode + * @param {string} encoding encoding the string is in + * @returns {string} base58 + */ +function to_b58 (str, encoding = '') { + const buf = get_buffer (str, encoding); + return b58.encode (buf); +} + /** * encode a string to utf-8 * @@ -30,7 +50,7 @@ function to_b64 (str, encoding = '') { * @returns {string} utf-8 */ function to_utf8 (str, encoding) { - const buf = Buffer.from (str, encoding); + const buf = get_buffer (str, encoding); return buf.toString ('utf-8'); } @@ -42,7 +62,7 @@ function to_utf8 (str, encoding) { * @returns {string} hex */ function to_hex (str, encoding = '') { - const buf = Buffer.from (str, encoding); + const buf = get_buffer (str, encoding); return buf.toString ('hex'); } @@ -72,9 +92,9 @@ function hex_to_num (h) { module.exports = { to_b64, + to_b58, to_hex, to_utf8, num_to_hex, hex_to_num }; - diff --git a/package.json b/package.json index f72edea..6e2a989 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sapphirecode/encoding-helper", - "version": "1.0.51", + "version": "1.1.0", "main": "index.js", "author": { "name": "Timo Hocker", @@ -35,5 +35,8 @@ "LICENSE", "index.js", "index.d.ts" - ] + ], + "dependencies": { + "b58": "^4.0.3" + } } diff --git a/test/spec/b58.js b/test/spec/b58.js new file mode 100644 index 0000000..961147a --- /dev/null +++ b/test/spec/b58.js @@ -0,0 +1,62 @@ +'use strict'; + +const b58 = require ('b58'); + +// eslint-disable-next-line max-lines-per-function +describe ('b58', () => { + it ('should encode "Hello World!"', () => { + const enc = b58.encode (Buffer.from ('Hello World!', 'utf-8')); + expect (enc) + .toEqual ('2NEpo7TZRRrLZSi2U'); + }); + + it ('should encode "The quick brown fox.."', () => { + const enc = b58.encode (Buffer.from ( + 'The quick brown fox jumps over the lazy dog.', + 'utf-8' + )); + expect (enc) + .toEqual ('USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z'); + }); + + it ('should encode test hex string', () => { + const enc = b58.encode (Buffer.from ('0000287fb4cd', 'hex')); + expect (enc) + .toEqual ('11233QC4'); + }); + + it ('should decode "Hello World!"', () => { + const dec = b58.decode ('2NEpo7TZRRrLZSi2U') + .toString ('utf-8'); + expect (dec) + .toEqual ('Hello World!'); + }); + + it ('should decode "The quick brown fox.."', () => { + const dec = b58.decode ( + 'USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z' + ) + .toString ('utf-8'); + expect (dec) + .toEqual ('The quick brown fox jumps over the lazy dog.'); + }); + + it ('should decode test hex string', () => { + const dec = b58.decode ('11233QC4') + .toString ('hex'); + expect (dec) + .toEqual ('0000287fb4cd'); + }); + + it ('should encode any byte combination', () => { + for (let i = 0; i < 65536; i++) { + const buf = Buffer.alloc (2); + buf.writeUInt16BE (i); + const enc = b58.encode (buf); + const dec = b58.decode (enc) + .readUInt16BE (); + expect (dec) + .toEqual (i); + } + }); +}); diff --git a/test/spec/index.js b/test/spec/index.js index ecafec2..36cbd7b 100644 --- a/test/spec/index.js +++ b/test/spec/index.js @@ -24,12 +24,24 @@ describe ('encoding', () => { .toEqual ('Zm9v'); }); + it ('encoding to_b58', () => { + const hex = encoding.to_b58 ('foo'); + expect (hex) + .toEqual ('bQbp'); + }); + it ('encoding to_utf8', () => { const utf = encoding.to_utf8 ('Zm9v', 'base64'); expect (utf) .toEqual ('foo'); }); + it ('encoding to_utf8 from b58', () => { + const utf = encoding.to_utf8 ('bQbp', 'base58'); + expect (utf) + .toEqual ('foo'); + }); + it ('convert num to hex', () => { const res = encoding.num_to_hex (11); expect (res) @@ -54,4 +66,3 @@ describe ('encoding', () => { .toEqual (11); }); }); - diff --git a/yarn.lock b/yarn.lock index 4df94f0..f555651 100644 --- a/yarn.lock +++ b/yarn.lock @@ -489,11 +489,25 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +b58@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/b58/-/b58-4.0.3.tgz#852a28d804b4a5a60685f9b51706315145a48c36" + integrity sha512-VDtdiomm0ywbL8YzgevOZ9pcx6LuOZ3d9qYTPDcYUPf7dRYNA8wvK6epYy0FKMWIM5uaDwd3kWt1x+1S9scB1Q== + dependencies: + base-x "^3.0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base-x@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2148,6 +2162,11 @@ rxjs@^6.6.0, rxjs@~6.6.0: dependencies: tslib "^1.9.0" +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"