| 
									
										
										
										
											2020-10-27 11:27:17 +01:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  | const _ = require('lodash'); | 
					
						
							| 
									
										
										
										
											2021-08-17 19:25:14 +08:00
										 |  |  | const { getCommonPath } = require('./string-formatting'); | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-26 12:07:57 +02:00
										 |  |  | const getConfigUrls = (config, forAdminBuild = false) => { | 
					
						
							|  |  |  |   const serverConfig = config.get('server'); | 
					
						
							|  |  |  |   const adminConfig = config.get('admin'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  |   // Defines serverUrl value
 | 
					
						
							|  |  |  |   let serverUrl = _.get(serverConfig, 'url', ''); | 
					
						
							|  |  |  |   serverUrl = _.trim(serverUrl, '/ '); | 
					
						
							|  |  |  |   if (typeof serverUrl !== 'string') { | 
					
						
							|  |  |  |     throw new Error('Invalid server url config. Make sure the url is a string.'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (serverUrl.startsWith('http')) { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       serverUrl = _.trim(new URL(serverConfig.url).toString(), '/'); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       throw new Error( | 
					
						
							|  |  |  |         'Invalid server url config. Make sure the url defined in server.js is valid.' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else if (serverUrl !== '') { | 
					
						
							|  |  |  |     serverUrl = `/${serverUrl}`; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Defines adminUrl value
 | 
					
						
							| 
									
										
										
										
											2021-10-26 12:07:57 +02:00
										 |  |  |   let adminUrl = _.get(adminConfig, 'url', '/admin'); | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  |   adminUrl = _.trim(adminUrl, '/ '); | 
					
						
							|  |  |  |   if (typeof adminUrl !== 'string') { | 
					
						
							|  |  |  |     throw new Error('Invalid admin url config. Make sure the url is a non-empty string.'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (adminUrl.startsWith('http')) { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       adminUrl = _.trim(new URL(adminUrl).toString(), '/'); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       throw new Error('Invalid admin url config. Make sure the url defined in server.js is valid.'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     adminUrl = `${serverUrl}/${adminUrl}`; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Defines adminPath value
 | 
					
						
							|  |  |  |   let adminPath = adminUrl; | 
					
						
							|  |  |  |   if ( | 
					
						
							|  |  |  |     serverUrl.startsWith('http') && | 
					
						
							|  |  |  |     adminUrl.startsWith('http') && | 
					
						
							|  |  |  |     new URL(adminUrl).origin === new URL(serverUrl).origin && | 
					
						
							|  |  |  |     !forAdminBuild | 
					
						
							|  |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2021-08-17 19:25:14 +08:00
										 |  |  |     adminPath = adminUrl.replace(getCommonPath(serverUrl, adminUrl), ''); | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  |     adminPath = `/${_.trim(adminPath, '/')}`; | 
					
						
							|  |  |  |   } else if (adminUrl.startsWith('http')) { | 
					
						
							|  |  |  |     adminPath = new URL(adminUrl).pathname; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     serverUrl, | 
					
						
							|  |  |  |     adminUrl, | 
					
						
							|  |  |  |     adminPath, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  | const getAbsoluteUrl = | 
					
						
							|  |  |  |   (adminOrServer) => | 
					
						
							|  |  |  |   (config, forAdminBuild = false) => { | 
					
						
							|  |  |  |     const { serverUrl, adminUrl } = getConfigUrls(config, forAdminBuild); | 
					
						
							|  |  |  |     const url = adminOrServer === 'server' ? serverUrl : adminUrl; | 
					
						
							| 
									
										
										
										
											2020-05-28 11:38:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     if (url.startsWith('http')) { | 
					
						
							|  |  |  |       return url; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-05-28 11:17:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     const hostname = | 
					
						
							|  |  |  |       config.get('environment') === 'development' && | 
					
						
							|  |  |  |       ['127.0.0.1', '0.0.0.0'].includes(config.get('server.host')) | 
					
						
							|  |  |  |         ? 'localhost' | 
					
						
							|  |  |  |         : config.get('server.host'); | 
					
						
							| 
									
										
										
										
											2020-05-28 11:17:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     return `http://${hostname}:${config.get('server.port')}${url}`; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-05-28 11:17:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  | module.exports = { | 
					
						
							|  |  |  |   getConfigUrls, | 
					
						
							| 
									
										
										
										
											2020-05-28 11:17:59 +02:00
										 |  |  |   getAbsoluteAdminUrl: getAbsoluteUrl('admin'), | 
					
						
							|  |  |  |   getAbsoluteServerUrl: getAbsoluteUrl('server'), | 
					
						
							| 
									
										
										
										
											2020-05-08 13:50:00 +02:00
										 |  |  | }; |