Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.

Commit 7727f82

Browse files
committed
feat(webhooks)!: add UI to support custom responder JavaScript extensions and drop delay setting
1 parent 65d444c commit 7727f82

5 files changed

Lines changed: 32 additions & 19 deletions

File tree

src/pages/workspace/utils/web_scraping/web_page_tracker_script_editor.tsx renamed to src/pages/workspace/components/script_editor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export interface Props {
8787
defaultValue?: string;
8888
}
8989

90-
export default function WebPageTrackerScriptEditor({ onChange, defaultValue }: Props) {
90+
export function ScriptEditor({ onChange, defaultValue }: Props) {
9191
const { colorMode } = useEuiTheme();
9292

9393
const monacoTheme = createTheme(

src/pages/workspace/utils/web_scraping/web_page_content_tracker_edit_flyout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import axios from 'axios';
1818
import { getDefaultRetryStrategy, WEB_PAGE_TRACKER_SCHEDULES } from './consts';
1919
import type { SchedulerJobConfig, WebPageContentTracker } from './web_page_tracker';
2020
import { WebPageTrackerRetryStrategy } from './web_page_tracker_retry_strategy';
21-
import WebPageTrackerScriptEditor from './web_page_tracker_script_editor';
2221
import { type AsyncData, getApiRequestConfig, getApiUrl, getErrorMessage, isClientError } from '../../../../model';
2322
import { isValidURL } from '../../../../tools/url';
2423
import { EditorFlyout } from '../../components/editor_flyout';
24+
import { ScriptEditor } from '../../components/script_editor';
2525
import { useWorkspaceContext } from '../../hooks';
2626

2727
export interface Props {
@@ -290,7 +290,7 @@ export function WebPageContentTrackerEditFlyout({ onClose, tracker }: Props) {
290290
</span>
291291
}
292292
>
293-
<WebPageTrackerScriptEditor onChange={onExtractContentScriptChange} defaultValue={extractContentScript} />
293+
<ScriptEditor onChange={onExtractContentScriptChange} defaultValue={extractContentScript} />
294294
</EuiFormRow>
295295
</EuiDescribedFormGroup>
296296
</EuiForm>

src/pages/workspace/utils/web_scraping/web_page_resources_tracker_edit_flyout.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import axios from 'axios';
1818
import { getDefaultRetryStrategy, WEB_PAGE_TRACKER_SCHEDULES } from './consts';
1919
import type { SchedulerJobConfig, WebPageResourcesTracker } from './web_page_tracker';
2020
import { WebPageTrackerRetryStrategy } from './web_page_tracker_retry_strategy';
21-
import WebPageTrackerScriptEditor from './web_page_tracker_script_editor';
2221
import { type AsyncData, getApiRequestConfig, getApiUrl, getErrorMessage, isClientError } from '../../../../model';
2322
import { isValidURL } from '../../../../tools/url';
2423
import { EditorFlyout } from '../../components/editor_flyout';
24+
import { ScriptEditor } from '../../components/script_editor';
2525
import { useWorkspaceContext } from '../../hooks';
2626

2727
export interface Props {
@@ -284,10 +284,7 @@ export function WebPageResourcesTrackerEditFlyout({ onClose, tracker }: Props) {
284284
</span>
285285
}
286286
>
287-
<WebPageTrackerScriptEditor
288-
onChange={onResourceFilterMapScriptChange}
289-
defaultValue={resourceFilterMapScript}
290-
/>
287+
<ScriptEditor onChange={onResourceFilterMapScriptChange} defaultValue={resourceFilterMapScript} />
291288
</EuiFormRow>
292289
</EuiDescribedFormGroup>
293290
</EuiForm>

src/pages/workspace/utils/webhooks/responder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export interface Responder {
88
statusCode: number;
99
headers?: Array<[string, string]>;
1010
body?: string;
11-
delay?: number;
11+
script?: string;
1212
};
1313
createdAt: number;
1414
}

src/pages/workspace/utils/webhooks/responder_edit_flyout.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
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';
1718
import type { AsyncData } from '../../../../model';
1819
import { getApiRequestConfig, getApiUrl, getErrorMessage, isClientError } from '../../../../model';
1920
import { EditorFlyout } from '../../components/editor_flyout';
21+
import { ScriptEditor } from '../../components/script_editor';
2022
import { useWorkspaceContext } from '../../hooks';
2123

2224
export 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

Comments
 (0)