@@ -11,6 +11,7 @@ import packageJson from '../../package.json'
1111import { Serializable } from 'child_process'
1212import { Settings } from '../@types/settings'
1313import { SettingsStatic } from '../utils/settings'
14+ import { BANNER_WIDTH , centre , RELAY_BANNER_LINES } from '../utils/banner'
1415import { shutdownMetricsTelemetry } from '../telemetry/metrics'
1516import { OperatorNotificationEventType } from '../@types/operator-notifications'
1617import { RedisRelayBroadcastFanout } from '../relay-broadcast/redis-relay-broadcast-fanout'
@@ -53,30 +54,27 @@ export class App implements IRunnable {
5354 public run ( ) : void {
5455 const settings = this . settings ( )
5556 this . watchers = SettingsStatic . watchSettings ( )
56- logger . info ( `
57- ███▄ █ ▒█████ ██████ ▄▄▄█████▓ ██▀███ ▓█████ ▄▄▄ ███▄ ▄███▓
58- ██ ▀█ █ ▒██▒ ██▒▒██ ▒ ▓ ██▒ ▓▒▓██ ▒ ██▒▓█ ▀▒████▄ ▓██▒▀█▀ ██▒
59- ▓██ ▀█ ██▒▒██░ ██▒░ ▓██▄ ▒ ▓██░ ▒░▓██ ░▄█ ▒▒███ ▒██ ▀█▄ ▓██ ▓██░
60- ▓██▒ ▐▌██▒▒██ ██░ ▒ ██▒░ ▓██▓ ░ ▒██▀▀█▄ ▒▓█ ▄░██▄▄▄▄██ ▒██ ▒██
61- ▒██░ ▓██░░ ████▓▒░▒██████▒▒ ▒██▒ ░ ░██▓ ▒██▒░▒████▒▓█ ▓██▒▒██▒ ░██▒
62- ░ ▒░ ▒ ▒ ░ ▒░▒░▒░ ▒ ▒▓▒ ▒ ░ ▒ ░░ ░ ▒▓ ░▒▓░░░ ▒░ ░▒▒ ▓▒█░░ ▒░ ░ ░
63- ░ ░░ ░ ▒░ ░ ▒ ▒░ ░ ░▒ ░ ░ ░ ░▒ ░ ▒░ ░ ░ ░ ▒ ▒▒ ░░ ░ ░
64- ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ░ ░ ▒ ░ ░
65- ░ ░ ░ ░ ░ ░ ░ ░ ░ ░` )
66- const width = 74
57+ // Plain text on stdout, not through the logger: in JSON output every line of
58+ // the logo arrived as its own record with the newlines escaped. A banner is
59+ // read by a person; the structured line below it carries the same facts for
60+ // anything that parses the log.
61+ const logLine = ( text : string ) => {
62+ this . process . stdout . write ( ` ${ text } \n` )
63+ }
64+
65+ logLine ( RELAY_BANNER_LINES . join ( '\n' ) )
66+
67+ const width = BANNER_WIDTH
6768 const torHiddenServicePort = process . env . HIDDEN_SERVICE_PORT ? Number ( process . env . HIDDEN_SERVICE_PORT ) : 80
6869 const port = process . env . RELAY_PORT ? Number ( process . env . RELAY_PORT ) : 8008
6970
70- const logCentered = ( input : string , width : number ) => {
71- const start = Math . max ( 0 , ( width - input . length ) >> 1 )
72- logger . info ( ' ' . repeat ( start ) , input )
73- }
74- logCentered ( `v${ packageJson . version } ` , width )
75- logCentered ( `NIPs implemented: ${ packageJson . supportedNips } ` , width )
71+ const logCentered = ( input : string ) => logLine ( centre ( input , width ) )
72+ logCentered ( `v${ packageJson . version } ` )
73+ logCentered ( `NIPs implemented: ${ packageJson . supportedNips } ` )
7674 const paymentsEnabled = pathEq ( [ 'payments' , 'enabled' ] , true , settings )
77- logCentered ( `Pay-to-relay ${ paymentsEnabled ? 'enabled' : 'disabled' } ` , width )
75+ logCentered ( `Pay-to-relay ${ paymentsEnabled ? 'enabled' : 'disabled' } ` )
7876 if ( paymentsEnabled ) {
79- logCentered ( `Payments provider: ${ path ( [ 'payments' , 'processor' ] , settings ) } ` , width )
77+ logCentered ( `Payments provider: ${ path ( [ 'payments' , 'processor' ] , settings ) } ` )
8078 }
8179
8280 if (
@@ -98,7 +96,7 @@ export class App implements IRunnable {
9896 this . process . exit ( 1 )
9997 return
10098 }
101- logCentered ( `Event store: ${ eventStoreBackend } ` , width )
99+ logCentered ( `Event store: ${ eventStoreBackend } ` )
102100
103101 const workerCount = process . env . WORKER_COUNT
104102 ? Number ( process . env . WORKER_COUNT )
@@ -117,25 +115,40 @@ export class App implements IRunnable {
117115 WORKER_INDEX : i . toString ( ) ,
118116 } )
119117 }
120- logCentered ( `${ workerCount } client workers started` , width )
118+ logCentered ( `${ workerCount } client workers started` )
119+
120+ // The facts the banner shows, in one record, for anything that reads the log
121+ // rather than looks at it.
122+ logger . info (
123+ {
124+ version : packageJson . version ,
125+ supportedNips : packageJson . supportedNips ,
126+ payments : paymentsEnabled ,
127+ provider : paymentsEnabled ? path ( [ 'payments' , 'processor' ] , settings ) : undefined ,
128+ eventStore : eventStoreBackend ,
129+ clientWorkers : workerCount ,
130+ relayPort : port ,
131+ } ,
132+ 'relay started' ,
133+ )
121134
122135 createWorker ( {
123136 WORKER_TYPE : 'maintenance' ,
124137 } )
125138
126- logCentered ( '1 maintenance worker started' , width )
139+ logCentered ( '1 maintenance worker started' )
127140 if ( Array . isArray ( settings ?. mirroring ?. static ) && settings . mirroring . static . length ) {
128141 logger . warn (
129142 'mirroring.static is no longer supported and is ignored; sync with another relay over NIP-77 (negentropy) instead' ,
130143 )
131- logCentered ( 'mirroring.static is no longer supported (ignored)' , width )
144+ logCentered ( 'mirroring.static is no longer supported (ignored)' )
132145 }
133146
134147 if ( settings . nip66 ?. enabled ) {
135148 createWorker ( {
136149 WORKER_TYPE : 'relay-monitor' ,
137150 } )
138- logCentered ( '1 relay-monitor worker started' , width )
151+ logCentered ( '1 relay-monitor worker started' )
139152 }
140153
141154 const dvmWorkers = settings ?. dvm ?. workers
@@ -147,7 +160,7 @@ export class App implements IRunnable {
147160 DVM_WORKER_INDEX : i . toString ( ) ,
148161 } )
149162 }
150- logCentered ( `${ dvmWorkers . length } dvm-orchestrator worker started` , width )
163+ logCentered ( `${ dvmWorkers . length } dvm-orchestrator worker started` )
151164 }
152165
153166 logger ( 'settings: %O' , settings )
@@ -159,7 +172,7 @@ export class App implements IRunnable {
159172 . start ( ( message ) => this . onRelayBroadcastFromPeer ( message ) )
160173 . then ( ( ) => {
161174 setRelayBroadcastFanoutReady ( true )
162- logCentered ( 'Relay broadcast fan-out enabled (Redis stream)' , width )
175+ logCentered ( 'Relay broadcast fan-out enabled (Redis stream)' )
163176 } )
164177 . catch ( ( error ) => {
165178 setRelayBroadcastFanoutReady ( false )
@@ -177,10 +190,10 @@ export class App implements IRunnable {
177190 const host = `${ hostname ( ) } :${ port } `
178191 addOnion ( torHiddenServicePort , host ) . then (
179192 ( value ) => {
180- logCentered ( `Tor hidden service: ${ value } :${ torHiddenServicePort } ` , width )
193+ logCentered ( `Tor hidden service: ${ value } :${ torHiddenServicePort } ` )
181194 } ,
182195 ( ) => {
183- logCentered ( 'Tor hidden service: disabled' , width )
196+ logCentered ( 'Tor hidden service: disabled' )
184197 } ,
185198 )
186199 }
0 commit comments