UNPKG

1.27 kBJavaScriptView Raw
1'use strict';
2
3const AppError = require('../lib/appError');
4
5module.exports = {
6 /**
7 * Encode external id
8 * @param {string|number} number
9 * @param {?string} prefix
10 * @returns {string}
11 */
12 encode (number, prefix = '') {
13 const mod = number % 36;
14
15 if (Number.isNaN(mod) || String(number).length > 16 || Number(number) < 1) {
16 throw new AppError('Invalid input number');
17 }
18
19 let res = ((Number(number) + 9876543) * (73 - mod)).toString(30);
20 while (res.length % 3 !== 0) {
21 res = `0${res}`;
22 }
23
24 if (prefix) {
25 prefix = `${prefix}:`;
26 }
27 return prefix + mod.toString(36) + Buffer.from(res).toString('base64');
28 },
29
30 /**
31 * Decode external id
32 * @param {string} code
33 * @returns {number}
34 */
35 decode (code) {
36 if (code.includes(':')) {
37 [, code] = code.split(':');
38 }
39
40 const mod = parseInt(code[0], 36);
41 const ascii = Buffer.from(code.substr(1), 'base64').toString('ascii');
42 const number = (parseInt(ascii, 30) / (73 - mod)) - 9876543;
43
44 if (Math.round(number) !== number) {
45 throw new AppError('Invalid code');
46 }
47 return number;
48 }
49};