"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.LogStreamContent = exports.LogStream = void 0; var _esQuery = require("@kbn/es-query"); var _react = _interopRequireWildcard(require("react")); var _common = require("@kbn/kibana-react-plugin/common"); var _public = require("@kbn/kibana-react-plugin/public"); var _lodash = require("lodash"); var _log_views = require("../../../common/log_views"); var _log_stream = require("../../containers/logs/log_stream"); var _use_log_view = require("../../hooks/use_log_view"); var _log_views2 = require("../../services/log_views"); var _use_kibana_query_settings = require("../../utils/use_kibana_query_settings"); var _log_text_stream = require("../logging/log_text_stream"); var _log_stream_error_boundary = require("./log_stream_error_boundary"); var _log_entry_flyout = require("../logging/log_entry_flyout"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ const PAGE_THRESHOLD = 2; const LogStream = ({ height = 400, ...contentProps }) => { return /*#__PURE__*/_react.default.createElement(LogStreamContainer, { style: { height } }, /*#__PURE__*/_react.default.createElement(_log_stream_error_boundary.LogStreamErrorBoundary, { resetOnChange: [contentProps.query] }, /*#__PURE__*/_react.default.createElement(LogStreamContent, contentProps))); }; exports.LogStream = LogStream; const LogStreamContent = ({ logView, startTimestamp, endTimestamp, query, filters, center, highlight, columns, showFlyoutAction = false }) => { const customColumns = (0, _react.useMemo)(() => columns ? convertLogColumnDefinitionToLogSourceColumnDefinition(columns) : undefined, [columns]); const { services: { http, data } } = (0, _public.useKibana)(); if (http == null || data == null) { throw new Error(` cannot access kibana core services. Ensure the component is mounted within kibana-react's hierarchy. Read more at https://github.com/elastic/kibana/blob/main/src/plugins/kibana_react/README.md" `); } const { openLogEntryFlyout } = (0, _log_entry_flyout.useLogEntryFlyout)(logView); const kibanaQuerySettings = (0, _use_kibana_query_settings.useKibanaQuerySettings)(); const logViews = (0, _react.useMemo)(() => new _log_views2.LogViewsClient(data.dataViews, http, data.search.search, _log_views.defaultLogViewsStaticConfig), [data.dataViews, data.search.search, http]); const { derivedDataView, isLoading: isLoadingLogView, load: loadLogView, resolvedLogView } = (0, _use_log_view.useLogView)({ initialLogViewReference: logView, logViews }); const parsedQuery = (0, _react.useMemo)(() => { if (typeof query === 'object' && 'bool' in query) { return mergeBoolQueries(query, (0, _esQuery.buildEsQuery)(derivedDataView, [], filters !== null && filters !== void 0 ? filters : [], kibanaQuerySettings)); } else { return (0, _esQuery.buildEsQuery)(derivedDataView, coerceToQueries(query), filters !== null && filters !== void 0 ? filters : [], kibanaQuerySettings); } }, [derivedDataView, filters, kibanaQuerySettings, query]); // Internal state const { entries, fetchEntries, fetchNextEntries, fetchPreviousEntries, hasMoreAfter, hasMoreBefore, isLoadingMore, isReloading: isLoadingEntries } = (0, _log_stream.useLogStream)({ logViewReference: logView, startTimestamp, endTimestamp, query: parsedQuery, center, columns: customColumns }); const columnConfigurations = (0, _react.useMemo)(() => { return resolvedLogView ? customColumns !== null && customColumns !== void 0 ? customColumns : resolvedLogView.columns : []; }, [resolvedLogView, customColumns]); const streamItems = (0, _react.useMemo)(() => entries.map(entry => ({ kind: 'logEntry', logEntry: entry, highlights: [] })), [entries]); // Component lifetime (0, _react.useEffect)(() => { loadLogView(); }, [loadLogView]); (0, _react.useEffect)(() => { fetchEntries(); }, [fetchEntries]); // Pagination handler const handlePagination = (0, _react.useCallback)(({ fromScroll, pagesBeforeStart, pagesAfterEnd }) => { if (!fromScroll) { return; } if (isLoadingMore) { return; } if (pagesBeforeStart < PAGE_THRESHOLD) { fetchPreviousEntries(); } else if (pagesAfterEnd < PAGE_THRESHOLD) { fetchNextEntries(); } }, [isLoadingMore, fetchPreviousEntries, fetchNextEntries]); return /*#__PURE__*/_react.default.createElement(_log_text_stream.ScrollableLogTextStreamView, { target: center ? center : entries.length ? entries[entries.length - 1].cursor : null, columnConfigurations: columnConfigurations, items: streamItems, scale: "medium", wrap: true, isReloading: isLoadingLogView || isLoadingEntries, isLoadingMore: isLoadingMore, hasMoreBeforeStart: hasMoreBefore, hasMoreAfterEnd: hasMoreAfter, isStreaming: false, jumpToTarget: _lodash.noop, reportVisibleInterval: handlePagination, reloadItems: fetchEntries, onOpenLogEntryFlyout: showFlyoutAction ? openLogEntryFlyout : undefined, highlightedItem: highlight !== null && highlight !== void 0 ? highlight : null, currentHighlightKey: null, startDateExpression: '', endDateExpression: '', updateDateRange: _lodash.noop, startLiveStreaming: _lodash.noop, hideScrollbar: false }); }; exports.LogStreamContent = LogStreamContent; const LogStreamContainer = _common.euiStyled.div` display: flex; background-color: ${props => props.theme.eui.euiColorEmptyShade}; `; function convertLogColumnDefinitionToLogSourceColumnDefinition(columns) { return columns.map(column => { // We extract the { width, header, render } inside each block so the TS compiler uses the right type for `render` switch (column.type) { case 'timestamp': { const { width, header, render } = column; return { timestampColumn: { id: '___#timestamp', width, header, render } }; } case 'message': { const { width, header, render } = column; return { messageColumn: { id: '___#message', width, header, render } }; } case 'field': { const { width, header, render } = column; return { fieldColumn: { id: `___#${column.field}`, field: column.field, width, header, render } }; } } }); } const mergeBoolQueries = (firstQuery, secondQuery) => ({ bool: { must: [...firstQuery.bool.must, ...secondQuery.bool.must], filter: [...firstQuery.bool.filter, ...secondQuery.bool.filter], should: [...firstQuery.bool.should, ...secondQuery.bool.should], must_not: [...firstQuery.bool.must_not, ...secondQuery.bool.must_not] } }); const coerceToQueries = value => { if (value == null) { return []; } else if (typeof value === 'string') { return [{ language: 'kuery', query: value }]; } else if ('language' in value && 'query' in value) { return [value]; } return []; }; // Allow for lazy loading // eslint-disable-next-line import/no-default-export var _default = LogStream; exports.default = _default;