forked from mcollina/hyperid
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhyperid.js
More file actions
85 lines (67 loc) · 1.79 KB
/
Copy pathhyperid.js
File metadata and controls
85 lines (67 loc) · 1.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'use strict'
const uuid = require('uuid/v4')
const parser = require('uuid-parse')
const maxInt = Math.pow(2, 31) - 1
function hyperid (opts) {
var fixedLength = false
var urlSafe = false
if (typeof opts === 'boolean') {
fixedLength = opts
} else {
opts = opts || {}
urlSafe = !!opts.urlSafe
fixedLength = !!opts.fixedLength
}
var count = 0
generate.uuid = uuid()
var id = baseId(generate.uuid, urlSafe)
function generate () {
var result = fixedLength
? id + pad(count++)
: id + count++
if (count === maxInt) {
generate.uuid = uuid()
id = baseId(generate.uuid, urlSafe) // rebase
count = 0
}
return result
}
generate.decode = decode
return generate
}
function pad (count) {
if (count < 10) return '000000000' + count
if (count < 100) return '00000000' + count
if (count < 1000) return '0000000' + count
if (count < 10000) return '000000' + count
if (count < 100000) return '00000' + count
if (count < 1000000) return '0000' + count
if (count < 10000000) return '000' + count
if (count < 100000000) return '00' + count
if (count < 1000000000) return '0' + count
}
function baseId (id, urlSafe) {
var base64Id = Buffer.from(parser.parse(id)).toString('base64')
if (urlSafe) {
return base64Id.replace(/\+/g, '_').replace(/\//g, '-').replace(/==$/, '-')
}
return base64Id.replace(/==$/, '/')
}
function decode (id, opts) {
opts = opts || {}
var urlSafe = !!opts.urlSafe
if (urlSafe) {
id = id.replace(/-/g, '/').replace(/_/g, '+')
}
const a = id.match(/(.*)+\/(\d+)+$/)
if (!a) {
return null
}
const result = {
uuid: parser.unparse(Buffer.from(a[1] + '==', 'base64')),
count: parseInt(a[2])
}
return result
}
module.exports = hyperid
module.exports.decode = decode