88 EuiFieldText ,
99 EuiForm ,
1010 EuiFormRow ,
11+ EuiLink ,
1112 EuiSelect ,
1213 EuiTextArea ,
1314} from '@elastic/eui' ;
@@ -17,6 +18,7 @@ import type { Responder } from './responder';
1718import type { AsyncData } from '../../../../model' ;
1819import { getApiRequestConfig , getApiUrl , getErrorMessage , isClientError } from '../../../../model' ;
1920import { EditorFlyout } from '../../components/editor_flyout' ;
21+ import { ScriptEditor } from '../../components/script_editor' ;
2022import { useWorkspaceContext } from '../../hooks' ;
2123
2224export interface ResponderEditFlyoutProps {
@@ -66,6 +68,11 @@ export function ResponderEditFlyout({ onClose, responder }: ResponderEditFlyoutP
6668 ) ;
6769 const [ areHeadersInvalid , setAreHeadersInvalid ] = useState ( false ) ;
6870
71+ const [ script , setScript ] = useState < string | undefined > ( responder ?. settings . script ) ;
72+ const onUserScriptChange = useCallback ( ( value ?: string ) => {
73+ setScript ( value ) ;
74+ } , [ ] ) ;
75+
6976 const onCreateHeader = ( headerValue : string ) => {
7077 if ( ! isHeaderValid ( headerValue ) ) {
7178 return false ;
@@ -93,11 +100,6 @@ export function ResponderEditFlyout({ onClose, responder }: ResponderEditFlyoutP
93100 setBody ( e . target . value ) ;
94101 } , [ ] ) ;
95102
96- const [ delay , setDelay ] = useState < number > ( responder ?. settings . delay ?? 0 ) ;
97- const onDelayChange = useCallback ( ( e : ChangeEvent < HTMLInputElement > ) => {
98- setDelay ( + e . target . value ) ;
99- } , [ ] ) ;
100-
101103 const [ updatingStatus , setUpdatingStatus ] = useState < AsyncData < void > > ( ) ;
102104 const onSave = useCallback ( ( ) => {
103105 if ( updatingStatus ?. status === 'pending' ) {
@@ -124,7 +126,7 @@ export function ResponderEditFlyout({ onClose, responder }: ResponderEditFlyoutP
124126 ] as [ string , string ] ;
125127 } )
126128 : undefined ,
127- delay ,
129+ script : script ?. trim ( ) ? script . trim ( ) : undefined ,
128130 } ,
129131 } ;
130132
@@ -168,7 +170,7 @@ export function ResponderEditFlyout({ onClose, responder }: ResponderEditFlyoutP
168170 } ) ;
169171 } ,
170172 ) ;
171- } , [ name , method , path , requestsToTrack , statusCode , body , headers , delay , responder , updatingStatus ] ) ;
173+ } , [ name , method , path , requestsToTrack , statusCode , body , headers , script , responder , updatingStatus ] ) ;
172174
173175 return (
174176 < EditorFlyout
@@ -246,10 +248,24 @@ export function ResponderEditFlyout({ onClose, responder }: ResponderEditFlyoutP
246248 < EuiTextArea value = { body } onChange = { onBodyChange } />
247249 </ EuiFormRow >
248250 < EuiFormRow
249- label = "Delay"
250- helpText = "Responder will handle an incoming request only after specified number of milliseconds"
251+ label = "Script"
252+ helpText = {
253+ < span >
254+ The script is executed within a constrained version of the{ ' ' }
255+ < EuiLink target = "_blank" href = "https://deno.com/" >
256+ < b > Deno JavaScript runtime</ b >
257+ </ EuiLink > { ' ' }
258+ for every received request. It returns an object that can override the default response status code,
259+ headers, or body. Request information is available through the global "context" variable. Refer to the{ ' ' }
260+ < EuiLink target = "_blank" href = "/docs/guides/webhooks#annex-responder-script-examples" >
261+ < b > documentation</ b >
262+ </ EuiLink > { ' ' }
263+ for a list of script examples, expected return value and properties available in the "context" object
264+ argument.
265+ </ span >
266+ }
251267 >
252- < EuiFieldNumber fullWidth min = { 0 } step = { 1 } value = { delay } onChange = { onDelayChange } />
268+ < ScriptEditor onChange = { onUserScriptChange } defaultValue = { script } />
253269 </ EuiFormRow >
254270 </ EuiDescribedFormGroup >
255271 </ EuiForm >
0 commit comments