11#!/usr/bin/env node
22
33/**
4- * Generate Secure Secrets for TelemetryFlow Core
5- *
4+ * Generate Secure Secrets for TelemetryFlow SDK
5+ *
66 * Usage:
7- * node scripts/generate-secrets.js
8- * node scripts/generate-secrets.js --length 64
9- * node scripts/generate-secrets.js --format hex
7+ * node scripts/generate-secrets.js # Generate all secrets
8+ * node scripts/generate-secrets.js --api-keys # Generate only API keys
9+ * node scripts/generate-secrets.js --jwt # Generate only JWT secrets
10+ * node scripts/generate-secrets.js --length 64 # Custom length
11+ * node scripts/generate-secrets.js --format hex # Custom format
12+ * node scripts/generate-secrets.js --env # Output as .env format only
1013 */
1114
1215const crypto = require ( 'crypto' ) ;
1316
17+ // Parse arguments
1418const args = process . argv . slice ( 2 ) ;
1519let length = 32 ;
1620let format = 'base64' ;
21+ let generateApiKeys = true ;
22+ let generateJwtSecrets = true ;
23+ let envOnly = false ;
1724
1825for ( let i = 0 ; i < args . length ; i ++ ) {
19- if ( args [ i ] === '--length' && args [ i + 1 ] ) {
20- length = parseInt ( args [ i + 1 ] ) ;
21- i ++ ;
22- } else if ( args [ i ] === '--format' && args [ i + 1 ] ) {
23- format = args [ i + 1 ] ;
24- i ++ ;
25- } else if ( args [ i ] === '--help' || args [ i ] === '-h' ) {
26- console . log ( `
27- TelemetryFlow Core - Secure Secret Generator
26+ switch ( args [ i ] ) {
27+ case '--length' :
28+ if ( args [ i + 1 ] ) {
29+ length = parseInt ( args [ i + 1 ] ) ;
30+ i ++ ;
31+ }
32+ break ;
33+ case '--format' :
34+ if ( args [ i + 1 ] ) {
35+ format = args [ i + 1 ] ;
36+ i ++ ;
37+ }
38+ break ;
39+ case '--api-keys' :
40+ generateApiKeys = true ;
41+ generateJwtSecrets = false ;
42+ break ;
43+ case '--jwt' :
44+ generateApiKeys = false ;
45+ generateJwtSecrets = true ;
46+ break ;
47+ case '--env' :
48+ envOnly = true ;
49+ break ;
50+ case '--help' :
51+ case '-h' :
52+ console . log ( `
53+ TelemetryFlow SDK - Secure Secret Generator
2854
2955Usage:
3056 node scripts/generate-secrets.js [options]
3157
3258Options:
3359 --length <number> Length in bytes (default: 32)
3460 --format <format> Output format: base64, hex, base64url (default: base64)
61+ --api-keys Generate only TelemetryFlow API keys
62+ --jwt Generate only JWT/Session secrets
63+ --env Output in .env format only (no decorations)
3564 --help, -h Show this help
3665
3766Examples:
38- node scripts/generate-secrets.js
39- node scripts/generate-secrets.js --length 64
40- node scripts/generate-secrets.js --format hex
67+ node scripts/generate-secrets.js # Generate all secrets
68+ node scripts/generate-secrets.js --api-keys # API keys only
69+ node scripts/generate-secrets.js --jwt --length 64 # JWT with 64 bytes
70+ node scripts/generate-secrets.js --env # .env format output
4171` ) ;
42- process . exit ( 0 ) ;
72+ process . exit ( 0 ) ;
4373 }
4474}
4575
76+ // Validation
4677if ( length < 32 ) {
47- console . error ( '❌ Error: Length must be at least 32 bytes' ) ;
78+ console . error ( 'Error: Length must be at least 32 bytes' ) ;
4879 process . exit ( 1 ) ;
4980}
5081
5182const validFormats = [ 'base64' , 'hex' , 'base64url' ] ;
5283if ( ! validFormats . includes ( format ) ) {
53- console . error ( `❌ Error: Format must be one of: ${ validFormats . join ( ', ' ) } ` ) ;
84+ console . error ( `Error: Format must be one of: ${ validFormats . join ( ', ' ) } ` ) ;
5485 process . exit ( 1 ) ;
5586}
5687
88+ // Secret generation functions
5789function generateSecret ( bytes , encoding ) {
5890 const buffer = crypto . randomBytes ( bytes ) ;
5991 if ( encoding === 'base64url' ) {
@@ -65,38 +97,108 @@ function generateSecret(bytes, encoding) {
6597 return buffer . toString ( encoding ) ;
6698}
6799
68- const jwtSecret = generateSecret ( length , format ) ;
69- const sessionSecret = generateSecret ( length , format ) ;
70-
71- console . log ( '\n🔐 TelemetryFlow Core - Secret Generator' ) ;
72- console . log ( '=========================================' ) ;
73- console . log ( `Length: ${ length } bytes | Format: ${ format } \n` ) ;
74-
75- console . log ( 'Generated Secrets:' ) ;
76- console . log ( '------------------\n' ) ;
77- console . log ( 'JWT_SECRET:' ) ;
78- console . log ( ` ${ jwtSecret } \n` ) ;
79- console . log ( 'SESSION_SECRET:' ) ;
80- console . log ( ` ${ sessionSecret } \n` ) ;
81-
82- console . log ( '.env Format:' ) ;
83- console . log ( '------------' ) ;
84- console . log ( `JWT_SECRET=${ jwtSecret } ` ) ;
85- console . log ( `JWT_EXPIRES_IN=24h` ) ;
86- console . log ( `SESSION_SECRET=${ sessionSecret } \n` ) ;
87-
88- console . log ( 'Docker Example:' ) ;
89- console . log ( '---------------' ) ;
90- console . log ( `docker run -d \\
91- -e JWT_SECRET="${ jwtSecret } " \\
92- -e SESSION_SECRET="${ sessionSecret } " \\
93- telemetryflow-core:latest\n` ) ;
94-
95- console . log ( 'Security Tips:' ) ;
96- console . log ( '--------------' ) ;
97- console . log ( '✓ Never commit secrets to git' ) ;
98- console . log ( '✓ Use different secrets per environment' ) ;
99- console . log ( '✓ Rotate secrets every 90 days' ) ;
100- console . log ( '✓ Store in secrets manager (AWS Secrets Manager, etc.)\n' ) ;
100+ function generateHexString ( length ) {
101+ return crypto . randomBytes ( Math . ceil ( length / 2 ) ) . toString ( 'hex' ) . slice ( 0 , length ) ;
102+ }
103+
104+ function generateApiKeyId ( ) {
105+ return `tfk_${ generateHexString ( 32 ) } ` ;
106+ }
107+
108+ function generateApiKeySecret ( ) {
109+ return `tfs_${ generateHexString ( 64 ) } ` ;
110+ }
111+
112+ // Generate secrets
113+ const secrets = { } ;
114+
115+ if ( generateApiKeys ) {
116+ secrets . TELEMETRYFLOW_API_KEY_ID = generateApiKeyId ( ) ;
117+ secrets . TELEMETRYFLOW_API_KEY_SECRET = generateApiKeySecret ( ) ;
118+ }
119+
120+ if ( generateJwtSecrets ) {
121+ secrets . JWT_SECRET = generateSecret ( length , format ) ;
122+ secrets . JWT_REFRESH_SECRET = generateSecret ( length , format ) ;
123+ secrets . SESSION_SECRET = generateSecret ( length , format ) ;
124+ }
125+
126+ // Output
127+ if ( envOnly ) {
128+ // Simple .env format output
129+ if ( generateApiKeys ) {
130+ console . log ( '# TelemetryFlow API Keys' ) ;
131+ console . log ( `TELEMETRYFLOW_API_KEY_ID=${ secrets . TELEMETRYFLOW_API_KEY_ID } ` ) ;
132+ console . log ( `TELEMETRYFLOW_API_KEY_SECRET=${ secrets . TELEMETRYFLOW_API_KEY_SECRET } ` ) ;
133+ }
134+ if ( generateJwtSecrets ) {
135+ if ( generateApiKeys ) console . log ( '' ) ;
136+ console . log ( '# JWT & Session Secrets' ) ;
137+ console . log ( `JWT_SECRET=${ secrets . JWT_SECRET } ` ) ;
138+ console . log ( `JWT_REFRESH_SECRET=${ secrets . JWT_REFRESH_SECRET } ` ) ;
139+ console . log ( `JWT_EXPIRATION=24h` ) ;
140+ console . log ( `JWT_REFRESH_EXPIRATION=168h` ) ;
141+ console . log ( `SESSION_SECRET=${ secrets . SESSION_SECRET } ` ) ;
142+ }
143+ } else {
144+ // Decorated output
145+ console . log ( '\n=============================================' ) ;
146+ console . log ( ' TelemetryFlow SDK - Secret Generator' ) ;
147+ console . log ( '=============================================\n' ) ;
148+
149+ if ( generateApiKeys ) {
150+ console . log ( 'TelemetryFlow API Keys:' ) ;
151+ console . log ( '-----------------------' ) ;
152+ console . log ( ` API Key ID: ${ secrets . TELEMETRYFLOW_API_KEY_ID } ` ) ;
153+ console . log ( ` API Key Secret: ${ secrets . TELEMETRYFLOW_API_KEY_SECRET } ` ) ;
154+ console . log ( '' ) ;
155+ }
156+
157+ if ( generateJwtSecrets ) {
158+ console . log ( `JWT & Session Secrets (${ length } bytes, ${ format } ):` )
159+ console . log ( '----------------------------------------------' ) ;
160+ console . log ( ` JWT Secret: ${ secrets . JWT_SECRET } ` ) ;
161+ console . log ( ` JWT Refresh Secret: ${ secrets . JWT_REFRESH_SECRET } ` ) ;
162+ console . log ( ` Session Secret: ${ secrets . SESSION_SECRET } ` ) ;
163+ console . log ( '' ) ;
164+ }
165+
166+ console . log ( '.env Format:' ) ;
167+ console . log ( '------------' ) ;
168+ if ( generateApiKeys ) {
169+ console . log ( `TELEMETRYFLOW_API_KEY_ID=${ secrets . TELEMETRYFLOW_API_KEY_ID } ` ) ;
170+ console . log ( `TELEMETRYFLOW_API_KEY_SECRET=${ secrets . TELEMETRYFLOW_API_KEY_SECRET } ` ) ;
171+ }
172+ if ( generateJwtSecrets ) {
173+ console . log ( `JWT_SECRET=${ secrets . JWT_SECRET } ` ) ;
174+ console . log ( `JWT_REFRESH_SECRET=${ secrets . JWT_REFRESH_SECRET } ` ) ;
175+ console . log ( `JWT_EXPIRATION=24h` ) ;
176+ console . log ( `JWT_REFRESH_EXPIRATION=168h` ) ;
177+ console . log ( `SESSION_SECRET=${ secrets . SESSION_SECRET } ` ) ;
178+ }
179+ console . log ( '' ) ;
180+
181+ console . log ( 'Docker Example:' ) ;
182+ console . log ( '---------------' ) ;
183+ const dockerEnvs = [ ] ;
184+ if ( generateApiKeys ) {
185+ dockerEnvs . push ( ` -e TELEMETRYFLOW_API_KEY_ID="${ secrets . TELEMETRYFLOW_API_KEY_ID } "` ) ;
186+ dockerEnvs . push ( ` -e TELEMETRYFLOW_API_KEY_SECRET="${ secrets . TELEMETRYFLOW_API_KEY_SECRET } "` ) ;
187+ }
188+ if ( generateJwtSecrets ) {
189+ dockerEnvs . push ( ` -e JWT_SECRET="${ secrets . JWT_SECRET } "` ) ;
190+ dockerEnvs . push ( ` -e SESSION_SECRET="${ secrets . SESSION_SECRET } "` ) ;
191+ }
192+ console . log ( `docker run -d \\\n${ dockerEnvs . join ( ' \\\n' ) } \\` ) ;
193+ console . log ( ' TelemetryFlow SDK:latest\n' ) ;
194+
195+ console . log ( 'Security Tips:' ) ;
196+ console . log ( '--------------' ) ;
197+ console . log ( '- Never commit secrets to git' ) ;
198+ console . log ( '- Use different secrets per environment' ) ;
199+ console . log ( '- Rotate secrets every 90 days' ) ;
200+ console . log ( '- Store in secrets manager (AWS Secrets Manager, HashiCorp Vault, etc.)' ) ;
201+ console . log ( '' ) ;
202+ }
101203
102204process . exit ( 0 ) ;
0 commit comments