@localstack/appinspector-ui 1.0.55 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/dist/index.cjs +154 -221
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +159 -226
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,3 +7,26 @@ This package is used internally in different LocalStack products as an interface
|
|
|
7
7
|
```sh
|
|
8
8
|
npm install @localstack/appinspector-ui
|
|
9
9
|
```
|
|
10
|
+
|
|
11
|
+
## Development
|
|
12
|
+
|
|
13
|
+
### Start LocalStack
|
|
14
|
+
|
|
15
|
+
Start LocalStack with the following configuration:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
APPINSPECTOR_ENABLE=1 APPINSPECTOR_DEV_ENABLE=1 EXTRA_CORS_ALLOWED_ORIGINS=* localstack start
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> [!NOTE]
|
|
22
|
+
> Remember to start LocalStack Pro using `LOCALSTACK_AUTH_TOKEN=test` in development or with <your-auth-token> in production.
|
|
23
|
+
|
|
24
|
+
### Run the development server
|
|
25
|
+
|
|
26
|
+
Develop locally using:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
npm run dev
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Check out [CONTRIBUTING.md](CONTRIBUTING.md) for more information about development and testing.
|
package/dist/index.cjs
CHANGED
|
@@ -12148,15 +12148,65 @@ var newSpanBackgroundColor = {
|
|
|
12148
12148
|
dark: "#887b02",
|
|
12149
12149
|
light: "#ffde7b"
|
|
12150
12150
|
};
|
|
12151
|
+
var SpansDataGridRow = (0, import_react40.memo)(
|
|
12152
|
+
({ row }) => {
|
|
12153
|
+
const theme = (0, import_material4.useTheme)();
|
|
12154
|
+
return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12155
|
+
import_material4.TableRow,
|
|
12156
|
+
{
|
|
12157
|
+
animate: {
|
|
12158
|
+
backgroundColor: "transparent"
|
|
12159
|
+
},
|
|
12160
|
+
component: motion.tr,
|
|
12161
|
+
initial: {
|
|
12162
|
+
backgroundColor: theme.palette.mode === "light" ? newSpanBackgroundColor.light : newSpanBackgroundColor.dark
|
|
12163
|
+
},
|
|
12164
|
+
sx: {
|
|
12165
|
+
transition: "background-color 1200ms ease-in"
|
|
12166
|
+
},
|
|
12167
|
+
children: row.getVisibleCells().map((cell) => {
|
|
12168
|
+
return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12169
|
+
import_material4.TableCell,
|
|
12170
|
+
{
|
|
12171
|
+
sx: {
|
|
12172
|
+
height: 36,
|
|
12173
|
+
maxWidth: `${cell.column.getSize().toString()}px`,
|
|
12174
|
+
minWidth: `${cell.column.getSize().toString()}px`
|
|
12175
|
+
},
|
|
12176
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12177
|
+
import_material4.Box,
|
|
12178
|
+
{
|
|
12179
|
+
sx: {
|
|
12180
|
+
"alignItems": "center",
|
|
12181
|
+
"display": "flex",
|
|
12182
|
+
"flex-direction": "row",
|
|
12183
|
+
"height": "100%",
|
|
12184
|
+
"tr:hover &": {
|
|
12185
|
+
backgroundColor: (theme2) => theme2.palette.action.hover
|
|
12186
|
+
},
|
|
12187
|
+
"width": "100%"
|
|
12188
|
+
},
|
|
12189
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Box, { sx: { px: 1, width: "100%" }, children: flexRender(cell.column.columnDef.cell, cell.getContext()) })
|
|
12190
|
+
}
|
|
12191
|
+
)
|
|
12192
|
+
},
|
|
12193
|
+
cell.id
|
|
12194
|
+
);
|
|
12195
|
+
})
|
|
12196
|
+
},
|
|
12197
|
+
row.original.span_id
|
|
12198
|
+
);
|
|
12199
|
+
},
|
|
12200
|
+
// Since spans are immutable, we can cache this component by the span ID
|
|
12201
|
+
(previous, next) => previous.row.original.span_id === next.row.original.span_id
|
|
12202
|
+
);
|
|
12151
12203
|
var SpansDataGrid = ({
|
|
12152
12204
|
clearingSpans,
|
|
12153
12205
|
fetchingBackward,
|
|
12154
|
-
fetchingForward,
|
|
12155
12206
|
hasMoreBackward,
|
|
12156
12207
|
hasMoreForward,
|
|
12157
12208
|
onClearSpans,
|
|
12158
12209
|
onFetchBackward,
|
|
12159
|
-
onFetchForward,
|
|
12160
12210
|
onSpanClick,
|
|
12161
12211
|
spans
|
|
12162
12212
|
}) => {
|
|
@@ -12194,6 +12244,16 @@ var SpansDataGrid = ({
|
|
|
12194
12244
|
size: 180
|
|
12195
12245
|
}),
|
|
12196
12246
|
columnHelper.accessor("operation_name", {
|
|
12247
|
+
cell: (props) => /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12248
|
+
import_material4.Box,
|
|
12249
|
+
{
|
|
12250
|
+
sx: {
|
|
12251
|
+
overflow: "hidden",
|
|
12252
|
+
textOverflow: "ellipsis"
|
|
12253
|
+
},
|
|
12254
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("span", { title: props.getValue(), children: props.getValue() })
|
|
12255
|
+
}
|
|
12256
|
+
),
|
|
12197
12257
|
header: "Action",
|
|
12198
12258
|
id: "operationName",
|
|
12199
12259
|
size: 96
|
|
@@ -12234,7 +12294,6 @@ var SpansDataGrid = ({
|
|
|
12234
12294
|
const columnCount = table.getAllColumns().length;
|
|
12235
12295
|
const rows = table.getRowModel().rows;
|
|
12236
12296
|
const hasRows = rows.length > 0;
|
|
12237
|
-
const theme = (0, import_material4.useTheme)();
|
|
12238
12297
|
return /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_jsx_runtime124.Fragment, { children: [
|
|
12239
12298
|
/* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Grid, { item: true, xs: 12, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_material4.Box, { sx: { alignItems: "center", display: "flex", gap: "0.5rem" }, children: [
|
|
12240
12299
|
/* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Box, { sx: { flexGrow: 1 } }),
|
|
@@ -12296,74 +12355,20 @@ var SpansDataGrid = ({
|
|
|
12296
12355
|
/* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_material4.TableBody, { children: [
|
|
12297
12356
|
spans === void 0 && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableCell, { colSpan: columnCount, sx: { fontStyle: "italic", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.CircularProgress, { size: 48, sx: { m: 4 } }) }) }),
|
|
12298
12357
|
spans?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableCell, { colSpan: columnCount, sx: { fontStyle: "italic", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("span", { children: "There are no spans" }) }) }),
|
|
12358
|
+
hasRows && !hasMoreBackward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableCell, { colSpan: columnCount, sx: { fontStyle: "italic", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("span", { children: "This is the beginning of the stream" }) }) }),
|
|
12299
12359
|
hasRows && hasMoreBackward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_material4.TableCell, { colSpan: columnCount, sx: { textAlign: "center" }, children: [
|
|
12300
|
-
!fetchingBackward &&
|
|
12360
|
+
!fetchingBackward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12301
12361
|
import_material4.Button,
|
|
12302
12362
|
{
|
|
12303
12363
|
onClick: onFetchBackward,
|
|
12304
12364
|
sx: { my: 1 },
|
|
12305
|
-
children: "Load newer spans"
|
|
12306
|
-
}
|
|
12307
|
-
),
|
|
12308
|
-
(fetchingBackward || fetchingForward) && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.CircularProgress, { size: 24, sx: { m: 2 } })
|
|
12309
|
-
] }) }),
|
|
12310
|
-
hasRows && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(AnimatePresence, { initial: false, children: rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12311
|
-
import_material4.TableRow,
|
|
12312
|
-
{
|
|
12313
|
-
animate: {
|
|
12314
|
-
backgroundColor: "transparent"
|
|
12315
|
-
},
|
|
12316
|
-
component: motion.tr,
|
|
12317
|
-
initial: {
|
|
12318
|
-
backgroundColor: theme.palette.mode === "light" ? newSpanBackgroundColor.light : newSpanBackgroundColor.dark
|
|
12319
|
-
},
|
|
12320
|
-
sx: {
|
|
12321
|
-
transition: "background-color 1200ms ease-in"
|
|
12322
|
-
},
|
|
12323
|
-
children: row.getVisibleCells().map((cell) => {
|
|
12324
|
-
return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12325
|
-
import_material4.TableCell,
|
|
12326
|
-
{
|
|
12327
|
-
sx: {
|
|
12328
|
-
height: 36,
|
|
12329
|
-
maxWidth: `${cell.column.getSize().toString()}px`,
|
|
12330
|
-
minWidth: `${cell.column.getSize().toString()}px`
|
|
12331
|
-
},
|
|
12332
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12333
|
-
import_material4.Box,
|
|
12334
|
-
{
|
|
12335
|
-
sx: {
|
|
12336
|
-
"alignItems": "center",
|
|
12337
|
-
"display": "flex",
|
|
12338
|
-
"flex-direction": "row",
|
|
12339
|
-
"height": "100%",
|
|
12340
|
-
"tr:hover &": {
|
|
12341
|
-
backgroundColor: (theme2) => theme2.palette.action.hover
|
|
12342
|
-
},
|
|
12343
|
-
"width": "100%"
|
|
12344
|
-
},
|
|
12345
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Box, { sx: { px: 1, width: "100%" }, children: flexRender(cell.column.columnDef.cell, cell.getContext()) })
|
|
12346
|
-
}
|
|
12347
|
-
)
|
|
12348
|
-
},
|
|
12349
|
-
cell.id
|
|
12350
|
-
);
|
|
12351
|
-
})
|
|
12352
|
-
},
|
|
12353
|
-
row.original.span_id
|
|
12354
|
-
)) }),
|
|
12355
|
-
hasRows && hasMoreForward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_material4.TableCell, { colSpan: columnCount, sx: { textAlign: "center" }, children: [
|
|
12356
|
-
!fetchingBackward && !fetchingForward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
|
|
12357
|
-
import_material4.Button,
|
|
12358
|
-
{
|
|
12359
|
-
onClick: onFetchForward,
|
|
12360
|
-
sx: { my: 1 },
|
|
12361
12365
|
children: "Load older spans"
|
|
12362
12366
|
}
|
|
12363
12367
|
),
|
|
12364
|
-
|
|
12368
|
+
fetchingBackward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.CircularProgress, { size: 24, sx: { m: 2 } })
|
|
12365
12369
|
] }) }),
|
|
12366
|
-
hasRows &&
|
|
12370
|
+
hasRows && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(AnimatePresence, { initial: false, children: rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(SpansDataGridRow, { row }, row.original.span_id)) }),
|
|
12371
|
+
hasRows && !hasMoreForward && /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.TableCell, { colSpan: columnCount, sx: { fontStyle: "italic", textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)("span", { children: "This is the end of the stream" }) }) })
|
|
12367
12372
|
] })
|
|
12368
12373
|
]
|
|
12369
12374
|
}
|
|
@@ -12380,7 +12385,7 @@ var SpansList = (props) => {
|
|
|
12380
12385
|
props.fetchError && /* @__PURE__ */ (0, import_jsx_runtime125.jsxs)(
|
|
12381
12386
|
import_material5.Alert,
|
|
12382
12387
|
{
|
|
12383
|
-
action: /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(import_material5.Button, { onClick: props.
|
|
12388
|
+
action: /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(import_material5.Button, { onClick: props.onFetchForward, children: "Retry" }),
|
|
12384
12389
|
severity: "error",
|
|
12385
12390
|
children: [
|
|
12386
12391
|
"Unexpected error:",
|
|
@@ -12400,7 +12405,6 @@ var SpansList = (props) => {
|
|
|
12400
12405
|
onClearSpans: props.onClearSpans,
|
|
12401
12406
|
onFetchBackward: props.onFetchBackward,
|
|
12402
12407
|
onFetchForward: props.onFetchForward,
|
|
12403
|
-
onRefresh: props.onRefresh,
|
|
12404
12408
|
onSpanClick: props.onSpanClick,
|
|
12405
12409
|
refetching: props.refetching,
|
|
12406
12410
|
spans: props.spans
|
|
@@ -12734,7 +12738,7 @@ var useStatus = () => {
|
|
|
12734
12738
|
const hasFetchedReference = (0, import_react42.useRef)(false);
|
|
12735
12739
|
const abortControllerReference = (0, import_react42.useRef)(null);
|
|
12736
12740
|
const checkStatus = (0, import_react42.useCallback)(async () => {
|
|
12737
|
-
if (abortControllerReference.current) {
|
|
12741
|
+
if (abortControllerReference.current !== null) {
|
|
12738
12742
|
abortControllerReference.current.abort();
|
|
12739
12743
|
}
|
|
12740
12744
|
const abortController = new AbortController();
|
|
@@ -12767,26 +12771,53 @@ var useStatus = () => {
|
|
|
12767
12771
|
};
|
|
12768
12772
|
|
|
12769
12773
|
// src/utils/pagination-buffer.ts
|
|
12774
|
+
var insertSorted = (array, item, compareFunction, hint = "back") => {
|
|
12775
|
+
let left;
|
|
12776
|
+
let right;
|
|
12777
|
+
if (hint === "back") {
|
|
12778
|
+
left = array.length;
|
|
12779
|
+
right = array.length;
|
|
12780
|
+
let step = 1;
|
|
12781
|
+
while (left > 0 && compareFunction(array[left - 1], item) > 0) {
|
|
12782
|
+
right = left;
|
|
12783
|
+
left = Math.max(0, left - step);
|
|
12784
|
+
step *= 2;
|
|
12785
|
+
}
|
|
12786
|
+
} else {
|
|
12787
|
+
left = 0;
|
|
12788
|
+
right = 0;
|
|
12789
|
+
let step = 1;
|
|
12790
|
+
while (right < array.length && compareFunction(array[right], item) <= 0) {
|
|
12791
|
+
left = right + 1;
|
|
12792
|
+
right = Math.min(array.length, right + step);
|
|
12793
|
+
step *= 2;
|
|
12794
|
+
}
|
|
12795
|
+
}
|
|
12796
|
+
while (left < right) {
|
|
12797
|
+
const mid = left + right >>> 1;
|
|
12798
|
+
if (compareFunction(array[mid], item) <= 0) {
|
|
12799
|
+
left = mid + 1;
|
|
12800
|
+
} else {
|
|
12801
|
+
right = mid;
|
|
12802
|
+
}
|
|
12803
|
+
}
|
|
12804
|
+
array.splice(left, 0, item);
|
|
12805
|
+
};
|
|
12770
12806
|
var createPaginationBuffer = (options) => {
|
|
12771
|
-
const { fetchPage
|
|
12772
|
-
|
|
12773
|
-
|
|
12807
|
+
const { fetchPage } = options;
|
|
12808
|
+
let items = void 0;
|
|
12809
|
+
let nextForwardToken;
|
|
12810
|
+
let nextBackwardToken;
|
|
12811
|
+
let hasMoreForward = void 0;
|
|
12812
|
+
let hasMoreBackward = void 0;
|
|
12774
12813
|
let fetchingForward = false;
|
|
12775
12814
|
let fetchingBackward = false;
|
|
12776
|
-
|
|
12777
|
-
const hasMoreBackward = () => {
|
|
12778
|
-
const firstPage = pages2[0];
|
|
12779
|
-
return firstPage?.hasMoreBackward;
|
|
12780
|
-
};
|
|
12781
|
-
const hasMoreForward = () => {
|
|
12782
|
-
const lastPage = pages2.at(-1);
|
|
12783
|
-
return lastPage?.hasMoreForward;
|
|
12784
|
-
};
|
|
12815
|
+
const refetching = false;
|
|
12785
12816
|
const reportDataChange = () => {
|
|
12786
12817
|
options.onDataChange({
|
|
12787
|
-
hasMoreBackward: hasMoreBackward
|
|
12788
|
-
hasMoreForward: hasMoreForward
|
|
12789
|
-
items:
|
|
12818
|
+
hasMoreBackward: hasMoreBackward ?? false,
|
|
12819
|
+
hasMoreForward: hasMoreForward ?? false,
|
|
12820
|
+
items: items ?? []
|
|
12790
12821
|
});
|
|
12791
12822
|
};
|
|
12792
12823
|
const reportStatusChange = () => {
|
|
@@ -12801,35 +12832,24 @@ var createPaginationBuffer = (options) => {
|
|
|
12801
12832
|
};
|
|
12802
12833
|
let fetchForwardLater = false;
|
|
12803
12834
|
let fetchBackwardLater = false;
|
|
12804
|
-
let refetchCurrentLater = false;
|
|
12805
12835
|
const fetchForward = async () => {
|
|
12806
12836
|
fetchingForward = true;
|
|
12807
12837
|
reportStatusChange();
|
|
12808
12838
|
try {
|
|
12809
|
-
const
|
|
12810
|
-
|
|
12811
|
-
|
|
12812
|
-
|
|
12813
|
-
|
|
12814
|
-
|
|
12815
|
-
|
|
12816
|
-
pages2.push({
|
|
12817
|
-
hasMoreBackward: newPage.hasMoreBackward,
|
|
12818
|
-
hasMoreForward: newPage.hasMoreForward,
|
|
12819
|
-
items: newPage.items,
|
|
12820
|
-
nextBackwardToken: newPage.nextBackwardToken,
|
|
12821
|
-
nextForwardToken: newPage.nextForwardToken,
|
|
12822
|
-
token,
|
|
12823
|
-
tokenDirection: "forward"
|
|
12824
|
-
});
|
|
12825
|
-
if (pages2.length > 3) {
|
|
12826
|
-
const removedPage = pages2.shift();
|
|
12827
|
-
if (removedPage) {
|
|
12828
|
-
items.splice(0, removedPage.items.length);
|
|
12829
|
-
}
|
|
12839
|
+
const newPage = await fetchPage(nextForwardToken);
|
|
12840
|
+
if (options.sortComparator === void 0) {
|
|
12841
|
+
items = [...items ?? [], ...newPage.items];
|
|
12842
|
+
} else {
|
|
12843
|
+
const merged = [...items ?? []];
|
|
12844
|
+
for (const item of newPage.items.toSorted(options.sortComparator)) {
|
|
12845
|
+
insertSorted(merged, item, options.sortComparator, "back");
|
|
12830
12846
|
}
|
|
12847
|
+
items = merged;
|
|
12831
12848
|
}
|
|
12832
|
-
|
|
12849
|
+
hasMoreForward = newPage.hasMoreForward;
|
|
12850
|
+
nextForwardToken = newPage.nextForwardToken;
|
|
12851
|
+
hasMoreBackward ??= newPage.hasMoreBackward;
|
|
12852
|
+
nextBackwardToken ??= newPage.nextBackwardToken;
|
|
12833
12853
|
reportDataChange();
|
|
12834
12854
|
} catch (error) {
|
|
12835
12855
|
reportError(error instanceof Error ? error : new Error("Failed to fetch forward page", { cause: error }));
|
|
@@ -12843,32 +12863,20 @@ var createPaginationBuffer = (options) => {
|
|
|
12843
12863
|
fetchingBackward = true;
|
|
12844
12864
|
reportStatusChange();
|
|
12845
12865
|
try {
|
|
12846
|
-
const
|
|
12847
|
-
|
|
12848
|
-
|
|
12849
|
-
|
|
12850
|
-
|
|
12851
|
-
|
|
12852
|
-
|
|
12853
|
-
} else if (newPage.items.length > 0) {
|
|
12854
|
-
pages2.unshift({
|
|
12855
|
-
hasMoreBackward: newPage.hasMoreBackward,
|
|
12856
|
-
hasMoreForward: newPage.hasMoreForward,
|
|
12857
|
-
items: newPage.items,
|
|
12858
|
-
nextBackwardToken: newPage.nextBackwardToken,
|
|
12859
|
-
nextForwardToken: newPage.nextForwardToken,
|
|
12860
|
-
token,
|
|
12861
|
-
// If no token was used, the default direction is forward.
|
|
12862
|
-
tokenDirection: token ? "backward" : "forward"
|
|
12863
|
-
});
|
|
12864
|
-
if (pages2.length > 3) {
|
|
12865
|
-
const removedPage = pages2.pop();
|
|
12866
|
-
if (removedPage) {
|
|
12867
|
-
items.splice(items.length - removedPage.items.length, removedPage.items.length);
|
|
12868
|
-
}
|
|
12866
|
+
const newPage = await fetchPage(nextBackwardToken);
|
|
12867
|
+
if (options.sortComparator === void 0) {
|
|
12868
|
+
items = [...newPage.items, ...items ?? []];
|
|
12869
|
+
} else {
|
|
12870
|
+
const merged = [...items ?? []];
|
|
12871
|
+
for (const item of newPage.items.toSorted(options.sortComparator)) {
|
|
12872
|
+
insertSorted(merged, item, options.sortComparator, "front");
|
|
12869
12873
|
}
|
|
12870
|
-
items
|
|
12874
|
+
items = merged;
|
|
12871
12875
|
}
|
|
12876
|
+
hasMoreBackward = newPage.hasMoreBackward;
|
|
12877
|
+
nextBackwardToken = newPage.nextBackwardToken;
|
|
12878
|
+
hasMoreForward ??= newPage.hasMoreForward;
|
|
12879
|
+
nextForwardToken ??= newPage.nextForwardToken;
|
|
12872
12880
|
reportDataChange();
|
|
12873
12881
|
} catch (error) {
|
|
12874
12882
|
reportError(error instanceof Error ? error : new Error("Failed to fetch forward page", { cause: error }));
|
|
@@ -12878,62 +12886,6 @@ var createPaginationBuffer = (options) => {
|
|
|
12878
12886
|
}
|
|
12879
12887
|
runPostFetchActions();
|
|
12880
12888
|
};
|
|
12881
|
-
const refetchCurrent = async () => {
|
|
12882
|
-
if (pages2.length === 0) {
|
|
12883
|
-
await fetchForward();
|
|
12884
|
-
return;
|
|
12885
|
-
}
|
|
12886
|
-
refetching = true;
|
|
12887
|
-
reportStatusChange();
|
|
12888
|
-
try {
|
|
12889
|
-
const backwardIndex = pages2.findLastIndex((page) => page.tokenDirection === "backward");
|
|
12890
|
-
const backwardPage = backwardIndex === -1 ? void 0 : pages2[backwardIndex];
|
|
12891
|
-
const backwardPageCount = backwardIndex + 1;
|
|
12892
|
-
const forwardIndex = pages2.findIndex((page) => page.tokenDirection === "forward");
|
|
12893
|
-
const forwardPage = forwardIndex === -1 ? void 0 : pages2[forwardIndex];
|
|
12894
|
-
const forwardPageCount = forwardIndex === -1 ? 0 : pages2.length - forwardIndex;
|
|
12895
|
-
const [backwardResponse, forwardResponse] = await Promise.all([
|
|
12896
|
-
backwardPageCount > 0 ? fetchPage(backwardPage?.token, pageSize * backwardPageCount) : void 0,
|
|
12897
|
-
forwardPageCount > 0 ? fetchPage(forwardPage?.token, pageSize * forwardPageCount) : void 0
|
|
12898
|
-
]);
|
|
12899
|
-
pages2.length = 0;
|
|
12900
|
-
items.length = 0;
|
|
12901
|
-
if (backwardResponse) {
|
|
12902
|
-
pages2.push({
|
|
12903
|
-
hasMoreBackward: backwardResponse.hasMoreBackward,
|
|
12904
|
-
hasMoreForward: backwardResponse.hasMoreForward,
|
|
12905
|
-
items: backwardResponse.items,
|
|
12906
|
-
nextBackwardToken: backwardResponse.nextBackwardToken,
|
|
12907
|
-
nextForwardToken: backwardResponse.nextForwardToken,
|
|
12908
|
-
token: backwardPage?.token,
|
|
12909
|
-
tokenDirection: "backward"
|
|
12910
|
-
});
|
|
12911
|
-
items.push(...backwardResponse.items);
|
|
12912
|
-
}
|
|
12913
|
-
if (forwardResponse) {
|
|
12914
|
-
pages2.push({
|
|
12915
|
-
hasMoreBackward: forwardResponse.hasMoreBackward,
|
|
12916
|
-
hasMoreForward: forwardResponse.hasMoreForward,
|
|
12917
|
-
items: forwardResponse.items,
|
|
12918
|
-
nextBackwardToken: forwardResponse.nextBackwardToken,
|
|
12919
|
-
nextForwardToken: forwardResponse.nextForwardToken,
|
|
12920
|
-
token: forwardPage?.token,
|
|
12921
|
-
tokenDirection: "forward"
|
|
12922
|
-
});
|
|
12923
|
-
items.push(...forwardResponse.items);
|
|
12924
|
-
}
|
|
12925
|
-
reportDataChange();
|
|
12926
|
-
if (hasMoreForward() === false) {
|
|
12927
|
-
fetchForwardLater = true;
|
|
12928
|
-
}
|
|
12929
|
-
} catch (error) {
|
|
12930
|
-
reportError(error instanceof Error ? error : new Error("Failed to fetch forward page", { cause: error }));
|
|
12931
|
-
} finally {
|
|
12932
|
-
refetching = false;
|
|
12933
|
-
reportStatusChange();
|
|
12934
|
-
}
|
|
12935
|
-
runPostFetchActions();
|
|
12936
|
-
};
|
|
12937
12889
|
const runPostFetchActions = () => {
|
|
12938
12890
|
if (fetchBackwardLater) {
|
|
12939
12891
|
fetchBackwardLater = false;
|
|
@@ -12943,41 +12895,25 @@ var createPaginationBuffer = (options) => {
|
|
|
12943
12895
|
fetchForwardLater = false;
|
|
12944
12896
|
void fetchForward();
|
|
12945
12897
|
}
|
|
12946
|
-
if (refetchCurrentLater) {
|
|
12947
|
-
refetchCurrentLater = false;
|
|
12948
|
-
void refetchCurrent();
|
|
12949
|
-
}
|
|
12950
12898
|
};
|
|
12951
12899
|
return {
|
|
12900
|
+
clear: () => {
|
|
12901
|
+
if (items !== void 0) {
|
|
12902
|
+
items.length = 0;
|
|
12903
|
+
reportDataChange();
|
|
12904
|
+
}
|
|
12905
|
+
},
|
|
12952
12906
|
fetchBackward: () => {
|
|
12953
12907
|
if (fetchingForward || fetchingBackward) {
|
|
12954
12908
|
return;
|
|
12955
12909
|
}
|
|
12956
|
-
if (refetching) {
|
|
12957
|
-
fetchBackwardLater = true;
|
|
12958
|
-
return;
|
|
12959
|
-
}
|
|
12960
12910
|
void fetchBackward();
|
|
12961
12911
|
},
|
|
12962
12912
|
fetchForward: () => {
|
|
12963
12913
|
if (fetchingForward || fetchingBackward) {
|
|
12964
12914
|
return;
|
|
12965
12915
|
}
|
|
12966
|
-
if (refetching) {
|
|
12967
|
-
fetchForwardLater = true;
|
|
12968
|
-
return;
|
|
12969
|
-
}
|
|
12970
12916
|
void fetchForward();
|
|
12971
|
-
},
|
|
12972
|
-
refetchCurrent: () => {
|
|
12973
|
-
if (fetchingForward || fetchingBackward || refetching) {
|
|
12974
|
-
refetchCurrentLater = true;
|
|
12975
|
-
return;
|
|
12976
|
-
}
|
|
12977
|
-
if (refetchCurrentLater) {
|
|
12978
|
-
return;
|
|
12979
|
-
}
|
|
12980
|
-
void refetchCurrent();
|
|
12981
12917
|
}
|
|
12982
12918
|
};
|
|
12983
12919
|
};
|
|
@@ -13269,7 +13205,7 @@ function useSpansWebSocket(options) {
|
|
|
13269
13205
|
}
|
|
13270
13206
|
|
|
13271
13207
|
// src/hooks/use-spans.ts
|
|
13272
|
-
var PAGE_SIZE =
|
|
13208
|
+
var PAGE_SIZE = 30;
|
|
13273
13209
|
var useSpans = () => {
|
|
13274
13210
|
const api = useAppInspectorApi();
|
|
13275
13211
|
const [spans, setSpans] = (0, import_react46.useState)();
|
|
@@ -13278,9 +13214,9 @@ var useSpans = () => {
|
|
|
13278
13214
|
const [fetchingBackward, setFetchingBackward] = (0, import_react46.useState)(false);
|
|
13279
13215
|
const [refetching, setRefetching] = (0, import_react46.useState)(false);
|
|
13280
13216
|
const paginationBuffer = (0, import_react46.useRef)(createPaginationBuffer({
|
|
13281
|
-
async fetchPage(token
|
|
13217
|
+
async fetchPage(token) {
|
|
13282
13218
|
const response = await api.getSpans({
|
|
13283
|
-
limit,
|
|
13219
|
+
limit: PAGE_SIZE,
|
|
13284
13220
|
pagination_token: token
|
|
13285
13221
|
});
|
|
13286
13222
|
return {
|
|
@@ -13292,6 +13228,7 @@ var useSpans = () => {
|
|
|
13292
13228
|
};
|
|
13293
13229
|
},
|
|
13294
13230
|
onDataChange: ({ hasMoreBackward: hasMoreBackward2, hasMoreForward: hasMoreForward2, items }) => {
|
|
13231
|
+
setFetchError(void 0);
|
|
13295
13232
|
setSpans(items);
|
|
13296
13233
|
setHasMoreBackward(hasMoreBackward2);
|
|
13297
13234
|
setHasMoreForward(hasMoreForward2);
|
|
@@ -13304,7 +13241,12 @@ var useSpans = () => {
|
|
|
13304
13241
|
setFetchingForward(status2.fetchingForward);
|
|
13305
13242
|
setRefetching(status2.refetching);
|
|
13306
13243
|
},
|
|
13307
|
-
|
|
13244
|
+
// The spans endpoint is sorted by span ingestion time, which might differ from
|
|
13245
|
+
// the span timestamp. In order to accomodate for this, we will sort the spans
|
|
13246
|
+
// in the frontend with the following sort comparator.
|
|
13247
|
+
sortComparator(a2, b2) {
|
|
13248
|
+
return a2.start_time_unix_nano < b2.start_time_unix_nano ? -1 : 1;
|
|
13249
|
+
}
|
|
13308
13250
|
}));
|
|
13309
13251
|
const [hasMoreBackward, setHasMoreBackward] = (0, import_react46.useState)();
|
|
13310
13252
|
const [hasMoreForward, setHasMoreForward] = (0, import_react46.useState)();
|
|
@@ -13318,28 +13260,22 @@ var useSpans = () => {
|
|
|
13318
13260
|
fetchForward();
|
|
13319
13261
|
}, [fetchForward]);
|
|
13320
13262
|
const { checkStatus, error: statusError, status } = useStatus();
|
|
13321
|
-
const refreshSpans = (0, import_react46.useCallback)(() => {
|
|
13322
|
-
paginationBuffer.current.refetchCurrent();
|
|
13323
|
-
}, []);
|
|
13324
|
-
(0, import_react46.useEffect)(() => {
|
|
13325
|
-
refreshSpans();
|
|
13326
|
-
}, [refreshSpans]);
|
|
13327
13263
|
const [clearingSpans, setClearingSpans] = (0, import_react46.useState)(false);
|
|
13328
13264
|
const clearSpans = (0, import_react46.useCallback)(async () => {
|
|
13329
13265
|
setClearingSpans(true);
|
|
13330
13266
|
try {
|
|
13331
13267
|
await api.deleteSpans();
|
|
13332
|
-
|
|
13268
|
+
paginationBuffer.current.clear();
|
|
13333
13269
|
} catch (error) {
|
|
13334
13270
|
console.error("Failed to delete spans:", error);
|
|
13335
13271
|
setFetchError(error instanceof Error ? error : new Error("Failed to delete spans", { cause: error }));
|
|
13336
13272
|
} finally {
|
|
13337
13273
|
setClearingSpans(false);
|
|
13338
13274
|
}
|
|
13339
|
-
}, [
|
|
13275
|
+
}, [paginationBuffer, api]);
|
|
13340
13276
|
useSpansWebSocket({
|
|
13341
13277
|
onMessage: () => {
|
|
13342
|
-
|
|
13278
|
+
paginationBuffer.current.fetchForward();
|
|
13343
13279
|
}
|
|
13344
13280
|
});
|
|
13345
13281
|
return {
|
|
@@ -13354,7 +13290,6 @@ var useSpans = () => {
|
|
|
13354
13290
|
hasMoreBackward,
|
|
13355
13291
|
hasMoreForward,
|
|
13356
13292
|
refetching,
|
|
13357
|
-
refreshSpans,
|
|
13358
13293
|
spans,
|
|
13359
13294
|
status,
|
|
13360
13295
|
statusError
|
|
@@ -14880,7 +14815,6 @@ var SpansListPage = () => {
|
|
|
14880
14815
|
hasMoreBackward,
|
|
14881
14816
|
hasMoreForward,
|
|
14882
14817
|
refetching,
|
|
14883
|
-
refreshSpans,
|
|
14884
14818
|
spans,
|
|
14885
14819
|
status,
|
|
14886
14820
|
statusError
|
|
@@ -14933,7 +14867,6 @@ var SpansListPage = () => {
|
|
|
14933
14867
|
onClearSpans: clearSpansSync,
|
|
14934
14868
|
onFetchBackward: fetchBackward,
|
|
14935
14869
|
onFetchForward: fetchForward,
|
|
14936
|
-
onRefresh: refreshSpans,
|
|
14937
14870
|
onSpanClick: navigateToSpan,
|
|
14938
14871
|
refetching,
|
|
14939
14872
|
spans
|