1 | 'use strict';
|
2 |
|
3 | const AppError = require('../lib/appError');
|
4 |
|
5 | module.exports = {
|
6 | |
7 |
|
8 |
|
9 |
|
10 |
|
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 |
|
32 |
|
33 |
|
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 | };
|