File tree 5 files changed +41
-2
lines changed
5 files changed +41
-2
lines changed Original file line number Diff line number Diff line change @@ -43,6 +43,12 @@ export interface Platform {
43
43
/** Converts a binary string to a Base64 encoded string. */
44
44
btoa ( raw : string ) : string ;
45
45
46
+ /**
47
+ * Generates `nBytes` of random bytes. If `nBytes` is negative, an empty array
48
+ * will be returned.
49
+ */
50
+ randomBytes ( nBytes : number ) : Uint8Array ;
51
+
46
52
/** The Platform's 'window' implementation or null if not available. */
47
53
readonly window : Window | null ;
48
54
Original file line number Diff line number Diff line change @@ -67,4 +67,14 @@ export class BrowserPlatform implements Platform {
67
67
btoa ( raw : string ) : string {
68
68
return btoa ( raw ) ;
69
69
}
70
+
71
+ randomBytes ( nBytes : number ) : Uint8Array {
72
+ if ( nBytes <= 0 ) {
73
+ return new Uint8Array ( ) ;
74
+ }
75
+
76
+ const v = new Uint8Array ( nBytes ) ;
77
+ crypto . getRandomValues ( v ) ;
78
+ return v ;
79
+ }
70
80
}
Original file line number Diff line number Diff line change 15
15
* limitations under the License.
16
16
*/
17
17
18
+ import { randomBytes } from 'crypto' ;
18
19
import * as util from 'util' ;
19
20
20
21
import { DatabaseId , DatabaseInfo } from '../core/database_info' ;
@@ -74,4 +75,12 @@ export class NodePlatform implements Platform {
74
75
btoa ( raw : string ) : string {
75
76
return new Buffer ( raw , 'binary' ) . toString ( 'base64' ) ;
76
77
}
78
+
79
+ randomBytes ( nBytes : number ) : Uint8Array {
80
+ if ( nBytes <= 0 ) {
81
+ return new Uint8Array ( ) ;
82
+ }
83
+
84
+ return randomBytes ( nBytes ) ;
85
+ }
77
86
}
Original file line number Diff line number Diff line change 16
16
*/
17
17
18
18
import { assert } from './assert' ;
19
+ import { PlatformSupport } from '../platform/platform' ;
19
20
20
21
export type EventHandler < E > = ( value : E ) => void ;
21
22
export interface Indexable {
@@ -28,8 +29,17 @@ export class AutoId {
28
29
const chars =
29
30
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' ;
30
31
let autoId = '' ;
31
- for ( let i = 0 ; i < 20 ; i ++ ) {
32
- autoId += chars . charAt ( Math . floor ( Math . random ( ) * chars . length ) ) ;
32
+ while ( autoId . length < 20 ) {
33
+ const bytes = PlatformSupport . getPlatform ( ) . randomBytes ( 40 ) ;
34
+ bytes . forEach ( b => {
35
+ // Length of `chars` is 62. We only take bytes between 0 and 62*4-1
36
+ // (both inclusive). The value is then evenly mapped to indices of `char`
37
+ // via a modulo operation.
38
+ const maxValue = 62 * 4 - 1 ;
39
+ if ( autoId . length < 20 && b <= maxValue ) {
40
+ autoId += chars . charAt ( b % 62 ) ;
41
+ }
42
+ } ) ;
33
43
}
34
44
assert ( autoId . length === 20 , 'Invalid auto ID: ' + autoId ) ;
35
45
return autoId ;
Original file line number Diff line number Diff line change @@ -262,6 +262,10 @@ export class TestPlatform implements Platform {
262
262
btoa ( raw : string ) : string {
263
263
return this . basePlatform . btoa ( raw ) ;
264
264
}
265
+
266
+ randomBytes ( nBytes : number ) : Uint8Array {
267
+ return this . basePlatform . randomBytes ( nBytes ) ;
268
+ }
265
269
}
266
270
267
271
/** Returns true if we are running under Node. */
You can’t perform that action at this time.
0 commit comments