commit a4a8dacfc0cd92883f23e29064b82425df2d1102
parent 10abf765b782549d01822dddd7f6e22a82489115
Author: Jared Tobin <jared@jtobin.io>
Date: Fri, 5 Oct 2018 15:29:20 +1300
Merge pull request #5 from urbit/jt-add-patq
Add @q encoding
Diffstat:
3 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
@@ -1,6 +1,6 @@
{
"name": "ob-js",
- "version": "1.2.0",
+ "version": "1.3.0",
"description": "utilities to convert urbit ship names back and forth between @p and @ud",
"main": "dist/index.js",
"scripts": {
diff --git a/src/index.js b/src/index.js
@@ -3,7 +3,8 @@
*/
const bnjs = require('bn.js')
-const { reduce, isUndefined, isString, every, map } = require('lodash')
+const { reduce, concat, chunk, isUndefined,
+ isString, every, map } = require('lodash')
const raku = [
3077398253,
@@ -379,6 +380,25 @@ const patp = (n) => {
: loop(sxz, zero, ''))
}
+// bignum patq
+const patq = (n) => {
+ const buff = n.toArrayLike(Buffer)
+
+ const chunked =
+ buff.length % 2 === 1 && buff.length !== 1
+ ? concat([[buff[0]]], chunk(buff.slice(1), 2))
+ : chunk(buff, 2)
+
+ const name = byts =>
+ isUndefined(byts[1])
+ ? getSuffix(byts[0])
+ : getPrefix(byts[0]) + getSuffix(byts[1])
+
+ return chunked.reduce((acc, elem) =>
+ acc + (acc === '~' ? '' : '-') + name(elem), '~')
+}
+
+
// returns the class of a ship from it's name
const tierOfpatp = name => {
const l = len(patp2arr(name))
@@ -523,6 +543,7 @@ module.exports = {
isValidName: isValidName,
patp: patp,
+ patq: patq,
sein: sein,
_clan: clan,
diff --git a/test/core.test.js b/test/core.test.js
@@ -131,6 +131,30 @@ test('patp correctly encodes a big hex string as @p', () => {
expect(ob.patp(input)).toBe(expected);
});
+test('patq correctly encodes 0 as @q', () => {
+ let input = new bnjs('0');
+ let expected = '~zod';
+ expect(ob.patq(input)).toBe(expected);
+});
+
+test('patq correctly encodes 0x102 as @q', () => {
+ let input = new bnjs('0102', 'hex');
+ let expected = '~marbud';
+ expect(ob.patq(input)).toBe(expected);
+});
+
+test('patq correctly encodes 0x10102 as @q', () => {
+ let input = new bnjs('010102', 'hex');
+ let expected = '~nec-marbud';
+ expect(ob.patq(input)).toBe(expected);
+});
+
+test('patq correctly encodes 0x1010101010101010102 as @q', () => {
+ let input = new bnjs('01010101010101010102', 'hex');
+ let expected = '~marnec-marnec-marnec-marnec-marbud';
+ expect(ob.patq(input)).toBe(expected);
+});
+
test('clan works as expected', () => {
expect(ob._clan(new bnjs(0))).toBe('czar');
expect(ob._clan(new bnjs(255))).toBe('czar');