@@ -14,6 +14,7 @@ import {
1414 saveToKvStorePluginEnabledVarName ,
1515 isSaveToKvStorePluginEnabled ,
1616 isSaveToKvStorePluginEnabledSet ,
17+ getDecryptionKey ,
1718} from '../env'
1819import packageJson from '../../package.json'
1920import { env } from 'fastly:env'
@@ -42,51 +43,50 @@ function buildHeaders(styleNonce: string): Headers {
4243
4344function createVersionElement ( ) : string {
4445 const fastlyServiceVersion = env ( 'FASTLY_SERVICE_VERSION' )
45- return `
46- <span>
47- ℹ️ Integration version: ${ packageJson . version }
48- </span>
49- <span>
50- ℹ️ Fastly Compute Service version: ${ fastlyServiceVersion }
51- </span>
46+ let result = ''
47+ result += '<ul>'
48+ result += `
49+ <li>
50+ ℹ️ Integration version: <strong>${ packageJson . version } </strong>
51+ </li>
52+ <li>
53+ ℹ️ Fastly Compute Service version: <strong>${ fastlyServiceVersion } </strong>
54+ </li>
5255 `
53- }
54-
55- function createBackendCheckElements ( ) : string {
56- const resultApi = Backend . exists ( 'api.fpjs.io' )
57- const europeResultApi = Backend . exists ( 'eu.api.fpjs.io' )
58- const asiaResultApi = Backend . exists ( 'ap.api.fpjs.io' )
59- const fpcdnApi = Backend . exists ( 'fpcdn.io' )
6056
61- if ( resultApi && europeResultApi && asiaResultApi && fpcdnApi ) {
62- return '<span>✅ Integration setup supports all ingress regions and agent download endpoint.</span>'
63- }
57+ result += getBackendsInformation ( )
58+ result += '</ul>'
6459
65- let result = ''
60+ return result
61+ }
6662
67- if ( ! fpcdnApi ) {
68- result += '<span>⚠️ Your integration is missing "fpcdn.io" backend host.</span>'
63+ function getBackendsInformation ( ) : string {
64+ let information = ''
65+ if ( ! Backend . exists ( 'fpcdn.io' ) ) {
66+ information += '<li>⚠️ Your integration is missing "fpcdn.io" backend host.</li>'
6967 }
7068
71- if ( ! resultApi && ! europeResultApi && ! asiaResultApi ) {
72- result +=
73- '<span>⚠️ At least one of the backends "api.fpjs.io", "eu.api.fpjs.io", or "ap.api.fpjs.io" must exist.</span>'
69+ const usResultBackend = Backend . exists ( 'api.fpjs.io' )
70+ const euResultBackend = Backend . exists ( 'eu.api.fpjs.io' )
71+ const apResultBackend = Backend . exists ( 'ap.api.fpjs.io' )
72+ const supportedRegions = [ ]
73+ if ( usResultBackend ) {
74+ supportedRegions . push ( 'US' )
75+ }
76+ if ( euResultBackend ) {
77+ supportedRegions . push ( 'EU' )
78+ }
79+ if ( apResultBackend ) {
80+ supportedRegions . push ( 'AP' )
81+ }
82+ if ( supportedRegions . length === 0 ) {
83+ information +=
84+ '<li>⚠️ Your integration is missing backend hosts for <a href="https://dev.fingerprint.com/docs/regions">region support</a>. Please add at least one of the backends "api.fpjs.io", "eu.api.fpjs.io", or "ap.api.fpjs.io"</li>'
7485 } else {
75- const supportedRegions = [ ]
76- if ( resultApi ) {
77- supportedRegions . push ( 'US' )
78- }
79- if ( europeResultApi ) {
80- supportedRegions . push ( 'EU' )
81- }
82- if ( asiaResultApi ) {
83- supportedRegions . push ( 'AP' )
84- }
85- if ( supportedRegions . length > 0 ) {
86- result += `<span>⚠️ Integration is configured for these regions only: ${ supportedRegions . join ( ', ' ) } .</span>`
87- }
86+ information += `<li>ℹ️ Integration is configured for these <a href="https://dev.fingerprint.com/docs/regions">regions</a>: <strong>${ supportedRegions . join ( ', ' ) } </strong></li>`
8887 }
89- return result
88+
89+ return information
9090}
9191
9292function isValidBase64 ( str : string | null | undefined ) : boolean {
@@ -122,59 +122,34 @@ async function checkKVStoreAvailability() {
122122
123123function createContactInformationElement ( ) : string {
124124 return `
125- <span >
126- ❓Please reach out our support via <a href='mailto:support@ fingerprint.com'> support@fingerprint.com </a> if you have any issues
127- </span >
125+ <p >
126+ ❓Please <a href="https:// fingerprint.com/support">reach out to our support team </a> if you have any issues.
127+ </p >
128128 `
129129}
130130
131131function buildConfigurationMessage ( config : ConfigurationStatus , env : IntegrationEnv ) : string {
132- const isDecryptionKeyAValidBase64 = isValidBase64 ( env . DECRYPTION_KEY )
133- const { isSet, label, required, value } = config
134-
135- let result = `<span>${ isSet ? '✅' : '⚠️' } <strong>${ label } </strong> (${ required ? 'REQUIRED' : 'OPTIONAL' } ) is ${ isSet ? '' : 'not ' } set.</span>`
136-
137- if ( required && ! isSet && config . message ) {
138- result += `<span>${ config . message } </span>`
139- }
140-
141- if ( label === openClientResponseVarName ) {
142- result +=
143- value === 'false'
144- ? '<span>Open Client Response feature is <b>not</b> expected to work for your integration.</span>'
145- : ''
146- }
147-
148- if ( label === decryptionKeyVarName && isSet && ! isDecryptionKeyAValidBase64 ) {
149- result += `<span>⚠️Your ${ decryptionKeyVarName } is invalid. Please copy and paste the correct ${ decryptionKeyVarName } from the dashboard.</span>`
150- }
132+ const { isSet, label, required, value, showValue } = config
151133
152- if (
153- label === saveToKvStorePluginEnabledVarName &&
154- isSaveToKvStorePluginEnabled ( env ) &&
155- ! isDecryptionKeyAValidBase64
156- ) {
157- result += `<span>⚠️Your ${ saveToKvStorePluginEnabledVarName } is set & enabled but decryption is not correct, requests will not be saved in your KV Store</span>`
158- }
159-
160- if (
161- label === saveToKvStorePluginEnabledVarName &&
162- isSaveToKvStorePluginEnabled ( env ) &&
163- ! isOpenClientResponseEnabled ( env )
164- ) {
165- result += `<span>⚠️ The built-in plugin for saving results to the KV Store is enabled, but the ${ openClientResponseVarName } is not set to true, so this plugin won't work.</span>`
134+ let message = isSet ? '' : config . message
135+ if ( label === decryptionKeyVarName && isSet ) {
136+ const isDecryptionKeyAValidBase64 = isValidBase64 ( getDecryptionKey ( env ) )
137+ if ( ! isDecryptionKeyAValidBase64 ) {
138+ message += `Invalid value provided ⚠️. Please copy and paste the correct value from the dashboard.`
139+ }
166140 }
167141
168- return `<span> ${ result } </span >`
142+ return `<li><code> ${ label } </code> ( ${ required ? 'Required' : 'Optional' } ) is ${ isSet ? ` ${ showValue ? `<code> ${ value } </code>` : 'set' } ✅` : ` ${ required ? 'missing ❌' : 'not set ⚠️' } ` } . ${ message ?? '' } </li >`
169143}
170144
171145async function buildKVStoreCheckMessage ( ) : Promise < string > {
172146 const isKVStoreAvailable = await checkKVStoreAvailability ( )
173- if ( ! isKVStoreAvailable ) {
174- const { kvStoreName } = getNamesForStores ( )
175- return `<span>⚠️Your ${ openClientResponseVarName } and ${ saveToKvStorePluginEnabledVarName } variables are set and enabled, but we couldn't reach your KVStore. Your should create a KVStore with name <code>${ kvStoreName } </code> and link to your service.</span>`
147+ if ( isKVStoreAvailable ) {
148+ return ''
176149 }
177- return ''
150+
151+ const { kvStoreName } = getNamesForStores ( )
152+ return `⚠️You have <code>${ saveToKvStorePluginEnabledVarName } </code> enabled, but we couldn't reach your KVStore named <code>${ kvStoreName } </code>. <code>${ saveToKvStorePluginEnabledVarName } </code> related plugin is not working correctly.`
178153}
179154
180155type ConfigurationStatus = {
@@ -183,8 +158,9 @@ type ConfigurationStatus = {
183158 required : boolean
184159 message ?: string
185160 value ?: string | null
161+ showValue ?: boolean
186162}
187- async function createEnvVarsInformationElement ( env : IntegrationEnv ) : Promise < string > {
163+ function createEnvVarsInformationElement ( env : IntegrationEnv ) : string {
188164 const incorrectConfigurationMessage = 'Your integration is not working correctly.'
189165 const configurations : ConfigurationStatus [ ] = [
190166 {
@@ -205,47 +181,61 @@ async function createEnvVarsInformationElement(env: IntegrationEnv): Promise<str
205181 required : true ,
206182 message : incorrectConfigurationMessage ,
207183 } ,
208- {
209- label : decryptionKeyVarName ,
210- isSet : isDecryptionKeySet ( env ) ,
211- required : isOpenClientResponseEnabled ( env ) ,
212- message : incorrectConfigurationMessage ,
213- } ,
184+ ]
185+
186+ let result = ''
187+ result += '<p>🛠️ Your integration’s configuration values:</p>'
188+
189+ result += '<ul>'
190+ for ( const config of configurations ) {
191+ result += buildConfigurationMessage ( config , env )
192+ }
193+ result += '</ul>'
194+
195+ return result
196+ }
197+
198+ async function createOpenClientResponseInformationElement ( env : IntegrationEnv ) : Promise < string > {
199+ const configurations : ConfigurationStatus [ ] = [
214200 {
215201 label : openClientResponseVarName ,
216202 isSet : isOpenClientResponseSet ( env ) ,
217203 required : false ,
218204 value : env . OPEN_CLIENT_RESPONSE_PLUGINS_ENABLED ,
205+ showValue : true ,
206+ message : 'Open client response plugins are disabled.' ,
207+ } ,
208+ {
209+ label : decryptionKeyVarName ,
210+ isSet : isDecryptionKeySet ( env ) ,
211+ required : false ,
219212 message :
220- "Your integration will work without the 'Open Client Response' feature. If you didn't set it intentionally, you can ignore this warning." ,
213+ 'Open client response plugins are not working correctly. This is required if you want to use Open client response plugins.' ,
221214 } ,
222215 {
223216 label : saveToKvStorePluginEnabledVarName ,
224217 isSet : isSaveToKvStorePluginEnabledSet ( env ) ,
225218 required : false ,
226219 value : env . SAVE_TO_KV_STORE_PLUGIN_ENABLED ,
227- message :
228- "Built-in saving requests to KV Storage plugin is not enabled. If you didn't set it intentionally, you can ignore this warning." ,
220+ showValue : true ,
229221 } ,
230222 ]
231223
232- const isAllVarsAvailable = configurations . every ( ( t ) => ! t . required || t . isSet )
233-
234224 let result = ''
225+ result += `<p style="display: block">🔌 Open client response configuration values:<br>(Optional, only relevant if you are using <a href="https://dev.fingerprint.com/docs/using-open-client-response-with-fastly-compute-proxy-integration-plugins">Open client response plugins</a>)</p>`
235226
236- if ( isAllVarsAvailable ) {
237- result += '<span>✅ All required configuration values are set</span>'
238- }
239-
240- result += '<span>Your integration’s configuration values:</span>'
241-
227+ result += '<ul>'
242228 for ( const config of configurations ) {
243229 result += buildConfigurationMessage ( config , env )
244230 }
245231
246232 if ( isOpenClientResponseEnabled ( env ) && isSaveToKvStorePluginEnabled ( env ) ) {
247- result += await buildKVStoreCheckMessage ( )
233+ const errorMessage = await buildKVStoreCheckMessage ( )
234+ if ( errorMessage ) {
235+ result += `<li>${ errorMessage } </li>`
236+ }
248237 }
238+ result += '</ul>'
249239
250240 return result
251241}
@@ -258,26 +248,46 @@ async function buildBody(env: IntegrationEnv, styleNonce: string): Promise<strin
258248 <title>Fingerprint Pro Fastly Compute Integration</title>
259249 <link rel='icon' type='image/x-icon' href='https://fingerprint.com/img/favicon.ico'>
260250 <style nonce='${ styleNonce } '>
261- h1, span {
251+ body {
252+ display: flex;
253+ flex-direction: column;
254+ align-items: center;
255+ }
256+ div {
257+ width: 60%;
258+ max-width: 800px;
259+ }
260+ h1 {
262261 display: block;
263262 padding-top: 1em;
264263 padding-bottom: 1em;
265- text-align: center;
264+ }
265+ p {
266+ padding-top: 1em;
267+ }
268+ code {
269+ background:rgba(135,131,120,.15);
270+ color:#EB5757;
271+ border-radius:4px;
272+ font-size:85%;
273+ padding:0.2em 0.4em
266274 }
267275 </style>
268276 </head>
269277 <body>
278+ <div>
270279 <h1>Fingerprint Pro Fastly Compute Integration</h1>
271280 `
272281
273- body += `<span >🎉 Your Fastly Integration is deployed</span >`
282+ body += `<p >🎉 Your Fastly Integration is deployed!</p >`
274283
275284 body += createVersionElement ( )
276- body += await createEnvVarsInformationElement ( env )
277- body += createBackendCheckElements ( )
285+ body += createEnvVarsInformationElement ( env )
278286 body += createContactInformationElement ( )
287+ body += await createOpenClientResponseInformationElement ( env )
279288
280- body += `
289+ body += `
290+ </div>
281291 </body>
282292 </html>
283293 `
0 commit comments