"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;