watch-tail 0.9.0 → 0.10.0
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 +103 -8
- package/build/client/_app/immutable/assets/0.B5hI3s8c.css +2 -0
- package/build/client/_app/immutable/assets/0.B5hI3s8c.css.br +0 -0
- package/build/client/_app/immutable/assets/0.B5hI3s8c.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.Cn4w1JYv.css +1 -0
- package/build/client/_app/immutable/assets/2.Cn4w1JYv.css.br +0 -0
- package/build/client/_app/immutable/assets/2.Cn4w1JYv.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B2En4t_E.js +3 -0
- package/build/client/_app/immutable/chunks/B2En4t_E.js.br +0 -0
- package/build/client/_app/immutable/chunks/B2En4t_E.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJ7fEbY9.js +1 -0
- package/build/client/_app/immutable/chunks/BJ7fEbY9.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJ7fEbY9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D7vimbmk.js → BX0v2q9h.js} +1 -1
- package/build/client/_app/immutable/chunks/BX0v2q9h.js.br +0 -0
- package/build/client/_app/immutable/chunks/BX0v2q9h.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DwOZdLDj.js → B_AZHMkI.js} +1 -1
- package/build/client/_app/immutable/chunks/B_AZHMkI.js.br +0 -0
- package/build/client/_app/immutable/chunks/B_AZHMkI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{dqF8mxBW.js → Bb9UOIo-.js} +1 -1
- package/build/client/_app/immutable/chunks/Bb9UOIo-.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bb9UOIo-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{0b2v80OK.js → BdV_pkVs.js} +1 -1
- package/build/client/_app/immutable/chunks/BdV_pkVs.js.br +0 -0
- package/build/client/_app/immutable/chunks/BdV_pkVs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{C_U_Jvk5.js → BsrUsB47.js} +1 -1
- package/build/client/_app/immutable/chunks/BsrUsB47.js.br +0 -0
- package/build/client/_app/immutable/chunks/BsrUsB47.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DvxMaQv_.js → CHnbfiIG.js} +1 -1
- package/build/client/_app/immutable/chunks/CHnbfiIG.js.br +0 -0
- package/build/client/_app/immutable/chunks/CHnbfiIG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DS3cLPAu.js → CNomy7CF.js} +1 -1
- package/build/client/_app/immutable/chunks/CNomy7CF.js.br +0 -0
- package/build/client/_app/immutable/chunks/CNomy7CF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CPbNf3ya.js +1 -0
- package/build/client/_app/immutable/chunks/CPbNf3ya.js.br +0 -0
- package/build/client/_app/immutable/chunks/CPbNf3ya.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZ2PC-zH.js +1 -0
- package/build/client/_app/immutable/chunks/CZ2PC-zH.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZ2PC-zH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CljxK204.js +1 -0
- package/build/client/_app/immutable/chunks/CljxK204.js.br +1 -0
- package/build/client/_app/immutable/chunks/CljxK204.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CzU0cUz4.js +1 -0
- package/build/client/_app/immutable/chunks/CzU0cUz4.js.br +0 -0
- package/build/client/_app/immutable/chunks/CzU0cUz4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B5RiPG8Z.js → D6vIi1r5.js} +1 -1
- package/build/client/_app/immutable/chunks/D6vIi1r5.js.br +3 -0
- package/build/client/_app/immutable/chunks/D6vIi1r5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DAxERhtN.js +1 -0
- package/build/client/_app/immutable/chunks/DAxERhtN.js.br +0 -0
- package/build/client/_app/immutable/chunks/DAxERhtN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DIzgJaYS.js +1 -0
- package/build/client/_app/immutable/chunks/DIzgJaYS.js.br +0 -0
- package/build/client/_app/immutable/chunks/DIzgJaYS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DSHrbzz3.js +1 -0
- package/build/client/_app/immutable/chunks/DSHrbzz3.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSHrbzz3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Dkh4Dwm8.js → DSvLImpl.js} +1 -1
- package/build/client/_app/immutable/chunks/DSvLImpl.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSvLImpl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{b77-bq1n.js → DWBod19x.js} +1 -1
- package/build/client/_app/immutable/chunks/DWBod19x.js.br +0 -0
- package/build/client/_app/immutable/chunks/DWBod19x.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{IlwbfbOu.js → Dicxo5h-.js} +1 -1
- package/build/client/_app/immutable/chunks/Dicxo5h-.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dicxo5h-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjjHmSG3.js +1 -0
- package/build/client/_app/immutable/chunks/DjjHmSG3.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjjHmSG3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DlDLXtam.js +1 -0
- package/build/client/_app/immutable/chunks/DlDLXtam.js.br +0 -0
- package/build/client/_app/immutable/chunks/DlDLXtam.js.gz +0 -0
- package/build/client/_app/immutable/chunks/EZJqWoh3.js +1 -0
- package/build/client/_app/immutable/chunks/EZJqWoh3.js.br +0 -0
- package/build/client/_app/immutable/chunks/EZJqWoh3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Fg8W5tkO.js +15 -0
- package/build/client/_app/immutable/chunks/Fg8W5tkO.js.br +0 -0
- package/build/client/_app/immutable/chunks/Fg8W5tkO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/LGzrUxfF.js +1 -0
- package/build/client/_app/immutable/chunks/LGzrUxfF.js.br +0 -0
- package/build/client/_app/immutable/chunks/LGzrUxfF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/McME9wI6.js +10 -0
- package/build/client/_app/immutable/chunks/McME9wI6.js.br +0 -0
- package/build/client/_app/immutable/chunks/McME9wI6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/N78Fm5Ux.js +1 -0
- package/build/client/_app/immutable/chunks/N78Fm5Ux.js.br +0 -0
- package/build/client/_app/immutable/chunks/N78Fm5Ux.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DQqLOGLe.js → XrAcf7YH.js} +1 -1
- package/build/client/_app/immutable/chunks/XrAcf7YH.js.br +0 -0
- package/build/client/_app/immutable/chunks/XrAcf7YH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{aI_O2VuQ.js → _PJhUOmT.js} +1 -1
- package/build/client/_app/immutable/chunks/_PJhUOmT.js.br +0 -0
- package/build/client/_app/immutable/chunks/_PJhUOmT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gXyWwJbW.js +1 -0
- package/build/client/_app/immutable/chunks/gXyWwJbW.js.br +0 -0
- package/build/client/_app/immutable/chunks/gXyWwJbW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DGYKsRyW.js → vMHl7jRw.js} +1 -1
- package/build/client/_app/immutable/chunks/vMHl7jRw.js.br +0 -0
- package/build/client/_app/immutable/chunks/vMHl7jRw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/xJTjOoUQ.js +2 -0
- package/build/client/_app/immutable/chunks/xJTjOoUQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/xJTjOoUQ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.ycJtqzGh.js +2 -0
- package/build/client/_app/immutable/entry/app.ycJtqzGh.js.br +0 -0
- package/build/client/_app/immutable/entry/app.ycJtqzGh.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DOq0-PiA.js +1 -0
- package/build/client/_app/immutable/entry/start.DOq0-PiA.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DOq0-PiA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.D63E8Q6i.js +1 -0
- package/build/client/_app/immutable/nodes/0.D63E8Q6i.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.D63E8Q6i.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B63I-h1v.js +1 -0
- package/build/client/_app/immutable/nodes/1.B63I-h1v.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B63I-h1v.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js +5 -0
- package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +7 -7
- package/build/index.js +7 -7
- package/build/server/chunks/chunks/{Arc.canvas.js-CN0KDoHG.js → Arc.canvas.js-DqfSjlnB.js} +8 -8
- package/build/server/chunks/chunks/{Arc.canvas.js-CN0KDoHG.js.map → Arc.canvas.js-DqfSjlnB.js.map} +1 -1
- package/build/server/chunks/chunks/{Arc.js-C8EC9NoE.js → Arc.js-DNywwEq7.js} +10 -10
- package/build/server/chunks/chunks/{Arc.js-C8EC9NoE.js.map → Arc.js-DNywwEq7.js.map} +1 -1
- package/build/server/chunks/chunks/{Bar.js-DtAb3LZZ.js → Bar.js-BHJrwOa1.js} +14 -14
- package/build/server/chunks/chunks/{Bar.js-DtAb3LZZ.js.map → Bar.js-BHJrwOa1.js.map} +1 -1
- package/build/server/chunks/chunks/{ChartAnnotations.js-twzDSVzY.js → ChartAnnotations.js-DXt38zkt.js} +18 -18
- package/build/server/chunks/chunks/{ChartAnnotations.js-twzDSVzY.js.map → ChartAnnotations.js-DXt38zkt.js.map} +1 -1
- package/build/server/chunks/chunks/{Circle.html.js-BJywADGK.js → Circle.html.js-KngSXZUe.js} +5 -5
- package/build/server/chunks/chunks/{Circle.html.js-BJywADGK.js.map → Circle.html.js-KngSXZUe.js.map} +1 -1
- package/build/server/chunks/chunks/{ClipPath.canvas.js-9Fc0bTEM.js → ClipPath.canvas.js-BsGsfzQK.js} +4 -4
- package/build/server/chunks/chunks/{ClipPath.canvas.js-9Fc0bTEM.js.map → ClipPath.canvas.js-BsGsfzQK.js.map} +1 -1
- package/build/server/chunks/chunks/{DefaultTooltip.js-C2NWK2AD.js → DefaultTooltip.js-CbyljZUi.js} +8 -8
- package/build/server/chunks/chunks/{DefaultTooltip.js-C2NWK2AD.js.map → DefaultTooltip.js-CbyljZUi.js.map} +1 -1
- package/build/server/chunks/chunks/{EventScatter.js-CO2GonW-.js → EventScatter.js-DHlLEn_7.js} +36 -35
- package/build/server/chunks/chunks/{EventScatter.js-CO2GonW-.js.map → EventScatter.js-DHlLEn_7.js.map} +1 -1
- package/build/server/chunks/chunks/{Labels.js-DB9qoyZ3.js → Labels.js-DhpbhJmV.js} +18 -18
- package/build/server/chunks/chunks/{Labels.js-DB9qoyZ3.js.map → Labels.js-DhpbhJmV.js.map} +1 -1
- package/build/server/chunks/chunks/{Legend.js-B_ArjxQ7.js → Legend.js-D25j2DRt.js} +6 -6
- package/build/server/chunks/chunks/{Legend.js-B_ArjxQ7.js.map → Legend.js-D25j2DRt.js.map} +1 -1
- package/build/server/chunks/chunks/{Line.html.js-B1REcOFe.js → Line.html.js-CKb2T7JC.js} +6 -6
- package/build/server/chunks/chunks/{Line.html.js-B1REcOFe.js.map → Line.html.js-CKb2T7JC.js.map} +1 -1
- package/build/server/chunks/chunks/{Link.canvas.js-nWimAHfH.js → Link.canvas.js-c0r05107.js} +9 -9
- package/build/server/chunks/chunks/{Link.canvas.js-nWimAHfH.js.map → Link.canvas.js-c0r05107.js.map} +1 -1
- package/build/server/chunks/chunks/{Path.canvas.js-5A9wB8zQ.js → Path.canvas.js-opfoYzQB.js} +5 -5
- package/build/server/chunks/chunks/{Path.canvas.js-5A9wB8zQ.js.map → Path.canvas.js-opfoYzQB.js.map} +1 -1
- package/build/server/chunks/chunks/{Points.html.js-B2o3k-ZZ.js → Points.html.js-CJ75UtkE.js} +7 -7
- package/build/server/chunks/chunks/{Points.html.js-B2o3k-ZZ.js.map → Points.html.js-CJ75UtkE.js.map} +1 -1
- package/build/server/chunks/chunks/Points.js-Bx_vB0po.js +14 -0
- package/build/server/chunks/chunks/Points.js-Bx_vB0po.js.map +1 -0
- package/build/server/chunks/chunks/{Points2.js-BVbWugLT.js → Points2.js-Br2MMKbn.js} +4 -4
- package/build/server/chunks/chunks/{Points2.js-BVbWugLT.js.map → Points2.js-Br2MMKbn.js.map} +1 -1
- package/build/server/chunks/chunks/{Rect.html.js-DnQ6ObhQ.js → Rect.html.js-D_-JSZ22.js} +6 -6
- package/build/server/chunks/chunks/{Rect.html.js-DnQ6ObhQ.js.map → Rect.html.js-D_-JSZ22.js.map} +1 -1
- package/build/server/chunks/chunks/{Spline.js-YnAxvrKY.js → Spline.js-DpD4175j.js} +12 -12
- package/build/server/chunks/chunks/{Spline.js-YnAxvrKY.js.map → Spline.js-DpD4175j.js.map} +1 -1
- package/build/server/chunks/chunks/{Text.html.js-LbmYJb11.js → Text.html.js-Clxo39Ky.js} +6 -6
- package/build/server/chunks/chunks/{Text.html.js-LbmYJb11.js.map → Text.html.js-Clxo39Ky.js.map} +1 -1
- package/build/server/chunks/chunks/{TooltipItem.js-Ce-blieA.js → TooltipItem.js-CgYSF3I3.js} +6 -6
- package/build/server/chunks/chunks/{TooltipItem.js-Ce-blieA.js.map → TooltipItem.js-CgYSF3I3.js.map} +1 -1
- package/build/server/chunks/chunks/{Voronoi.js-CalFJAXH.js → Voronoi.js-CX8bqc1A.js} +7 -7
- package/build/server/chunks/chunks/{Voronoi.js-CalFJAXH.js.map → Voronoi.js-CX8bqc1A.js.map} +1 -1
- package/build/server/chunks/chunks/{archive.js-D2jtMmDo.js → archive.js-BRlkdj2X.js} +331 -30
- package/build/server/chunks/chunks/archive.js-BRlkdj2X.js.map +1 -0
- package/build/server/chunks/chunks/{attributes.js-CbKEpZKa.js → attributes.js-ECgqVV_7.js} +2 -2
- package/build/server/chunks/chunks/{attributes.js-CbKEpZKa.js.map → attributes.js-ECgqVV_7.js.map} +1 -1
- package/build/server/chunks/chunks/{band.js-CjzHWr4k.js → band.js-BcI84M0Z.js} +3 -3
- package/build/server/chunks/chunks/{band.js-CjzHWr4k.js.map → band.js-BcI84M0Z.js.map} +1 -1
- package/build/server/chunks/chunks/{common.js-BvQnfkFo.js → common.js-DeZxUyRN.js} +2 -2
- package/build/server/chunks/chunks/{common.js-BvQnfkFo.js.map → common.js-DeZxUyRN.js.map} +1 -1
- package/build/server/chunks/chunks/{events.js-zIVaXIP1.js → events.js-oxLu7lhH.js} +2 -2
- package/build/server/chunks/chunks/{events.js-zIVaXIP1.js.map → events.js-oxLu7lhH.js.map} +1 -1
- package/build/server/chunks/chunks/{group.js-D0SfevId.js → group.js-C8H9Tpr6.js} +2 -2
- package/build/server/chunks/chunks/{group.js-D0SfevId.js.map → group.js-C8H9Tpr6.js.map} +1 -1
- package/build/server/chunks/chunks/{index-server.js-CtH9Hqwf.js → index-server.js-Dsi44azJ.js} +91 -2
- package/build/server/chunks/chunks/index-server.js-Dsi44azJ.js.map +1 -0
- package/build/server/chunks/chunks/{internal2.js-CfVVfAb5.js → internal2.js-Dm0TlpeP.js} +5 -5
- package/build/server/chunks/chunks/{internal2.js-CfVVfAb5.js.map → internal2.js-Dm0TlpeP.js.map} +1 -1
- package/build/server/chunks/chunks/{key.svelte.js-Cq0L6YlN.js → key.svelte.js-C9G4pBhE.js} +4 -4
- package/build/server/chunks/chunks/{key.svelte.js-Cq0L6YlN.js.map → key.svelte.js-C9G4pBhE.js.map} +1 -1
- package/build/server/chunks/chunks/{legacy-client.js-DAqKExQD.js → legacy-client.js-C8Upo6IB.js} +3 -3
- package/build/server/chunks/chunks/legacy-client.js-C8Upo6IB.js.map +1 -0
- package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js → level-filter.js-H0nc-2BG.js} +2 -2
- package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js.map → level-filter.js-H0nc-2BG.js.map} +1 -1
- package/build/server/chunks/chunks/{lineRadial.js-B7ZNP_Jp.js → lineRadial.js-B0m9ujVX.js} +2 -2
- package/build/server/chunks/chunks/{lineRadial.js-B7ZNP_Jp.js.map → lineRadial.js-B0m9ujVX.js.map} +1 -1
- package/build/server/chunks/chunks/{linear.js-CHlwr1I4.js → linear.js-CJ07spu6.js} +2 -2
- package/build/server/chunks/chunks/{linear.js-CHlwr1I4.js.map → linear.js-CJ07spu6.js.map} +1 -1
- package/build/server/chunks/chunks/{motion.svelte.js-Crk8ri1u.js → motion.svelte.js-DB7vkWmD.js} +3 -3
- package/build/server/chunks/chunks/{motion.svelte.js-Crk8ri1u.js.map → motion.svelte.js-DB7vkWmD.js.map} +1 -1
- package/build/server/chunks/chunks/{occlusion.js-ot9_OqWn.js → occlusion.js-DtcqoJjc.js} +2 -2
- package/build/server/chunks/chunks/{occlusion.js-ot9_OqWn.js.map → occlusion.js-DtcqoJjc.js.map} +1 -1
- package/build/server/chunks/chunks/{path2.js-DLVU8nc9.js → path2.js-B3tNByoS.js} +2 -2
- package/build/server/chunks/chunks/{path2.js-DLVU8nc9.js.map → path2.js-B3tNByoS.js.map} +1 -1
- package/build/server/chunks/chunks/{rect.svelte.js-_0PgI5fe.js → rect.svelte.js-C6R1SgCx.js} +4 -4
- package/build/server/chunks/chunks/{rect.svelte.js-_0PgI5fe.js.map → rect.svelte.js-C6R1SgCx.js.map} +1 -1
- package/build/server/chunks/chunks/{scales.svelte.js-DeNkKcI-.js → scales.svelte.js-C4lRvUAb.js} +4 -4
- package/build/server/chunks/chunks/{scales.svelte.js-DeNkKcI-.js.map → scales.svelte.js-C4lRvUAb.js.map} +1 -1
- package/build/server/chunks/chunks/{state.js-i-NVNGIq.js → state.js-qsHzjuJU.js} +3 -3
- package/build/server/chunks/chunks/{state.js-i-NVNGIq.js.map → state.js-qsHzjuJU.js.map} +1 -1
- package/build/server/chunks/chunks/text-size.svelte.js-CqGaHRr3.js +310 -0
- package/build/server/chunks/chunks/text-size.svelte.js-CqGaHRr3.js.map +1 -0
- package/build/server/chunks/chunks/{time-range.js-BLMT8aU3.js → time-range.js-__87ZPq6.js} +10 -5
- package/build/server/chunks/chunks/time-range.js-__87ZPq6.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js → _server.ts.js-C6WY-ljy.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js.map → _server.ts.js-C6WY-ljy.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js → _server.ts.js-DTcVSbpV.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js.map → _server.ts.js-DTcVSbpV.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js → _server.ts.js-CzJ_bXh8.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js.map → _server.ts.js-CzJ_bXh8.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-BxXw5K0R.js → _server.ts.js-U2naV16N.js} +211 -48
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-U2naV16N.js.map +1 -0
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-ylsqA41Y.js → error.svelte.js-ClTGKP0-.js} +6 -6
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-ylsqA41Y.js.map → error.svelte.js-ClTGKP0-.js.map} +1 -1
- package/build/server/chunks/entries/pages/_layout.svelte.js-DNuWb03K.js +622 -0
- package/build/server/chunks/entries/pages/_layout.svelte.js-DNuWb03K.js.map +1 -0
- package/build/server/chunks/entries/pages/{_page.svelte.js-C9-7d7mD.js → _page.svelte.js-CVlL2UsO.js} +329 -188
- package/build/server/chunks/entries/pages/_page.svelte.js-CVlL2UsO.js.map +1 -0
- package/build/server/chunks/{handler-Bqo8aDgP.js → handler-CrpvMheE.js} +3 -3
- package/build/server/chunks/{handler-Bqo8aDgP.js.map → handler-CrpvMheE.js.map} +1 -1
- package/build/server/chunks/{index.js-fPvMujCL.js → index.js-9Dk7Q13E.js} +3 -3
- package/build/server/chunks/{index.js-fPvMujCL.js.map → index.js-9Dk7Q13E.js.map} +1 -1
- package/build/server/chunks/{manifest.js-Bkj-8GaD.js → manifest.js-DIaODzKX.js} +9 -9
- package/build/server/chunks/{manifest.js-Bkj-8GaD.js.map → manifest.js-DIaODzKX.js.map} +1 -1
- package/build/server/chunks/nodes/0.js-CQ960AOW.js +9 -0
- package/build/server/chunks/nodes/0.js-CQ960AOW.js.map +1 -0
- package/build/server/chunks/nodes/1.js-CtTei4sV.js +9 -0
- package/build/server/chunks/nodes/{1.js-DZXnUx67.js.map → 1.js-CtTei4sV.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-BbKDb_M6.js +9 -0
- package/build/server/chunks/nodes/2.js-BbKDb_M6.js.map +1 -0
- package/dist/cli/completions.js +24 -0
- package/dist/cli/index.js +144 -3
- package/dist/cli/mcp/agents.js +344 -0
- package/dist/cli/mcp/backend.js +235 -0
- package/dist/cli/mcp/run.js +245 -0
- package/dist/cli/mcp/stdio.js +103 -0
- package/dist/cli/mcp/tools.js +245 -0
- package/dist/cli/options.js +138 -25
- package/dist/cli/server.js +28 -0
- package/dist/cli/ui.js +20 -1
- package/dist/lib/time-range.js +14 -3
- package/package.json +8 -2
- package/build/client/_app/immutable/assets/0.ChTKqSf6.css +0 -2
- package/build/client/_app/immutable/assets/0.ChTKqSf6.css.br +0 -0
- package/build/client/_app/immutable/assets/0.ChTKqSf6.css.gz +0 -0
- package/build/client/_app/immutable/chunks/0b2v80OK.js.br +0 -0
- package/build/client/_app/immutable/chunks/0b2v80OK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/5EFAIHuJ.js +0 -1
- package/build/client/_app/immutable/chunks/5EFAIHuJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/5EFAIHuJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B15XBe8D.js +0 -1
- package/build/client/_app/immutable/chunks/B15XBe8D.js.br +0 -0
- package/build/client/_app/immutable/chunks/B15XBe8D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5RiPG8Z.js.br +0 -2
- package/build/client/_app/immutable/chunks/B5RiPG8Z.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B_KVdCQT.js +0 -10
- package/build/client/_app/immutable/chunks/B_KVdCQT.js.br +0 -0
- package/build/client/_app/immutable/chunks/B_KVdCQT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BuCpRsEL.js +0 -1
- package/build/client/_app/immutable/chunks/BuCpRsEL.js.br +0 -0
- package/build/client/_app/immutable/chunks/BuCpRsEL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BvZtsVvW.js +0 -1
- package/build/client/_app/immutable/chunks/BvZtsVvW.js.br +0 -0
- package/build/client/_app/immutable/chunks/BvZtsVvW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C3Y15ONf.js +0 -2
- package/build/client/_app/immutable/chunks/C3Y15ONf.js.br +0 -0
- package/build/client/_app/immutable/chunks/C3Y15ONf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C9GPQYs7.js +0 -1
- package/build/client/_app/immutable/chunks/C9GPQYs7.js.br +0 -0
- package/build/client/_app/immutable/chunks/C9GPQYs7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_U_Jvk5.js.br +0 -0
- package/build/client/_app/immutable/chunks/C_U_Jvk5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cd7JqZj9.js +0 -1
- package/build/client/_app/immutable/chunks/Cd7JqZj9.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cd7JqZj9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D2PbcyDU.js +0 -1
- package/build/client/_app/immutable/chunks/D2PbcyDU.js.br +0 -0
- package/build/client/_app/immutable/chunks/D2PbcyDU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D7vimbmk.js.br +0 -0
- package/build/client/_app/immutable/chunks/D7vimbmk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DAqXSYzi.js +0 -1
- package/build/client/_app/immutable/chunks/DAqXSYzi.js.br +0 -0
- package/build/client/_app/immutable/chunks/DAqXSYzi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DGYKsRyW.js.br +0 -0
- package/build/client/_app/immutable/chunks/DGYKsRyW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DPaulGql.js +0 -1
- package/build/client/_app/immutable/chunks/DPaulGql.js.br +0 -1
- package/build/client/_app/immutable/chunks/DPaulGql.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DQqLOGLe.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQqLOGLe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DS3cLPAu.js.br +0 -0
- package/build/client/_app/immutable/chunks/DS3cLPAu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dkh4Dwm8.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dkh4Dwm8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DnqfXHAL.js +0 -15
- package/build/client/_app/immutable/chunks/DnqfXHAL.js.br +0 -0
- package/build/client/_app/immutable/chunks/DnqfXHAL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DsYron7_.js +0 -1
- package/build/client/_app/immutable/chunks/DsYron7_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DsYron7_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DuM1cPdZ.js +0 -1
- package/build/client/_app/immutable/chunks/DuM1cPdZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DuM1cPdZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DvxMaQv_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DvxMaQv_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DwOZdLDj.js.br +0 -0
- package/build/client/_app/immutable/chunks/DwOZdLDj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/IlwbfbOu.js.br +0 -0
- package/build/client/_app/immutable/chunks/IlwbfbOu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/aI_O2VuQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/aI_O2VuQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/b77-bq1n.js.br +0 -0
- package/build/client/_app/immutable/chunks/b77-bq1n.js.gz +0 -0
- package/build/client/_app/immutable/chunks/dqF8mxBW.js.br +0 -0
- package/build/client/_app/immutable/chunks/dqF8mxBW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gkAHSOnS.js +0 -1
- package/build/client/_app/immutable/chunks/gkAHSOnS.js.br +0 -0
- package/build/client/_app/immutable/chunks/gkAHSOnS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js +0 -3
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js.br +0 -0
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ti8ecMFX.js +0 -1
- package/build/client/_app/immutable/chunks/ti8ecMFX.js.br +0 -0
- package/build/client/_app/immutable/chunks/ti8ecMFX.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CTR4aUFT.js +0 -2
- package/build/client/_app/immutable/entry/app.CTR4aUFT.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CTR4aUFT.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CC6Ln8E2.js +0 -1
- package/build/client/_app/immutable/entry/start.CC6Ln8E2.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CC6Ln8E2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CvUxmLsM.js +0 -1
- package/build/client/_app/immutable/nodes/0.CvUxmLsM.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CvUxmLsM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CbSHqfEx.js +0 -1
- package/build/client/_app/immutable/nodes/1.CbSHqfEx.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.CbSHqfEx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DcD5v8dU.js +0 -5
- package/build/client/_app/immutable/nodes/2.DcD5v8dU.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DcD5v8dU.js.gz +0 -0
- package/build/server/chunks/chunks/Points.js-D7ozN9W5.js +0 -14
- package/build/server/chunks/chunks/Points.js-D7ozN9W5.js.map +0 -1
- package/build/server/chunks/chunks/archive.js-D2jtMmDo.js.map +0 -1
- package/build/server/chunks/chunks/index-server.js-CtH9Hqwf.js.map +0 -1
- package/build/server/chunks/chunks/legacy-client.js-DAqKExQD.js.map +0 -1
- package/build/server/chunks/chunks/time-range.js-BLMT8aU3.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BxXw5K0R.js.map +0 -1
- package/build/server/chunks/entries/pages/_layout.svelte.js-D7sAdBVX.js +0 -113
- package/build/server/chunks/entries/pages/_layout.svelte.js-D7sAdBVX.js.map +0 -1
- package/build/server/chunks/entries/pages/_page.svelte.js-C9-7d7mD.js.map +0 -1
- package/build/server/chunks/nodes/0.js-7J6kXnEo.js +0 -9
- package/build/server/chunks/nodes/0.js-7J6kXnEo.js.map +0 -1
- package/build/server/chunks/nodes/1.js-DZXnUx67.js +0 -9
- package/build/server/chunks/nodes/2.js-85y9-1SS.js +0 -9
- package/build/server/chunks/nodes/2.js-85y9-1SS.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts.js-DibT3Hjc.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/series/_server.ts.js"],"sourcesContent":["import { c as resolveAwsConfig, r as REGION_PARAM_HINT, s as parseRegionParam, t as readEnv, u as apiError } from \"../../../../chunks/env2.js\";\nimport { t as getArchive } from \"../../../../chunks/archive.js\";\nimport { n as parseSourceParam, t as SOURCE_PARAM_HINT } from \"../../../../chunks/source.js\";\nimport { i as parseGroupParams, n as parseLevelParam, o as parseDurationMs, s as resolveWindow, t as LEVEL_PARAM_HINT } from \"../../../../chunks/level-filter.js\";\nimport { json } from \"@sveltejs/kit\";\n//#region src/lib/server/series.ts\n/** Message used when a caller asks for a series the app cannot aggregate. */\nvar SERIES_SOURCE_HINT = \"Series are only aggregated for source=archive; a live CloudWatch view buckets the events it has loaded\";\n/** Missing metrics retain counts; unsupported metrics must not silently select a chart. */\nfunction parseMetricParam(value) {\n\tconst metric = value?.trim().toLowerCase();\n\tif (!metric || metric === \"count\") return \"count\";\n\treturn metric === \"duration\" ? \"duration\" : null;\n}\n/** Message used when the `by` parameter names something that is not a grouping. */\nvar GROUP_BY_PARAM_HINT = \"Invalid by: expected \\\"event\\\" or \\\"request\\\"\";\n/** Bucket widths offered to an automatic window, smallest first. */\nvar BUCKET_LADDER = [\n\t1e3,\n\t5e3,\n\t1e4,\n\t3e4,\n\t6e4,\n\t3e5,\n\t9e5,\n\t18e5,\n\t36e5,\n\t108e5,\n\t216e5,\n\t432e5,\n\t864e5,\n\t6048e5\n];\n/** Bounds on an explicit bucket width. */\nvar MIN_BUCKET_MS = 1e3;\nvar MAX_BUCKET_MS = 6048e5;\n/**\n* Picks a bucket width for a window.\n*\n* The smallest ladder step that keeps the number of buckets at or below\n* {@link TARGET_BUCKETS} wins, so a fifteen-minute window is bucketed in seconds\n* and a week in hours, and the axis never renders thousands of ticks.\n*/\nfunction chooseBucketMs(windowMs, target = 90) {\n\tconst span = Number.isFinite(windowMs) && windowMs > 0 ? windowMs : 6e4;\n\tconst wanted = Math.max(1, Math.round(target));\n\tfor (const step of BUCKET_LADDER) if (span / step <= wanted) return step;\n\treturn BUCKET_LADDER.at(-1);\n}\n/**\n* Reads an explicit `bucket` parameter.\n*\n* Accepts a duration (`30s`, `5m`, `2h`) or plain milliseconds, and returns\n* `null` for anything unusable so the caller falls back to an automatic width.\n* The result is clamped to {@link MIN_BUCKET_MS}..{@link MAX_BUCKET_MS}.\n*/\nfunction parseBucketParam(value) {\n\tif (typeof value !== \"string\") return null;\n\tconst trimmed = value.trim();\n\tif (trimmed.length === 0) return null;\n\tconst ms = /^\\d+$/.test(trimmed) ? Number(trimmed) : parseDurationMs(trimmed);\n\tif (ms === null || !Number.isFinite(ms) || ms <= 0) return null;\n\treturn Math.min(Math.max(Math.round(ms), MIN_BUCKET_MS), MAX_BUCKET_MS);\n}\n/**\n* Parses the `by` parameter: what one mark on the chart counts.\n*\n* Returns `null` when the parameter is absent or blank (the default grouping) and\n* `undefined` when it names something this app cannot group by, so the caller can\n* answer 400 instead of silently charting a different question.\n*/\nfunction parseGroupByParam(value) {\n\tif (value === null || value === void 0) return null;\n\tconst word = value.trim().toLowerCase();\n\tif (word.length === 0) return null;\n\tif (word === \"event\" || word === \"request\") return word;\n}\n/** Sums rows per level, in a fixed severity order. */\nfunction summariseLevels(points) {\n\tconst order = [\n\t\t\"error\",\n\t\t\"warn\",\n\t\t\"info\",\n\t\t\"debug\",\n\t\t\"unknown\"\n\t];\n\tconst totals = /* @__PURE__ */ new Map();\n\tfor (const point of points) totals.set(point.level, (totals.get(point.level) ?? 0) + point.events);\n\treturn order.filter((level) => totals.has(level)).map((level) => ({\n\t\tlevel,\n\t\tevents: totals.get(level)\n\t}));\n}\n/** Sums rows per group, busiest first. */\nfunction summariseGroups(points) {\n\tconst totals = /* @__PURE__ */ new Map();\n\tfor (const point of points) totals.set(point.group, (totals.get(point.group) ?? 0) + point.events);\n\treturn [...totals.entries()].map(([group, events]) => ({\n\t\tgroup,\n\t\tevents\n\t})).toSorted((a, b) => b.events === a.events ? a.group.localeCompare(b.group) : b.events - a.events);\n}\n/**\n* Builds the response body from raw bucket rows.\n*\n* `groupBy` is echoed back, so the chart can label its marks without guessing\n* which question it asked; it is set on every response, the empty one included.\n*/\nfunction buildSeriesResponse(input) {\n\tconst points = input.rows.map((row) => ({\n\t\tt: row.t,\n\t\tgroup: row.group,\n\t\tlevel: row.level,\n\t\tevents: row.events,\n\t\t...row.durationMs === void 0 ? {} : {\n\t\t\tdurationMs: row.durationMs,\n\t\t\trequestId: row.requestId\n\t\t}\n\t}));\n\treturn {\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs: input.bucketMs,\n\t\tgroupBy: input.groupBy,\n\t\tlevels: summariseLevels(points),\n\t\tgroups: summariseGroups(points),\n\t\tpoints,\n\t\ttotals: {\n\t\t\tevents: points.reduce((sum, point) => sum + point.events, 0),\n\t\t\tpoints: points.length\n\t\t}\n\t};\n}\n/**\n* Reads the archived counts for a window.\n*\n* An unavailable archive answers an empty series rather than an error, so the\n* chart can show \"nothing archived yet\" instead of a failure. `by` picks what a\n* mark counts and defaults to one mark per event.\n*/\nasync function readSeries(input) {\n\tconst bucketMs = input.bucketMs ?? chooseBucketMs(input.to - input.from);\n\tconst groupBy = input.metric === \"duration\" ? \"request\" : input.by ?? \"event\";\n\tconst empty = buildSeriesResponse({\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs,\n\t\tgroupBy,\n\t\trows: []\n\t});\n\tif (!input.archive.available) return empty;\n\tconst rows = await input.archive.seriesQuery({\n\t\tregion: input.region,\n\t\tlogGroups: input.logGroups,\n\t\tstartTime: input.from,\n\t\tendTime: input.to,\n\t\tbucketMs,\n\t\tlevels: input.levels ?? null,\n\t\tby: groupBy,\n\t\t...input.metric === void 0 ? {} : { metric: input.metric }\n\t});\n\treturn buildSeriesResponse({\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs,\n\t\tgroupBy,\n\t\trows\n\t});\n}\n//#endregion\n//#region src/routes/api/series/+server.ts\n/**\n* `GET /api/series` - counts per time bucket, per group and level.\n*\n* This is the chart's data. Only the archive can answer it: DuckDB counts a\n* whole window in one statement, while CloudWatch Logs has no aggregate API, so\n* the UI buckets the events it already streamed for a live or CloudWatch view.\n* `by=request` counts requests instead of lines, placing each request at its\n* first line and colouring it by its most critical level.\n*\n* The window is not clamped to CloudWatch's 14 days, because the archive keeps\n* what CloudWatch has already dropped.\n*/\nvar GET = async ({ url }) => {\n\tconst parsedRegion = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst source = parseSourceParam(url.searchParams.get(\"source\"));\n\tif (source === null) return apiError(400, SOURCE_PARAM_HINT, \"invalid-source\");\n\tif (source !== \"archive\") return apiError(400, SERIES_SOURCE_HINT, \"unsupported-source\");\n\tconst groups = parseGroupParams(url.searchParams.get(\"group\"), url.searchParams.get(\"groups\"));\n\tif (!groups.ok) return apiError(400, groups.message, groups.code);\n\tconst levels = parseLevelParam(url.searchParams.get(\"level\"));\n\tif (levels === void 0) return apiError(400, LEVEL_PARAM_HINT, \"invalid-level\");\n\tconst metric = parseMetricParam(url.searchParams.get(\"metric\"));\n\tif (metric === null) return apiError(400, \"Invalid metric: expected count or duration\", \"invalid-metric\");\n\tconst by = parseGroupByParam(url.searchParams.get(\"by\"));\n\tif (by === void 0) return apiError(400, GROUP_BY_PARAM_HINT, \"invalid-group-by\");\n\tconst env = readEnv();\n\tconst config = resolveAwsConfig(env, parsedRegion.region);\n\tconst region = config.region ?? \"\";\n\tif (region === \"\") return apiError(400, \"Query parameter \\\"region\\\" is required when source=archive\", \"missing-region-param\");\n\tconst window = resolveWindow({\n\t\tmode: \"historic\",\n\t\trange: url.searchParams.get(\"range\"),\n\t\tfrom: url.searchParams.get(\"from\"),\n\t\tto: url.searchParams.get(\"to\"),\n\t\tnow: Date.now()\n\t}, { maxLookbackMs: null });\n\tif (!window.ok) return apiError(400, window.message, window.code);\n\tconst endTime = window.endTime ?? Date.now();\n\tconst series = await readSeries({\n\t\tarchive: await getArchive(env, {\n\t\t\tregion: config.region,\n\t\t\treadOnly: true\n\t\t}),\n\t\tregion,\n\t\tlogGroups: groups.names,\n\t\tfrom: window.startTime,\n\t\tto: endTime,\n\t\tlevels,\n\t\tby,\n\t\tmetric,\n\t\tbucketMs: parseBucketParam(url.searchParams.get(\"bucket\"))\n\t});\n\treturn json(series);\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_server.ts.js-CzJ_bXh8.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/series/_server.ts.js"],"sourcesContent":["import { c as resolveAwsConfig, r as REGION_PARAM_HINT, s as parseRegionParam, t as readEnv, u as apiError } from \"../../../../chunks/env2.js\";\nimport { t as getArchive } from \"../../../../chunks/archive.js\";\nimport { n as parseSourceParam, t as SOURCE_PARAM_HINT } from \"../../../../chunks/source.js\";\nimport { i as parseGroupParams, n as parseLevelParam, o as parseDurationMs, s as resolveWindow, t as LEVEL_PARAM_HINT } from \"../../../../chunks/level-filter.js\";\nimport { json } from \"@sveltejs/kit\";\n//#region src/lib/server/series.ts\n/** Message used when a caller asks for a series the app cannot aggregate. */\nvar SERIES_SOURCE_HINT = \"Series are only aggregated for source=archive; a live CloudWatch view buckets the events it has loaded\";\n/** Missing metrics retain counts; unsupported metrics must not silently select a chart. */\nfunction parseMetricParam(value) {\n\tconst metric = value?.trim().toLowerCase();\n\tif (!metric || metric === \"count\") return \"count\";\n\treturn metric === \"duration\" ? \"duration\" : null;\n}\n/** Message used when the `by` parameter names something that is not a grouping. */\nvar GROUP_BY_PARAM_HINT = \"Invalid by: expected \\\"event\\\" or \\\"request\\\"\";\n/** Bucket widths offered to an automatic window, smallest first. */\nvar BUCKET_LADDER = [\n\t1e3,\n\t5e3,\n\t1e4,\n\t3e4,\n\t6e4,\n\t3e5,\n\t9e5,\n\t18e5,\n\t36e5,\n\t108e5,\n\t216e5,\n\t432e5,\n\t864e5,\n\t6048e5\n];\n/** Bounds on an explicit bucket width. */\nvar MIN_BUCKET_MS = 1e3;\nvar MAX_BUCKET_MS = 6048e5;\n/**\n* Picks a bucket width for a window.\n*\n* The smallest ladder step that keeps the number of buckets at or below\n* {@link TARGET_BUCKETS} wins, so a fifteen-minute window is bucketed in seconds\n* and a week in hours, and the axis never renders thousands of ticks.\n*/\nfunction chooseBucketMs(windowMs, target = 90) {\n\tconst span = Number.isFinite(windowMs) && windowMs > 0 ? windowMs : 6e4;\n\tconst wanted = Math.max(1, Math.round(target));\n\tfor (const step of BUCKET_LADDER) if (span / step <= wanted) return step;\n\treturn BUCKET_LADDER.at(-1);\n}\n/**\n* Reads an explicit `bucket` parameter.\n*\n* Accepts a duration (`30s`, `5m`, `2h`) or plain milliseconds, and returns\n* `null` for anything unusable so the caller falls back to an automatic width.\n* The result is clamped to {@link MIN_BUCKET_MS}..{@link MAX_BUCKET_MS}.\n*/\nfunction parseBucketParam(value) {\n\tif (typeof value !== \"string\") return null;\n\tconst trimmed = value.trim();\n\tif (trimmed.length === 0) return null;\n\tconst ms = /^\\d+$/.test(trimmed) ? Number(trimmed) : parseDurationMs(trimmed);\n\tif (ms === null || !Number.isFinite(ms) || ms <= 0) return null;\n\treturn Math.min(Math.max(Math.round(ms), MIN_BUCKET_MS), MAX_BUCKET_MS);\n}\n/**\n* Parses the `by` parameter: what one mark on the chart counts.\n*\n* Returns `null` when the parameter is absent or blank (the default grouping) and\n* `undefined` when it names something this app cannot group by, so the caller can\n* answer 400 instead of silently charting a different question.\n*/\nfunction parseGroupByParam(value) {\n\tif (value === null || value === void 0) return null;\n\tconst word = value.trim().toLowerCase();\n\tif (word.length === 0) return null;\n\tif (word === \"event\" || word === \"request\") return word;\n}\n/** Sums rows per level, in a fixed severity order. */\nfunction summariseLevels(points) {\n\tconst order = [\n\t\t\"error\",\n\t\t\"warn\",\n\t\t\"info\",\n\t\t\"debug\",\n\t\t\"unknown\"\n\t];\n\tconst totals = /* @__PURE__ */ new Map();\n\tfor (const point of points) totals.set(point.level, (totals.get(point.level) ?? 0) + point.events);\n\treturn order.filter((level) => totals.has(level)).map((level) => ({\n\t\tlevel,\n\t\tevents: totals.get(level)\n\t}));\n}\n/** Sums rows per group, busiest first. */\nfunction summariseGroups(points) {\n\tconst totals = /* @__PURE__ */ new Map();\n\tfor (const point of points) totals.set(point.group, (totals.get(point.group) ?? 0) + point.events);\n\treturn [...totals.entries()].map(([group, events]) => ({\n\t\tgroup,\n\t\tevents\n\t})).toSorted((a, b) => b.events === a.events ? a.group.localeCompare(b.group) : b.events - a.events);\n}\n/**\n* Builds the response body from raw bucket rows.\n*\n* `groupBy` is echoed back, so the chart can label its marks without guessing\n* which question it asked; it is set on every response, the empty one included.\n*/\nfunction buildSeriesResponse(input) {\n\tconst points = input.rows.map((row) => ({\n\t\tt: row.t,\n\t\tgroup: row.group,\n\t\tlevel: row.level,\n\t\tevents: row.events,\n\t\t...row.durationMs === void 0 ? {} : {\n\t\t\tdurationMs: row.durationMs,\n\t\t\trequestId: row.requestId\n\t\t}\n\t}));\n\treturn {\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs: input.bucketMs,\n\t\tgroupBy: input.groupBy,\n\t\tlevels: summariseLevels(points),\n\t\tgroups: summariseGroups(points),\n\t\tpoints,\n\t\ttotals: {\n\t\t\tevents: points.reduce((sum, point) => sum + point.events, 0),\n\t\t\tpoints: points.length\n\t\t}\n\t};\n}\n/**\n* Reads the archived counts for a window.\n*\n* An unavailable archive answers an empty series rather than an error, so the\n* chart can show \"nothing archived yet\" instead of a failure. `by` picks what a\n* mark counts and defaults to one mark per event.\n*/\nasync function readSeries(input) {\n\tconst bucketMs = input.bucketMs ?? chooseBucketMs(input.to - input.from);\n\tconst groupBy = input.metric === \"duration\" ? \"request\" : input.by ?? \"event\";\n\tconst empty = buildSeriesResponse({\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs,\n\t\tgroupBy,\n\t\trows: []\n\t});\n\tif (!input.archive.available) return empty;\n\tconst rows = await input.archive.seriesQuery({\n\t\tregion: input.region,\n\t\tlogGroups: input.logGroups,\n\t\tstartTime: input.from,\n\t\tendTime: input.to,\n\t\tbucketMs,\n\t\tlevels: input.levels ?? null,\n\t\tby: groupBy,\n\t\t...input.metric === void 0 ? {} : { metric: input.metric }\n\t});\n\treturn buildSeriesResponse({\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs,\n\t\tgroupBy,\n\t\trows\n\t});\n}\n//#endregion\n//#region src/routes/api/series/+server.ts\n/**\n* `GET /api/series` - counts per time bucket, per group and level.\n*\n* This is the chart's data. Only the archive can answer it: DuckDB counts a\n* whole window in one statement, while CloudWatch Logs has no aggregate API, so\n* the UI buckets the events it already streamed for a live or CloudWatch view.\n* `by=request` counts requests instead of lines, placing each request at its\n* first line and colouring it by its most critical level.\n*\n* The window is not clamped to CloudWatch's 14 days, because the archive keeps\n* what CloudWatch has already dropped.\n*/\nvar GET = async ({ url }) => {\n\tconst parsedRegion = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst source = parseSourceParam(url.searchParams.get(\"source\"));\n\tif (source === null) return apiError(400, SOURCE_PARAM_HINT, \"invalid-source\");\n\tif (source !== \"archive\") return apiError(400, SERIES_SOURCE_HINT, \"unsupported-source\");\n\tconst groups = parseGroupParams(url.searchParams.get(\"group\"), url.searchParams.get(\"groups\"));\n\tif (!groups.ok) return apiError(400, groups.message, groups.code);\n\tconst levels = parseLevelParam(url.searchParams.get(\"level\"));\n\tif (levels === void 0) return apiError(400, LEVEL_PARAM_HINT, \"invalid-level\");\n\tconst metric = parseMetricParam(url.searchParams.get(\"metric\"));\n\tif (metric === null) return apiError(400, \"Invalid metric: expected count or duration\", \"invalid-metric\");\n\tconst by = parseGroupByParam(url.searchParams.get(\"by\"));\n\tif (by === void 0) return apiError(400, GROUP_BY_PARAM_HINT, \"invalid-group-by\");\n\tconst env = readEnv();\n\tconst config = resolveAwsConfig(env, parsedRegion.region);\n\tconst region = config.region ?? \"\";\n\tif (region === \"\") return apiError(400, \"Query parameter \\\"region\\\" is required when source=archive\", \"missing-region-param\");\n\tconst window = resolveWindow({\n\t\tmode: \"historic\",\n\t\trange: url.searchParams.get(\"range\"),\n\t\tfrom: url.searchParams.get(\"from\"),\n\t\tto: url.searchParams.get(\"to\"),\n\t\tnow: Date.now()\n\t}, { maxLookbackMs: null });\n\tif (!window.ok) return apiError(400, window.message, window.code);\n\tconst endTime = window.endTime ?? Date.now();\n\tconst series = await readSeries({\n\t\tarchive: await getArchive(env, {\n\t\t\tregion: config.region,\n\t\t\treadOnly: true\n\t\t}),\n\t\tregion,\n\t\tlogGroups: groups.names,\n\t\tfrom: window.startTime,\n\t\tto: endTime,\n\t\tlevels,\n\t\tby,\n\t\tmetric,\n\t\tbucketMs: parseBucketParam(url.searchParams.get(\"bucket\"))\n\t});\n\treturn json(series);\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as apiError, p as parseRegionParam, b as readEnv, r as resolveAwsConfig,
|
|
2
|
-
import { g as getArchive } from '../../../../chunks/archive.js-
|
|
1
|
+
import { a as apiError, p as parseRegionParam, b as readEnv, r as resolveAwsConfig, f as describeAwsError, d as createLogsClient, e as resolveEffectiveRegion, R as REGION_PARAM_HINT } from '../../../../chunks/env2.js-C5BgBJDY.js';
|
|
2
|
+
import { g as getArchive, i as intersectCoverage, s as subtractCoverage, a as settleCoverage, m as mergeCoverage } from '../../../../chunks/archive.js-BRlkdj2X.js';
|
|
3
3
|
import { p as parseSourceParam, S as SOURCE_PARAM_HINT } from '../../../../chunks/source.js-DZEVvuho.js';
|
|
4
|
-
import { p as parseGroupParams, a as parseLevelParam, r as resolveWindow, c as clampPollMs, w as withDetections, L as LEVEL_PARAM_HINT } from '../../../../chunks/level-filter.js-
|
|
4
|
+
import { p as parseGroupParams, a as parseLevelParam, r as resolveWindow, c as clampPollMs, w as withDetections, L as LEVEL_PARAM_HINT } from '../../../../chunks/level-filter.js-H0nc-2BG.js';
|
|
5
5
|
import '../../../../chunks/utils.js-BIlHjgGW.js';
|
|
6
6
|
import { FilterLogEventsCommand } from '@aws-sdk/client-cloudwatch-logs';
|
|
7
7
|
import '../../../../chunks/shared-server.js-Dn5XheXH.js';
|
|
@@ -13,7 +13,7 @@ import '../../../../chunks/log-buffer.js-A9FA-Qv8.js';
|
|
|
13
13
|
import 'node:os';
|
|
14
14
|
import 'node:crypto';
|
|
15
15
|
import 'node:timers/promises';
|
|
16
|
-
import '../../../../chunks/time-range.js-
|
|
16
|
+
import '../../../../chunks/time-range.js-__87ZPq6.js';
|
|
17
17
|
import '../../../../chunks/shared.js-CgjUIvRK.js';
|
|
18
18
|
import '../../../../chunks/uneval.js-DaakSYFQ.js';
|
|
19
19
|
|
|
@@ -72,8 +72,8 @@ function archiveUnavailableMessage(archive) {
|
|
|
72
72
|
/**
|
|
73
73
|
* Yields archived events for one window, oldest first.
|
|
74
74
|
*
|
|
75
|
-
* An unavailable archive
|
|
76
|
-
* the browser shows a normal stream error. An aborted signal ends the generator
|
|
75
|
+
* An unavailable archive, or a page that cannot be read, produces a single
|
|
76
|
+
* `error` batch instead of throwing, so the browser shows a normal stream error. An aborted signal ends the generator
|
|
77
77
|
* without yielding an `end` batch, which is what the route treats as a
|
|
78
78
|
* client disconnect.
|
|
79
79
|
*/
|
|
@@ -106,6 +106,14 @@ async function* tailArchivedEvents(options) {
|
|
|
106
106
|
after: cursor,
|
|
107
107
|
limit: pageSize
|
|
108
108
|
});
|
|
109
|
+
if (page.error !== void 0) {
|
|
110
|
+
yield {
|
|
111
|
+
type: "error",
|
|
112
|
+
message: `The local archive could not be read: ${page.error}`,
|
|
113
|
+
code: "archive-read-failed"
|
|
114
|
+
};
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
109
117
|
if (page.events.length === 0) {
|
|
110
118
|
yield {
|
|
111
119
|
type: "end",
|
|
@@ -116,7 +124,8 @@ async function* tailArchivedEvents(options) {
|
|
|
116
124
|
emitted += page.events.length;
|
|
117
125
|
yield {
|
|
118
126
|
type: "events",
|
|
119
|
-
events: page.events
|
|
127
|
+
events: page.events,
|
|
128
|
+
origin: "archive"
|
|
120
129
|
};
|
|
121
130
|
cursor = page.last;
|
|
122
131
|
if (cursor === null || page.events.length < pageSize) {
|
|
@@ -326,14 +335,16 @@ function nextCursor(previous, events) {
|
|
|
326
335
|
*
|
|
327
336
|
* `startTime` is inclusive upstream, so the cursor advances to the newest
|
|
328
337
|
* timestamp seen and repeated events are removed by {@link SeenEventIds}.
|
|
329
|
-
*
|
|
338
|
+
* A `nextToken` is followed straight away, so a sweep reads its whole range
|
|
339
|
+
* before the next one starts. Nothing is new in a sweep => sleep
|
|
340
|
+
* `pollIntervalMs`. Errors are yielded as
|
|
330
341
|
* `error` batches and retried with exponential backoff
|
|
331
342
|
* (`pollIntervalMs * 2^consecutiveErrors`, capped at 15000 ms) until
|
|
332
343
|
* `maxConsecutiveErrors` (default 8) failures in a row, then the generator
|
|
333
344
|
* returns. An aborted signal ends the generator without throwing.
|
|
334
345
|
*/
|
|
335
346
|
async function* tailLogEvents(options) {
|
|
336
|
-
const { client, logGroupName, startTime, pollIntervalMs = DEFAULT_POLL_MS, limit = DEFAULT_LIMIT, filterPattern, signal, sleep = defaultSleep, maxConsecutiveErrors = DEFAULT_MAX_CONSECUTIVE_ERRORS, logStreamNamePrefix, endTime = null, idlePolls = DEFAULT_IDLE_POLLS, maxEvents = DEFAULT_MAX_EVENTS } = options;
|
|
347
|
+
const { client, logGroupName, startTime, pollIntervalMs = DEFAULT_POLL_MS, limit = DEFAULT_LIMIT, filterPattern, signal, sleep = defaultSleep, maxConsecutiveErrors = DEFAULT_MAX_CONSECUTIVE_ERRORS, logStreamNamePrefix, endTime = null, idlePolls = DEFAULT_IDLE_POLLS, maxEvents = DEFAULT_MAX_EVENTS, reportCoverage = false, now = Date.now } = options;
|
|
337
348
|
const historic = typeof endTime === "number" && Number.isFinite(endTime);
|
|
338
349
|
const windowEnd = historic ? endTime : null;
|
|
339
350
|
const idlePollsAllowed = Number.isFinite(idlePolls) && idlePolls > 0 ? Math.floor(idlePolls) : DEFAULT_IDLE_POLLS;
|
|
@@ -362,18 +373,29 @@ async function* tailLogEvents(options) {
|
|
|
362
373
|
let consecutiveErrors = 0;
|
|
363
374
|
let emitted = 0;
|
|
364
375
|
let emptyPolls = 0;
|
|
376
|
+
let sweepStart = cursor;
|
|
377
|
+
let sweepSentAt = 0;
|
|
378
|
+
let sweepHadEvents = false;
|
|
379
|
+
let nextToken;
|
|
365
380
|
for (;;) {
|
|
366
381
|
if (isAborted()) return;
|
|
367
382
|
try {
|
|
383
|
+
if (nextToken === void 0) {
|
|
384
|
+
sweepStart = cursor;
|
|
385
|
+
sweepSentAt = now();
|
|
386
|
+
sweepHadEvents = false;
|
|
387
|
+
}
|
|
368
388
|
const input = {
|
|
369
389
|
...baseInput,
|
|
370
|
-
startTime:
|
|
390
|
+
startTime: sweepStart
|
|
371
391
|
};
|
|
392
|
+
if (nextToken !== void 0) input.nextToken = nextToken;
|
|
372
393
|
const response = await client.send(new FilterLogEventsCommand(input), { abortSignal: signal });
|
|
373
394
|
consecutiveErrors = 0;
|
|
395
|
+
nextToken = typeof response.nextToken === "string" && response.nextToken.length > 0 ? response.nextToken : void 0;
|
|
374
396
|
const events = selectNewEvents(response.events, seen);
|
|
375
397
|
if (events.length > 0) {
|
|
376
|
-
|
|
398
|
+
sweepHadEvents = true;
|
|
377
399
|
cursor = nextCursor(cursor, events);
|
|
378
400
|
emitted += events.length;
|
|
379
401
|
yield {
|
|
@@ -387,6 +409,19 @@ async function* tailLogEvents(options) {
|
|
|
387
409
|
};
|
|
388
410
|
return;
|
|
389
411
|
}
|
|
412
|
+
}
|
|
413
|
+
if (nextToken !== void 0) continue;
|
|
414
|
+
if (reportCoverage) {
|
|
415
|
+
const end = windowEnd === null ? sweepSentAt : Math.min(windowEnd, sweepSentAt);
|
|
416
|
+
if (end >= sweepStart) yield {
|
|
417
|
+
type: "coverage",
|
|
418
|
+
start: sweepStart,
|
|
419
|
+
end,
|
|
420
|
+
readAt: sweepSentAt
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
if (sweepHadEvents) {
|
|
424
|
+
emptyPolls = 0;
|
|
390
425
|
if (windowEnd !== null && cursor >= windowEnd) {
|
|
391
426
|
yield {
|
|
392
427
|
type: "end",
|
|
@@ -451,13 +486,21 @@ var SSE_HEADERS = {
|
|
|
451
486
|
"x-accel-buffering": "no"
|
|
452
487
|
};
|
|
453
488
|
/**
|
|
454
|
-
* Tags every event of one tail with its log group.
|
|
489
|
+
* Tags every event of one tail with its log group and where it came from.
|
|
455
490
|
*
|
|
456
491
|
* A merged multi-group stream has to say which group each line came from, both
|
|
457
|
-
* for the archive and for the group column in the viewer.
|
|
492
|
+
* for the archive and for the group column in the viewer. `origin` is what keeps
|
|
493
|
+
* a mixed archive/CloudWatch view from writing archived rows back.
|
|
458
494
|
*/
|
|
459
|
-
async function* taggedEvents(source, group) {
|
|
495
|
+
async function* taggedEvents(source, group, origin) {
|
|
460
496
|
for await (const batch of source) {
|
|
497
|
+
if (batch.type === "coverage") {
|
|
498
|
+
yield {
|
|
499
|
+
...batch,
|
|
500
|
+
group
|
|
501
|
+
};
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
461
504
|
if (batch.type !== "events") {
|
|
462
505
|
yield batch;
|
|
463
506
|
continue;
|
|
@@ -469,7 +512,8 @@ async function* taggedEvents(source, group) {
|
|
|
469
512
|
});
|
|
470
513
|
yield {
|
|
471
514
|
type: "events",
|
|
472
|
-
events
|
|
515
|
+
events,
|
|
516
|
+
origin
|
|
473
517
|
};
|
|
474
518
|
}
|
|
475
519
|
}
|
|
@@ -478,7 +522,8 @@ async function* taggedEvents(source, group) {
|
|
|
478
522
|
*
|
|
479
523
|
* A merged multi-group stream tags every event with its own group, so a batch
|
|
480
524
|
* that mixes groups is split; a single-group stream falls back to the group the
|
|
481
|
-
* request named.
|
|
525
|
+
* request named. Answers `false` when any row was not stored, which is what
|
|
526
|
+
* stops the stream from recording coverage it cannot back up.
|
|
482
527
|
*/
|
|
483
528
|
async function recordBatch(archive, region, groupNames, events) {
|
|
484
529
|
const fallback = groupNames[0] ?? "";
|
|
@@ -489,9 +534,35 @@ async function recordBatch(archive, region, groupNames, events) {
|
|
|
489
534
|
if (bucket === void 0) byGroup.set(group, [event]);
|
|
490
535
|
else bucket.push(event);
|
|
491
536
|
}
|
|
492
|
-
|
|
537
|
+
let stored = true;
|
|
538
|
+
for (const [group, groupEvents] of byGroup) if (await archive.record(region, group, groupEvents) !== groupEvents.length) stored = false;
|
|
539
|
+
return stored;
|
|
493
540
|
}
|
|
494
541
|
/**
|
|
542
|
+
* Collects the ranges a stream read from CloudWatch, per log group.
|
|
543
|
+
*
|
|
544
|
+
* Each range arrives after the events it produced, and the pump has archived
|
|
545
|
+
* those by then, so a range seen here is backed by stored rows. Only the part
|
|
546
|
+
* that had settled when it was read is kept, and ranges are merged as they
|
|
547
|
+
* arrive so a long live tail holds a handful of intervals, not one per poll.
|
|
548
|
+
*/
|
|
549
|
+
var CoverageCollector = class {
|
|
550
|
+
#byGroup = /* @__PURE__ */ new Map();
|
|
551
|
+
add(group, range) {
|
|
552
|
+
const settled = settleCoverage(range, range.readAt);
|
|
553
|
+
if (settled === null) return;
|
|
554
|
+
this.#byGroup.set(group, mergeCoverage([...this.#byGroup.get(group) ?? [], settled]));
|
|
555
|
+
}
|
|
556
|
+
entries() {
|
|
557
|
+
const entries = [];
|
|
558
|
+
for (const [logGroup, intervals] of this.#byGroup) for (const interval of intervals) entries.push({
|
|
559
|
+
logGroup,
|
|
560
|
+
...interval
|
|
561
|
+
});
|
|
562
|
+
return entries;
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
/**
|
|
495
566
|
* Parses a positive integer parameter within `limits`.
|
|
496
567
|
*
|
|
497
568
|
* Returns `null` for a missing value (meaning "use the default") and for an
|
|
@@ -507,6 +578,32 @@ function parseBoundedInt(value, limits) {
|
|
|
507
578
|
return Math.min(Math.max(Math.round(parsed), limits.min), limits.max);
|
|
508
579
|
}
|
|
509
580
|
/**
|
|
581
|
+
* Creates the CloudWatch Logs client and resolves the region it reads.
|
|
582
|
+
*
|
|
583
|
+
* Returns an `apiError` response the route can send unchanged when either step
|
|
584
|
+
* fails (a missing region is the common case), so both the plain and the hybrid
|
|
585
|
+
* feed build the client the same way.
|
|
586
|
+
*/
|
|
587
|
+
async function openCloudWatch(config) {
|
|
588
|
+
let client;
|
|
589
|
+
try {
|
|
590
|
+
client = createLogsClient(config);
|
|
591
|
+
} catch (error) {
|
|
592
|
+
const described = describeAwsError(error);
|
|
593
|
+
return apiError(502, described.message, described.code);
|
|
594
|
+
}
|
|
595
|
+
try {
|
|
596
|
+
return {
|
|
597
|
+
client,
|
|
598
|
+
region: await resolveEffectiveRegion(client, config)
|
|
599
|
+
};
|
|
600
|
+
} catch (error) {
|
|
601
|
+
client.destroy();
|
|
602
|
+
const described = describeAwsError(error);
|
|
603
|
+
return apiError(502, described.message, described.code);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
510
607
|
* Builds the feed for a request.
|
|
511
608
|
*
|
|
512
609
|
* The archive path never creates a CloudWatch client, so browsing history works
|
|
@@ -540,35 +637,83 @@ async function resolveFeed(request) {
|
|
|
540
637
|
release: () => void 0
|
|
541
638
|
};
|
|
542
639
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
640
|
+
const opened = await openCloudWatch(config);
|
|
641
|
+
if (opened instanceof Response) return opened;
|
|
642
|
+
const { client, region } = opened;
|
|
643
|
+
const reportCoverage = (request.filterPattern ?? "").length === 0;
|
|
644
|
+
return {
|
|
645
|
+
region,
|
|
646
|
+
groupNames,
|
|
647
|
+
generator: mergeTails(groupNames.map((group) => taggedEvents(tailLogEvents({
|
|
648
|
+
client,
|
|
649
|
+
logGroupName: group,
|
|
650
|
+
startTime,
|
|
651
|
+
endTime,
|
|
652
|
+
pollIntervalMs: request.pollIntervalMs,
|
|
653
|
+
filterPattern: request.filterPattern,
|
|
654
|
+
signal,
|
|
655
|
+
maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS,
|
|
656
|
+
reportCoverage,
|
|
657
|
+
...request.maxEvents === null ? {} : { maxEvents: request.maxEvents }
|
|
658
|
+
}), group, "cloudwatch"))),
|
|
659
|
+
release: () => client.destroy()
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Builds a historic CloudWatch view that reads the archive wherever it can.
|
|
664
|
+
*
|
|
665
|
+
* For each group the window is split against the archive's coverage: ranges the
|
|
666
|
+
* archive already holds are replayed locally, and only the gaps are fetched from
|
|
667
|
+
* CloudWatch. That is what makes re-searching a window that was streamed before
|
|
668
|
+
* fast and offline-first, without ever dropping events the archive never saw -
|
|
669
|
+
* the gaps are always filled from AWS.
|
|
670
|
+
*
|
|
671
|
+
* Each gap is recorded as coverage once CloudWatch has been read over it and
|
|
672
|
+
* its events are stored, so the next view of the same window is answered from
|
|
673
|
+
* the archive (all but its last few minutes, which may still be arriving).
|
|
674
|
+
*/
|
|
675
|
+
async function resolveHybridFeed(request) {
|
|
676
|
+
const { config, env, groupNames, startTime, filterPattern, pollIntervalMs, signal } = request;
|
|
677
|
+
const { maxEvents, pageSize } = request;
|
|
678
|
+
const end = request.endTime ?? Date.now();
|
|
679
|
+
const opened = await openCloudWatch(config);
|
|
680
|
+
if (opened instanceof Response) return opened;
|
|
681
|
+
const { client, region } = opened;
|
|
682
|
+
const archive = await getArchive(env, {
|
|
683
|
+
region,
|
|
684
|
+
readOnly: true
|
|
685
|
+
});
|
|
686
|
+
const coverage = await archive.coverage(region, groupNames, startTime, end);
|
|
687
|
+
const generators = [];
|
|
688
|
+
for (const group of groupNames) {
|
|
689
|
+
const intervals = coverage.get(group) ?? [];
|
|
690
|
+
for (const covered of intersectCoverage(startTime, end, intervals)) generators.push(taggedEvents(tailArchivedEvents({
|
|
691
|
+
archive,
|
|
692
|
+
region,
|
|
693
|
+
logGroups: [group],
|
|
694
|
+
startTime: covered.start,
|
|
695
|
+
endTime: covered.end,
|
|
696
|
+
...pageSize === null ? {} : { pageSize },
|
|
697
|
+
...maxEvents === null ? {} : { maxEvents },
|
|
698
|
+
signal
|
|
699
|
+
}), group, "archive"));
|
|
700
|
+
for (const gap of subtractCoverage(startTime, end, intervals)) generators.push(taggedEvents(tailLogEvents({
|
|
701
|
+
client,
|
|
702
|
+
logGroupName: group,
|
|
703
|
+
startTime: gap.start,
|
|
704
|
+
endTime: gap.end,
|
|
705
|
+
pollIntervalMs,
|
|
706
|
+
filterPattern,
|
|
707
|
+
signal,
|
|
708
|
+
maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS,
|
|
709
|
+
reportCoverage: true,
|
|
710
|
+
...maxEvents === null ? {} : { maxEvents }
|
|
711
|
+
}), group, "cloudwatch"));
|
|
557
712
|
}
|
|
558
|
-
const tails = groupNames.map((group) => taggedEvents(tailLogEvents({
|
|
559
|
-
client,
|
|
560
|
-
logGroupName: group,
|
|
561
|
-
startTime,
|
|
562
|
-
endTime,
|
|
563
|
-
pollIntervalMs: request.pollIntervalMs,
|
|
564
|
-
filterPattern: request.filterPattern,
|
|
565
|
-
signal,
|
|
566
|
-
maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS
|
|
567
|
-
}), group));
|
|
568
713
|
return {
|
|
569
714
|
region,
|
|
570
715
|
groupNames,
|
|
571
|
-
generator: mergeTails(
|
|
716
|
+
generator: mergeTails(generators),
|
|
572
717
|
release: () => client.destroy()
|
|
573
718
|
};
|
|
574
719
|
}
|
|
@@ -610,7 +755,8 @@ var GET = async ({ url, request }) => {
|
|
|
610
755
|
if (!streamWindow.ok) return apiError(400, streamWindow.message, streamWindow.code);
|
|
611
756
|
if (source === "archive" && streamWindow.mode === "live") return apiError(400, "The local archive only serves historic windows: use mode=historic, or source=cloudwatch to tail live", "invalid-mode");
|
|
612
757
|
const bodyAbort = new AbortController();
|
|
613
|
-
const
|
|
758
|
+
const hybrid = source === "cloudwatch" && streamWindow.mode === "historic" && (filterPattern ?? "").length === 0;
|
|
759
|
+
const feedRequest = {
|
|
614
760
|
source,
|
|
615
761
|
config,
|
|
616
762
|
env,
|
|
@@ -624,7 +770,8 @@ var GET = async ({ url, request }) => {
|
|
|
624
770
|
maxEvents: parseBoundedInt(url.searchParams.get("max"), ARCHIVE_MAX_LIMITS),
|
|
625
771
|
pollIntervalMs: clampPollMs(url.searchParams.get("poll")),
|
|
626
772
|
signal: bodyAbort.signal
|
|
627
|
-
}
|
|
773
|
+
};
|
|
774
|
+
const feed = hybrid ? await resolveHybridFeed(feedRequest) : await resolveFeed(feedRequest);
|
|
628
775
|
if (feed instanceof Response) return feed;
|
|
629
776
|
const archive = source === "cloudwatch" ? await getArchive(env, { region: feed.region }) : null;
|
|
630
777
|
const encoder = new TextEncoder();
|
|
@@ -687,19 +834,33 @@ var GET = async ({ url, request }) => {
|
|
|
687
834
|
request.signal.removeEventListener("abort", onAbort);
|
|
688
835
|
feed.release();
|
|
689
836
|
};
|
|
837
|
+
const eventCap = source === "cloudwatch" && streamWindow.mode === "historic" ? feedRequest.maxEvents : null;
|
|
690
838
|
const pump = async () => {
|
|
691
839
|
let consecutiveErrors = 0;
|
|
692
840
|
let reason = "completed";
|
|
841
|
+
let sent = 0;
|
|
842
|
+
const coverage = new CoverageCollector();
|
|
843
|
+
let archiveComplete = true;
|
|
693
844
|
try {
|
|
694
845
|
for await (const batch of feed.generator) {
|
|
695
846
|
if (closed || bodyAbort.signal.aborted) break;
|
|
696
847
|
if (batch.type === "events") {
|
|
697
848
|
const events = withDetections(batch.events);
|
|
698
|
-
const
|
|
849
|
+
const remaining = eventCap === null ? events.length : eventCap - sent;
|
|
850
|
+
const shown = remaining < events.length ? events.slice(0, remaining) : events;
|
|
851
|
+
const payload = { events: shown };
|
|
699
852
|
consecutiveErrors = 0;
|
|
853
|
+
sent += shown.length;
|
|
700
854
|
enqueue(sseFrame("log", payload));
|
|
701
|
-
if (archive !== null
|
|
702
|
-
|
|
855
|
+
if (archive !== null && batch.origin !== "archive") {
|
|
856
|
+
if (!await recordBatch(archive, feed.region, feed.groupNames, events)) archiveComplete = false;
|
|
857
|
+
}
|
|
858
|
+
if (eventCap !== null && sent >= eventCap) {
|
|
859
|
+
reason = "event-limit";
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
} else if (batch.type === "coverage") coverage.add(batch.group ?? feed.groupNames[0] ?? "", batch);
|
|
863
|
+
else if (batch.type === "end") {
|
|
703
864
|
reason = batch.reason;
|
|
704
865
|
break;
|
|
705
866
|
} else {
|
|
@@ -713,6 +874,8 @@ var GET = async ({ url, request }) => {
|
|
|
713
874
|
if (bodyAbort.signal.aborted) reason = "client-disconnected";
|
|
714
875
|
else if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) reason = "repeated-errors";
|
|
715
876
|
}
|
|
877
|
+
const covered = coverage.entries();
|
|
878
|
+
if (archive !== null && archiveComplete && covered.length > 0) await archive.recordCoverage(feed.region, covered);
|
|
716
879
|
} catch (error) {
|
|
717
880
|
const described = describeAwsError(error);
|
|
718
881
|
const payload = { message: described.message };
|
|
@@ -756,4 +919,4 @@ var GET = async ({ url, request }) => {
|
|
|
756
919
|
};
|
|
757
920
|
|
|
758
921
|
export { GET };
|
|
759
|
-
//# sourceMappingURL=_server.ts.js-
|
|
922
|
+
//# sourceMappingURL=_server.ts.js-U2naV16N.js.map
|