watch-tail 0.4.0 → 0.6.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 +158 -0
- package/build/client/_app/immutable/assets/0.Dfts6BC4.css +2 -0
- package/build/client/_app/immutable/assets/0.Dfts6BC4.css.br +0 -0
- package/build/client/_app/immutable/assets/0.Dfts6BC4.css.gz +0 -0
- package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css +1 -0
- package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css.br +0 -0
- package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css +1 -0
- package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css.br +0 -0
- package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css.gz +0 -0
- package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css +1 -0
- package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css.br +1 -0
- package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css.gz +0 -0
- package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css +1 -0
- package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css.br +0 -0
- package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css.gz +0 -0
- package/build/client/_app/immutable/assets/EventScatter.DA5sZ1c0.css +1 -0
- package/build/client/_app/immutable/assets/EventScatter.DA5sZ1c0.css.br +0 -0
- package/build/client/_app/immutable/assets/EventScatter.DA5sZ1c0.css.gz +0 -0
- package/build/client/_app/immutable/assets/Labels.sEaJtb97.css +1 -0
- package/build/client/_app/immutable/assets/Labels.sEaJtb97.css.br +0 -0
- package/build/client/_app/immutable/assets/Labels.sEaJtb97.css.gz +0 -0
- package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css +1 -0
- package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css.br +0 -0
- package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css.gz +0 -0
- package/build/client/_app/immutable/assets/Path.B0wDzTrn.css +1 -0
- package/build/client/_app/immutable/assets/Path.B0wDzTrn.css.br +0 -0
- package/build/client/_app/immutable/assets/Path.B0wDzTrn.css.gz +0 -0
- package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css +1 -0
- package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css.br +0 -0
- package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css.gz +0 -0
- package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css +1 -0
- package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css.br +0 -0
- package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css.gz +0 -0
- package/build/client/_app/immutable/chunks/Amq8zxdJ.js +1 -0
- package/build/client/_app/immutable/chunks/Amq8zxdJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/Amq8zxdJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B3p3umIY.js +1 -0
- package/build/client/_app/immutable/chunks/B3p3umIY.js.br +0 -0
- package/build/client/_app/immutable/chunks/B3p3umIY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B43Eeyih.js +1 -0
- package/build/client/_app/immutable/chunks/B43Eeyih.js.br +0 -0
- package/build/client/_app/immutable/chunks/B43Eeyih.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5q6rkQ-.js +1 -0
- package/build/client/_app/immutable/chunks/B5q6rkQ-.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5q6rkQ-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BAynhd7i.js +1 -0
- package/build/client/_app/immutable/chunks/BAynhd7i.js.br +0 -0
- package/build/client/_app/immutable/chunks/BAynhd7i.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDlvDAqe.js +1 -0
- package/build/client/_app/immutable/chunks/BDlvDAqe.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDlvDAqe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BGmgUZMc.js +10 -0
- package/build/client/_app/immutable/chunks/BGmgUZMc.js.br +0 -0
- package/build/client/_app/immutable/chunks/BGmgUZMc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJpWBbAS.js +1 -0
- package/build/client/_app/immutable/chunks/BJpWBbAS.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJpWBbAS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOT2hFMn.js +1 -0
- package/build/client/_app/immutable/chunks/BOT2hFMn.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOT2hFMn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BR2LaRms.js +1 -0
- package/build/client/_app/immutable/chunks/BR2LaRms.js.br +1 -0
- package/build/client/_app/immutable/chunks/BR2LaRms.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BZFYtRPj.js +1 -0
- package/build/client/_app/immutable/chunks/BZFYtRPj.js.br +0 -0
- package/build/client/_app/immutable/chunks/BZFYtRPj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BjxZ_neZ.js +5 -0
- package/build/client/_app/immutable/chunks/BjxZ_neZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/BjxZ_neZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bl052uUt.js +1 -0
- package/build/client/_app/immutable/chunks/Bl052uUt.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bl052uUt.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bw_9uNRP.js → BsH4MNzX.js} +1 -1
- package/build/client/_app/immutable/chunks/BsH4MNzX.js.br +0 -0
- package/build/client/_app/immutable/chunks/BsH4MNzX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ByhwhtiG.js +1 -0
- package/build/client/_app/immutable/chunks/ByhwhtiG.js.br +0 -0
- package/build/client/_app/immutable/chunks/ByhwhtiG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C1lycbEF.js +1 -0
- package/build/client/_app/immutable/chunks/C1lycbEF.js.br +0 -0
- package/build/client/_app/immutable/chunks/C1lycbEF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C58PZtCD.js +4 -0
- package/build/client/_app/immutable/chunks/C58PZtCD.js.br +0 -0
- package/build/client/_app/immutable/chunks/C58PZtCD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CCch3uox.js +1 -0
- package/build/client/_app/immutable/chunks/CCch3uox.js.br +0 -0
- package/build/client/_app/immutable/chunks/CCch3uox.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CEU4ihsz.js +1 -0
- package/build/client/_app/immutable/chunks/CEU4ihsz.js.br +0 -0
- package/build/client/_app/immutable/chunks/CEU4ihsz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CG6rRxUy.js +2 -0
- package/build/client/_app/immutable/chunks/CG6rRxUy.js.br +0 -0
- package/build/client/_app/immutable/chunks/CG6rRxUy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CM5sQDq_.js +1 -0
- package/build/client/_app/immutable/chunks/CM5sQDq_.js.br +0 -0
- package/build/client/_app/immutable/chunks/CM5sQDq_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CT_NYh_-.js +1 -0
- package/build/client/_app/immutable/chunks/CT_NYh_-.js.br +0 -0
- package/build/client/_app/immutable/chunks/CT_NYh_-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZIk93qi.js +1 -0
- package/build/client/_app/immutable/chunks/CZIk93qi.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZIk93qi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_aXFBl3.js +1 -0
- package/build/client/_app/immutable/chunks/C_aXFBl3.js.br +0 -0
- package/build/client/_app/immutable/chunks/C_aXFBl3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CqWPu3PG.js +1 -0
- package/build/client/_app/immutable/chunks/CqWPu3PG.js.br +1 -0
- package/build/client/_app/immutable/chunks/CqWPu3PG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CyncJW0D.js +1 -0
- package/build/client/_app/immutable/chunks/CyncJW0D.js.br +0 -0
- package/build/client/_app/immutable/chunks/CyncJW0D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D4sC5v3c.js +1 -0
- package/build/client/_app/immutable/chunks/D4sC5v3c.js.br +0 -0
- package/build/client/_app/immutable/chunks/D4sC5v3c.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D76YLq-2.js +1 -0
- package/build/client/_app/immutable/chunks/D76YLq-2.js.br +0 -0
- package/build/client/_app/immutable/chunks/D76YLq-2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8H_ivbb.js +1 -0
- package/build/client/_app/immutable/chunks/D8H_ivbb.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8H_ivbb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DU0OQtdJ.js +1 -0
- package/build/client/_app/immutable/chunks/DU0OQtdJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DU0OQtdJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Db0q5_zr.js +1 -0
- package/build/client/_app/immutable/chunks/Db0q5_zr.js.br +0 -0
- package/build/client/_app/immutable/chunks/Db0q5_zr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dfvzj6n2.js +1 -0
- package/build/client/_app/immutable/chunks/Dfvzj6n2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dfvzj6n2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/HclGiUj8.js +1 -0
- package/build/client/_app/immutable/chunks/HclGiUj8.js.br +0 -0
- package/build/client/_app/immutable/chunks/HclGiUj8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/RobXhXPM.js +1 -0
- package/build/client/_app/immutable/chunks/RobXhXPM.js.br +1 -0
- package/build/client/_app/immutable/chunks/RobXhXPM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Y5urAfNy.js +1 -0
- package/build/client/_app/immutable/chunks/Y5urAfNy.js.br +0 -0
- package/build/client/_app/immutable/chunks/Y5urAfNy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Yk6ZJZnu.js +1 -0
- package/build/client/_app/immutable/chunks/Yk6ZJZnu.js.br +0 -0
- package/build/client/_app/immutable/chunks/Yk6ZJZnu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/jO4fmY1N.js +1 -0
- package/build/client/_app/immutable/chunks/jO4fmY1N.js.br +0 -0
- package/build/client/_app/immutable/chunks/jO4fmY1N.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js +3 -0
- 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/snfmbqby.js +1 -0
- package/build/client/_app/immutable/chunks/snfmbqby.js.br +0 -0
- package/build/client/_app/immutable/chunks/snfmbqby.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wx-wtMGx.js +15 -0
- package/build/client/_app/immutable/chunks/wx-wtMGx.js.br +0 -0
- package/build/client/_app/immutable/chunks/wx-wtMGx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/yCfI4PCa.js +1 -0
- package/build/client/_app/immutable/chunks/yCfI4PCa.js.br +0 -0
- package/build/client/_app/immutable/chunks/yCfI4PCa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/zHL7lw4G.js +1 -0
- package/build/client/_app/immutable/chunks/zHL7lw4G.js.br +0 -0
- package/build/client/_app/immutable/chunks/zHL7lw4G.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DFSifnlU.js +2 -0
- package/build/client/_app/immutable/entry/app.DFSifnlU.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DFSifnlU.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.2H5s3Lol.js +1 -0
- package/build/client/_app/immutable/entry/start.2H5s3Lol.js.br +1 -0
- package/build/client/_app/immutable/entry/start.2H5s3Lol.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.BN3NguWs.js +1 -0
- package/build/client/_app/immutable/nodes/0.BN3NguWs.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.BN3NguWs.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Djdw1GzA.js +1 -0
- package/build/client/_app/immutable/nodes/1.Djdw1GzA.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.Djdw1GzA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js +4 -0
- package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CjvaJDQJ.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 +9 -7
- package/build/handler.js.map +1 -1
- package/build/index.js +9 -7
- package/build/index.js.map +1 -1
- package/build/server/chunks/chunks/Arc.canvas.js-D6g58nSp.js +701 -0
- package/build/server/chunks/chunks/Arc.canvas.js-D6g58nSp.js.map +1 -0
- package/build/server/chunks/chunks/Arc.js-D78Cf_4M.js +31 -0
- package/build/server/chunks/chunks/Arc.js-D78Cf_4M.js.map +1 -0
- package/build/server/chunks/chunks/Bar.js-Cv73T8_D.js +448 -0
- package/build/server/chunks/chunks/Bar.js-Cv73T8_D.js.map +1 -0
- package/build/server/chunks/chunks/ChartAnnotations.js-Ci22VB_6.js +983 -0
- package/build/server/chunks/chunks/ChartAnnotations.js-Ci22VB_6.js.map +1 -0
- package/build/server/chunks/chunks/Circle.html.js-BjwyNRG3.js +355 -0
- package/build/server/chunks/chunks/Circle.html.js-BjwyNRG3.js.map +1 -0
- package/build/server/chunks/chunks/ClipPath.canvas.js-CFTBDWVU.js +170 -0
- package/build/server/chunks/chunks/ClipPath.canvas.js-CFTBDWVU.js.map +1 -0
- package/build/server/chunks/chunks/DefaultTooltip.js-0r5rbE-1.js +352 -0
- package/build/server/chunks/chunks/DefaultTooltip.js-0r5rbE-1.js.map +1 -0
- package/build/server/chunks/chunks/EventScatter.js-D3Jaw_Cw.js +7308 -0
- package/build/server/chunks/chunks/EventScatter.js-D3Jaw_Cw.js.map +1 -0
- package/build/server/chunks/chunks/Labels.js-DpagpV6d.js +497 -0
- package/build/server/chunks/chunks/Labels.js-DpagpV6d.js.map +1 -0
- package/build/server/chunks/chunks/Legend.js-BOpwpe5s.js +343 -0
- package/build/server/chunks/chunks/Legend.js-BOpwpe5s.js.map +1 -0
- package/build/server/chunks/chunks/Line.html.js-BM5tR11G.js +423 -0
- package/build/server/chunks/chunks/Line.html.js-BM5tR11G.js.map +1 -0
- package/build/server/chunks/chunks/Link.canvas.js-P8ySzEAw.js +756 -0
- package/build/server/chunks/chunks/Link.canvas.js-P8ySzEAw.js.map +1 -0
- package/build/server/chunks/chunks/Path.canvas.js-DNAtnEBt.js +1259 -0
- package/build/server/chunks/chunks/Path.canvas.js-DNAtnEBt.js.map +1 -0
- package/build/server/chunks/chunks/Points.html.js-CLbHD6OP.js +228 -0
- package/build/server/chunks/chunks/Points.html.js-CLbHD6OP.js.map +1 -0
- package/build/server/chunks/chunks/Points.js-e6g0Re6H.js +14 -0
- package/build/server/chunks/chunks/Points.js-e6g0Re6H.js.map +1 -0
- package/build/server/chunks/chunks/Points2.js-BMGdkzTE.js +25 -0
- package/build/server/chunks/chunks/Points2.js-BMGdkzTE.js.map +1 -0
- package/build/server/chunks/chunks/Rect.html.js-Q3UvRwNn.js +547 -0
- package/build/server/chunks/chunks/Rect.html.js-Q3UvRwNn.js.map +1 -0
- package/build/server/chunks/chunks/Spline.js-BuZPz2PJ.js +516 -0
- package/build/server/chunks/chunks/Spline.js-BuZPz2PJ.js.map +1 -0
- package/build/server/chunks/chunks/Text.html.js-C8xO5Nz6.js +847 -0
- package/build/server/chunks/chunks/Text.html.js-C8xO5Nz6.js.map +1 -0
- package/build/server/chunks/chunks/TooltipItem.js-T0cKLjLu.js +314 -0
- package/build/server/chunks/chunks/TooltipItem.js-T0cKLjLu.js.map +1 -0
- package/build/server/chunks/chunks/Voronoi.js-DevTsXQE.js +2052 -0
- package/build/server/chunks/chunks/Voronoi.js-DevTsXQE.js.map +1 -0
- package/build/server/chunks/chunks/archive.js-C2D-5edp.js +823 -0
- package/build/server/chunks/chunks/archive.js-C2D-5edp.js.map +1 -0
- package/build/server/chunks/chunks/array.js-CBp0H4t3.js +8 -0
- package/build/server/chunks/chunks/array.js-CBp0H4t3.js.map +1 -0
- package/build/server/chunks/chunks/attributes.js-BVWo7wbg.js +25 -0
- package/build/server/chunks/chunks/attributes.js-BVWo7wbg.js.map +1 -0
- package/build/server/chunks/chunks/{env2.js-DXveJt1Y.js → aws.js-DkPqAybc.js} +2 -59
- package/build/server/chunks/chunks/aws.js-DkPqAybc.js.map +1 -0
- package/build/server/chunks/chunks/band.js-C7izXphE.js +155 -0
- package/build/server/chunks/chunks/band.js-C7izXphE.js.map +1 -0
- package/build/server/chunks/chunks/centroid.js-BnGN3LH0.js +1356 -0
- package/build/server/chunks/chunks/centroid.js-BnGN3LH0.js.map +1 -0
- package/build/server/chunks/chunks/common.js-BWQB8Die.js +5760 -0
- package/build/server/chunks/chunks/common.js-BWQB8Die.js.map +1 -0
- package/build/server/chunks/chunks/env2.js-CcIskxOZ.js +60 -0
- package/build/server/chunks/chunks/env2.js-CcIskxOZ.js.map +1 -0
- package/build/server/chunks/chunks/{exports.js-CvFPPbaH.js → exports.js-ClPPfcHj.js} +6 -1
- package/build/server/chunks/chunks/exports.js-ClPPfcHj.js.map +1 -0
- package/build/server/chunks/chunks/group.js-DBFzWAox.js +30 -0
- package/build/server/chunks/chunks/group.js-DBFzWAox.js.map +1 -0
- package/build/server/chunks/chunks/index-server.js-DNLOKvM0.js +248 -0
- package/build/server/chunks/chunks/index-server.js-DNLOKvM0.js.map +1 -0
- package/build/server/chunks/chunks/index-server2.js-l0sNRNKZ.js +2 -0
- package/build/server/chunks/chunks/index-server2.js-l0sNRNKZ.js.map +1 -0
- package/build/server/chunks/chunks/{internal2.js-DZ8ZzzjN.js → internal.js-DZ8ZzzjN.js} +1 -1
- package/build/server/chunks/chunks/internal.js-DZ8ZzzjN.js.map +1 -0
- package/build/server/chunks/chunks/internal2.js-BPo5dcDi.js +188 -0
- package/build/server/chunks/chunks/internal2.js-BPo5dcDi.js.map +1 -0
- package/build/server/chunks/chunks/key.svelte.js-CWIvXc6L.js +695 -0
- package/build/server/chunks/chunks/key.svelte.js-CWIvXc6L.js.map +1 -0
- package/build/server/chunks/chunks/{internal.js-Cc3oBhL-.js → legacy-client.js-DJmDw3Zx.js} +13 -439
- package/build/server/chunks/chunks/legacy-client.js-DJmDw3Zx.js.map +1 -0
- package/build/server/chunks/chunks/level-filter.js-B3o2hyWD.js +313 -0
- package/build/server/chunks/chunks/level-filter.js-B3o2hyWD.js.map +1 -0
- package/build/server/chunks/chunks/lineRadial.js-Dm0GMqo3.js +126 -0
- package/build/server/chunks/chunks/lineRadial.js-Dm0GMqo3.js.map +1 -0
- package/build/server/chunks/chunks/linear.js-CTOKrHn9.js +1046 -0
- package/build/server/chunks/chunks/linear.js-CTOKrHn9.js.map +1 -0
- package/build/server/chunks/chunks/log-buffer.js-BI_gQOls.js +587 -0
- package/build/server/chunks/chunks/log-buffer.js-BI_gQOls.js.map +1 -0
- package/build/server/chunks/chunks/math.js-BqujbaBs.js +50 -0
- package/build/server/chunks/chunks/math.js-BqujbaBs.js.map +1 -0
- package/build/server/chunks/chunks/max.js-CuS0BpRI.js +11 -0
- package/build/server/chunks/chunks/max.js-CuS0BpRI.js.map +1 -0
- package/build/server/chunks/chunks/min.js-DZWt5tPl.js +11 -0
- package/build/server/chunks/chunks/min.js-DZWt5tPl.js.map +1 -0
- package/build/server/chunks/chunks/motion.svelte.js-DCHSFMu-.js +677 -0
- package/build/server/chunks/chunks/motion.svelte.js-DCHSFMu-.js.map +1 -0
- package/build/server/chunks/chunks/occlusion.js-DJ-AdK9u.js +33 -0
- package/build/server/chunks/chunks/occlusion.js-DJ-AdK9u.js.map +1 -0
- package/build/server/chunks/chunks/path.js-BizMrlzb.js +488 -0
- package/build/server/chunks/chunks/path.js-BizMrlzb.js.map +1 -0
- package/build/server/chunks/chunks/path2.js-pquT2Kg6.js +27 -0
- package/build/server/chunks/chunks/path2.js-pquT2Kg6.js.map +1 -0
- package/build/server/chunks/chunks/pointRadial.js-Deeu1LXx.js +7 -0
- package/build/server/chunks/chunks/pointRadial.js-Deeu1LXx.js.map +1 -0
- package/build/server/chunks/chunks/rect.svelte.js-zeS7FWjB.js +187 -0
- package/build/server/chunks/chunks/rect.svelte.js-zeS7FWjB.js.map +1 -0
- package/build/server/chunks/chunks/scales.svelte.js-D_1popPi.js +276 -0
- package/build/server/chunks/chunks/scales.svelte.js-D_1popPi.js.map +1 -0
- package/build/server/chunks/chunks/series-buckets.js-BjigySff.js +290 -0
- package/build/server/chunks/chunks/series-buckets.js-BjigySff.js.map +1 -0
- package/build/server/chunks/chunks/{server.js-ByNB8uti.js → server.js-CAEBuMIH.js} +167 -2
- package/build/server/chunks/chunks/server.js-CAEBuMIH.js.map +1 -0
- package/build/server/chunks/chunks/source.js-DZEVvuho.js +21 -0
- package/build/server/chunks/chunks/source.js-DZEVvuho.js.map +1 -0
- package/build/server/chunks/chunks/{state.js-9DxsWxU-.js → state.js-DgkwfYFo.js} +5 -4
- package/build/server/chunks/chunks/state.js-DgkwfYFo.js.map +1 -0
- package/build/server/chunks/chunks/types.js-x3GyGPOz.js +11 -0
- package/build/server/chunks/chunks/types.js-x3GyGPOz.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/archive/_server.ts.js-83Ch7djd.js +39 -0
- package/build/server/chunks/entries/endpoints/api/archive/_server.ts.js-83Ch7djd.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/health/{_server.ts.js-BOjix7GN.js → _server.ts.js-VctnBhIJ.js} +5 -4
- package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-VctnBhIJ.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/identity/{_server.ts.js-g13uvmrX.js → _server.ts.js-Dt540Sio.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/identity/_server.ts.js-Dt540Sio.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-CmHRxdZK.js → _server.ts.js-drLgUdvB.js} +57 -8
- package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-drLgUdvB.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/regions/{_server.ts.js-BgUwioxp.js → _server.ts.js-CBqfN6Pg.js} +5 -4
- package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-CBqfN6Pg.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/series/_server.ts.js-DOvBhEDU.js +225 -0
- package/build/server/chunks/entries/endpoints/api/series/_server.ts.js-DOvBhEDU.js.map +1 -0
- package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-CIYo4C-0.js → _server.ts.js-BWRHawY8.js} +324 -223
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BWRHawY8.js.map +1 -0
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-CFonuZkV.js → error.svelte.js-CsCL5PMW.js} +7 -5
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-CFonuZkV.js.map → error.svelte.js-CsCL5PMW.js.map} +1 -1
- package/build/server/chunks/entries/pages/{_layout.svelte.js-Dzluuq12.js → _layout.svelte.js-CBQpEToy.js} +2 -2
- package/build/server/chunks/entries/pages/{_layout.svelte.js-Dzluuq12.js.map → _layout.svelte.js-CBQpEToy.js.map} +1 -1
- package/build/server/chunks/entries/pages/_page.svelte.js-qqtU0apo.js +1641 -0
- package/build/server/chunks/entries/pages/_page.svelte.js-qqtU0apo.js.map +1 -0
- package/build/server/chunks/{handler-DS32NMsJ.js → handler-DlfTB05m.js} +3 -3
- package/build/server/chunks/{handler-DS32NMsJ.js.map → handler-DlfTB05m.js.map} +1 -1
- package/build/server/chunks/{index.js-HHu-yOEK.js → index.js-BMrd9hfO.js} +6 -5
- package/build/server/chunks/index.js-BMrd9hfO.js.map +1 -0
- package/build/server/chunks/{manifest.js-BUrA7Zyr.js → manifest.js-D1kCuVe5.js} +24 -10
- package/build/server/chunks/manifest.js-D1kCuVe5.js.map +1 -0
- package/build/server/chunks/nodes/0.js-CNFDDPj5.js +9 -0
- package/build/server/chunks/nodes/{0.js-gSRmrAt_.js.map → 0.js-CNFDDPj5.js.map} +1 -1
- package/build/server/chunks/nodes/1.js-B5FPLYnf.js +9 -0
- package/build/server/chunks/nodes/{1.js-D68K7Ad_.js.map → 1.js-B5FPLYnf.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-BEuxzw6b.js +9 -0
- package/build/server/chunks/nodes/2.js-BEuxzw6b.js.map +1 -0
- package/dist/cli/completions.js +6 -0
- package/dist/cli/index.js +131 -88
- package/dist/cli/options.js +28 -2
- package/dist/cli/preflight.js +30 -0
- package/dist/cli/ui.js +18 -3
- package/dist/lib/cli/aws.js +12 -4
- package/dist/lib/log-buffer.js +443 -0
- package/dist/lib/log-format.js +185 -0
- package/dist/lib/types.js +0 -4
- package/package.json +6 -2
- package/build/client/_app/immutable/assets/0.BPmQoXaO.css +0 -2
- package/build/client/_app/immutable/assets/0.BPmQoXaO.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BPmQoXaO.css.gz +0 -0
- package/build/client/_app/immutable/chunks/Bw_9uNRP.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bw_9uNRP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/De_x7GQi.js +0 -1
- package/build/client/_app/immutable/chunks/De_x7GQi.js.br +0 -0
- package/build/client/_app/immutable/chunks/De_x7GQi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ZAD2y5xJ.js +0 -3
- package/build/client/_app/immutable/chunks/ZAD2y5xJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/ZAD2y5xJ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Be166AxG.js +0 -2
- package/build/client/_app/immutable/entry/app.Be166AxG.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Be166AxG.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.clEDpQL9.js +0 -1
- package/build/client/_app/immutable/entry/start.clEDpQL9.js.br +0 -0
- package/build/client/_app/immutable/entry/start.clEDpQL9.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.BJ6Zdc8H.js +0 -1
- package/build/client/_app/immutable/nodes/0.BJ6Zdc8H.js.br +0 -4
- package/build/client/_app/immutable/nodes/0.BJ6Zdc8H.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.xMNWuLLz.js +0 -1
- package/build/client/_app/immutable/nodes/1.xMNWuLLz.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.xMNWuLLz.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.CaxDXwmh.js +0 -5
- package/build/client/_app/immutable/nodes/2.CaxDXwmh.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CaxDXwmh.js.gz +0 -0
- package/build/server/chunks/chunks/env2.js-DXveJt1Y.js.map +0 -1
- package/build/server/chunks/chunks/exports.js-CvFPPbaH.js.map +0 -1
- package/build/server/chunks/chunks/internal.js-Cc3oBhL-.js.map +0 -1
- package/build/server/chunks/chunks/internal2.js-DZ8ZzzjN.js.map +0 -1
- package/build/server/chunks/chunks/server.js-ByNB8uti.js.map +0 -1
- package/build/server/chunks/chunks/state.js-9DxsWxU-.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-BOjix7GN.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/identity/_server.ts.js-g13uvmrX.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-CmHRxdZK.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-BgUwioxp.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-CIYo4C-0.js.map +0 -1
- package/build/server/chunks/entries/pages/_page.svelte.js-CpwYbxbM.js +0 -1291
- package/build/server/chunks/entries/pages/_page.svelte.js-CpwYbxbM.js.map +0 -1
- package/build/server/chunks/index.js-HHu-yOEK.js.map +0 -1
- package/build/server/chunks/manifest.js-BUrA7Zyr.js.map +0 -1
- package/build/server/chunks/nodes/0.js-gSRmrAt_.js +0 -9
- package/build/server/chunks/nodes/1.js-D68K7Ad_.js +0 -9
- package/build/server/chunks/nodes/2.js-ChYsaaoC.js +0 -9
- package/build/server/chunks/nodes/2.js-ChYsaaoC.js.map +0 -1
|
@@ -1,209 +1,169 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { g as getArchive } from '../../../../chunks/archive.js-C2D-5edp.js';
|
|
2
|
+
import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
|
|
3
|
+
import { a as apiError, p as parseRegionParam, r as resolveAwsConfig, c as createLogsClient, d as describeAwsError, b as resolveEffectiveRegion, R as REGION_PARAM_HINT } from '../../../../chunks/aws.js-DkPqAybc.js';
|
|
4
|
+
import { p as parseSourceParam, S as SOURCE_PARAM_HINT } from '../../../../chunks/source.js-DZEVvuho.js';
|
|
5
|
+
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-B3o2hyWD.js';
|
|
3
6
|
import '../../../../chunks/utils.js-BIlHjgGW.js';
|
|
4
7
|
import { FilterLogEventsCommand } from '@aws-sdk/client-cloudwatch-logs';
|
|
5
|
-
import '../../../../chunks/
|
|
6
|
-
import '@aws-sdk/client-sts';
|
|
8
|
+
import '../../../../chunks/log-buffer.js-BI_gQOls.js';
|
|
7
9
|
import 'node:fs';
|
|
10
|
+
import 'node:os';
|
|
8
11
|
import 'node:path';
|
|
12
|
+
import 'node:timers/promises';
|
|
13
|
+
import 'node:crypto';
|
|
14
|
+
import '../../../../chunks/shared-server.js-Dn5XheXH.js';
|
|
15
|
+
import '@aws-sdk/client-sts';
|
|
16
|
+
import '../../../../chunks/time-range.js-BLMT8aU3.js';
|
|
9
17
|
import '../../../../chunks/shared.js-CgjUIvRK.js';
|
|
10
18
|
import '../../../../chunks/uneval.js-DaakSYFQ.js';
|
|
11
19
|
|
|
12
|
-
//#region src/lib/server/
|
|
13
|
-
/**
|
|
14
|
-
var
|
|
15
|
-
/**
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
h: 36e5,
|
|
25
|
-
d: 864e5,
|
|
26
|
-
w: 6048e5
|
|
27
|
-
};
|
|
28
|
-
var DURATION_PATTERN = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d|w)$/i;
|
|
29
|
-
var EPOCH_PATTERN = /^\d+$/;
|
|
30
|
-
/**
|
|
31
|
-
* Parses a single-unit duration such as `500ms`, `30s`, `15m`, `2h`, `3d` or
|
|
32
|
-
* `1w`. Returns `null` for anything invalid, negative or zero.
|
|
33
|
-
*/
|
|
34
|
-
function parseDurationMs(value) {
|
|
35
|
-
if (typeof value !== "string") return null;
|
|
36
|
-
const match = DURATION_PATTERN.exec(value.trim());
|
|
37
|
-
if (match === null) return null;
|
|
38
|
-
const amount = Number(match[1]);
|
|
39
|
-
const unit = DURATION_UNITS[match[2].toLowerCase()];
|
|
40
|
-
if (unit === void 0 || !Number.isFinite(amount)) return null;
|
|
41
|
-
const ms = amount * unit;
|
|
42
|
-
if (!Number.isFinite(ms) || ms <= 0) return null;
|
|
43
|
-
return Math.round(ms);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Parses a start point into epoch milliseconds.
|
|
47
|
-
*
|
|
48
|
-
* Accepts epoch milliseconds (`1700000000000`), a duration relative to `now`
|
|
49
|
-
* (`15m`) and ISO 8601 timestamps. Returns `null` when the value is missing or
|
|
50
|
-
* cannot be understood.
|
|
51
|
-
*/
|
|
52
|
-
function parseStartTime(value, now) {
|
|
53
|
-
if (typeof value !== "string") return null;
|
|
54
|
-
const trimmed = value.trim();
|
|
55
|
-
if (trimmed.length === 0) return null;
|
|
56
|
-
if (EPOCH_PATTERN.test(trimmed)) return Number(trimmed);
|
|
57
|
-
const duration = parseDurationMs(trimmed);
|
|
58
|
-
if (duration !== null) return now - duration;
|
|
59
|
-
const parsed = Date.parse(trimmed);
|
|
60
|
-
return Number.isNaN(parsed) ? null : parsed;
|
|
61
|
-
}
|
|
62
|
-
/** Resolves the effective start time, clamped to the last 14 days and to `now`. */
|
|
63
|
-
function resolveStartTime(input) {
|
|
64
|
-
const { now } = input;
|
|
65
|
-
let start = parseStartTime(input.startTime, now);
|
|
66
|
-
if (start === null) start = now - (parseDurationMs(input.lookback ?? "") ?? DEFAULT_LOOKBACK_MS);
|
|
67
|
-
const oldestAllowed = now - MAX_LOOKBACK_MS;
|
|
68
|
-
if (start > now) start = now;
|
|
69
|
-
if (start < oldestAllowed) start = oldestAllowed;
|
|
70
|
-
return Math.round(start);
|
|
71
|
-
}
|
|
72
|
-
/** Parses a poll interval in milliseconds, defaulting to 1000 and clamped to 250..15000. */
|
|
73
|
-
function clampPollMs(value) {
|
|
74
|
-
if (typeof value !== "string") return DEFAULT_POLL_MS$1;
|
|
75
|
-
const trimmed = value.trim();
|
|
76
|
-
if (trimmed.length === 0) return DEFAULT_POLL_MS$1;
|
|
77
|
-
const parsed = Number(trimmed);
|
|
78
|
-
if (!Number.isFinite(parsed)) return DEFAULT_POLL_MS$1;
|
|
79
|
-
return Math.min(Math.max(Math.round(parsed), MIN_POLL_MS), MAX_POLL_MS);
|
|
80
|
-
}
|
|
81
|
-
/** Default historic window when neither `range` nor `from`/`to` is given. */
|
|
82
|
-
var DEFAULT_HISTORIC_PRESET = "15m";
|
|
83
|
-
/** Parses the `mode` parameter; `null` for an unrecognised value. */
|
|
84
|
-
function parseMode(value) {
|
|
85
|
-
if (typeof value !== "string") return null;
|
|
86
|
-
const trimmed = value.trim().toLowerCase();
|
|
87
|
-
if (trimmed === "live" || trimmed === "historic") return trimmed;
|
|
88
|
-
return null;
|
|
20
|
+
//#region src/lib/server/archive-tail.ts
|
|
21
|
+
/** Page size used when the caller does not ask for one. */
|
|
22
|
+
var DEFAULT_ARCHIVE_PAGE_SIZE = 1e3;
|
|
23
|
+
/** Upper bound on one page, so a huge window cannot exhaust memory. */
|
|
24
|
+
var MAX_ARCHIVE_PAGE_SIZE = 5e3;
|
|
25
|
+
/** Events one archive request may return before it stops (matches the tailer). */
|
|
26
|
+
var DEFAULT_ARCHIVE_MAX_EVENTS = 1e4;
|
|
27
|
+
/** Message shown when DuckDB is missing or the file cannot be opened. */
|
|
28
|
+
function archiveUnavailableMessage(archive) {
|
|
29
|
+
const reason = archive.error;
|
|
30
|
+
const base = "The local archive is not available on this machine";
|
|
31
|
+
return reason === null || reason.length === 0 ? base : `${base}: ${reason}`;
|
|
89
32
|
}
|
|
90
33
|
/**
|
|
91
|
-
*
|
|
34
|
+
* Yields archived events for one window, oldest first.
|
|
92
35
|
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
36
|
+
* An unavailable archive produces a single `error` batch instead of throwing, so
|
|
37
|
+
* the browser shows a normal stream error. An aborted signal ends the generator
|
|
38
|
+
* without yielding an `end` batch, which is what the route treats as a
|
|
39
|
+
* client disconnect.
|
|
95
40
|
*/
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
41
|
+
async function* tailArchivedEvents(options) {
|
|
42
|
+
const { archive, region, logGroups, startTime, endTime, search = null, streamPrefix = null, levels = null, signal } = options;
|
|
43
|
+
if (!archive.available) {
|
|
44
|
+
yield {
|
|
45
|
+
type: "error",
|
|
46
|
+
message: archiveUnavailableMessage(archive),
|
|
47
|
+
code: "archive-unavailable"
|
|
48
|
+
};
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const requestedPageSize = options.pageSize ?? 1e3;
|
|
52
|
+
const pageSize = Math.min(Math.max(Number.isFinite(requestedPageSize) ? Math.round(requestedPageSize) : DEFAULT_ARCHIVE_PAGE_SIZE, 1), MAX_ARCHIVE_PAGE_SIZE);
|
|
53
|
+
const requestedMax = options.maxEvents ?? 1e4;
|
|
54
|
+
const maxEvents = Number.isFinite(requestedMax) && requestedMax > 0 ? Math.floor(requestedMax) : DEFAULT_ARCHIVE_MAX_EVENTS;
|
|
55
|
+
let cursor = null;
|
|
56
|
+
let emitted = 0;
|
|
57
|
+
for (;;) {
|
|
58
|
+
if (signal?.aborted === true) return;
|
|
59
|
+
const page = await archive.page({
|
|
60
|
+
region,
|
|
61
|
+
logGroups,
|
|
62
|
+
startTime,
|
|
63
|
+
endTime,
|
|
64
|
+
search,
|
|
65
|
+
streamPrefix,
|
|
66
|
+
levels,
|
|
67
|
+
after: cursor,
|
|
68
|
+
limit: pageSize
|
|
69
|
+
});
|
|
70
|
+
if (page.events.length === 0) {
|
|
71
|
+
yield {
|
|
72
|
+
type: "end",
|
|
73
|
+
reason: "window-complete"
|
|
74
|
+
};
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
emitted += page.events.length;
|
|
78
|
+
yield {
|
|
79
|
+
type: "events",
|
|
80
|
+
events: page.events
|
|
81
|
+
};
|
|
82
|
+
cursor = page.last;
|
|
83
|
+
if (cursor === null || page.events.length < pageSize) {
|
|
84
|
+
yield {
|
|
85
|
+
type: "end",
|
|
86
|
+
reason: "window-complete"
|
|
87
|
+
};
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (emitted >= maxEvents) {
|
|
91
|
+
yield {
|
|
92
|
+
type: "end",
|
|
93
|
+
reason: "event-limit"
|
|
94
|
+
};
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
103
98
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
return
|
|
116
|
-
start: Math.round(clampedStart),
|
|
117
|
-
end: Math.round(clampedEnd),
|
|
118
|
-
clamped: clampedStart !== Math.round(start) || clampedEnd !== Math.round(end)
|
|
119
|
-
};
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/lib/server/multi-tail.ts
|
|
101
|
+
/** Events-payload batch reasons, worst first. */
|
|
102
|
+
var END_PRECEDENCE = [
|
|
103
|
+
"repeated-errors",
|
|
104
|
+
"event-limit",
|
|
105
|
+
"window-complete"
|
|
106
|
+
];
|
|
107
|
+
/** Picks the most serious end reason from the sources. */
|
|
108
|
+
function mergeEndReason(reasons) {
|
|
109
|
+
for (const candidate of END_PRECEDENCE) if (reasons.includes(candidate)) return candidate;
|
|
110
|
+
return "window-complete";
|
|
120
111
|
}
|
|
121
112
|
/**
|
|
122
|
-
*
|
|
123
|
-
* time.
|
|
113
|
+
* Yields every batch of every source, then one `end`.
|
|
124
114
|
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* smallest preset. Windows are clamped to the last 14 days and to `now` so the
|
|
128
|
-
* request can never ask CloudWatch for data it will not return.
|
|
115
|
+
* A failing source yields its own `error` batch; it never cancels the others, so
|
|
116
|
+
* one unreadable group does not silence the rest of the view.
|
|
129
117
|
*/
|
|
130
|
-
function
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
ok: false,
|
|
136
|
-
code: "invalid-mode",
|
|
137
|
-
message: "Invalid mode: expected \"live\" or \"historic\""
|
|
138
|
-
};
|
|
139
|
-
if (mode === "live") return {
|
|
140
|
-
ok: true,
|
|
141
|
-
mode,
|
|
142
|
-
startTime: resolveStartTime({
|
|
143
|
-
startTime: input.startTime,
|
|
144
|
-
lookback: input.lookback,
|
|
145
|
-
now
|
|
146
|
-
}),
|
|
147
|
-
endTime: null,
|
|
148
|
-
preset: null,
|
|
149
|
-
clamped: false
|
|
150
|
-
};
|
|
151
|
-
const from = input.from?.trim() ?? "";
|
|
152
|
-
const to = input.to?.trim() ?? "";
|
|
153
|
-
if (from.length > 0 || to.length > 0) {
|
|
154
|
-
if (from.length === 0 || to.length === 0) return {
|
|
155
|
-
ok: false,
|
|
156
|
-
code: "invalid-window",
|
|
157
|
-
message: "A custom window needs both \"from\" and \"to\""
|
|
158
|
-
};
|
|
159
|
-
const parsedFrom = parseStartTime(from, now);
|
|
160
|
-
const parsedTo = parseInstant(to);
|
|
161
|
-
if (parsedFrom === null) return {
|
|
162
|
-
ok: false,
|
|
163
|
-
code: "invalid-time",
|
|
164
|
-
message: `Invalid "from": expected epoch milliseconds, a duration such as 3h, or an ISO 8601 timestamp`
|
|
165
|
-
};
|
|
166
|
-
if (parsedTo === null) return {
|
|
167
|
-
ok: false,
|
|
168
|
-
code: "invalid-time",
|
|
169
|
-
message: "Invalid \"to\": expected epoch milliseconds or an ISO 8601 timestamp"
|
|
170
|
-
};
|
|
171
|
-
if (parsedTo <= parsedFrom) return {
|
|
172
|
-
ok: false,
|
|
173
|
-
code: "invalid-window",
|
|
174
|
-
message: "The end of the window must be after its start"
|
|
175
|
-
};
|
|
176
|
-
const clamped = clampWindow(parsedFrom, parsedTo, now);
|
|
177
|
-
if (clamped === null || clamped.end <= clamped.start) return {
|
|
178
|
-
ok: false,
|
|
179
|
-
code: "invalid-window",
|
|
180
|
-
message: "The requested window is outside the 14 days CloudWatch Logs keeps"
|
|
181
|
-
};
|
|
182
|
-
return {
|
|
183
|
-
ok: true,
|
|
184
|
-
mode,
|
|
185
|
-
startTime: clamped.start,
|
|
186
|
-
endTime: clamped.end,
|
|
187
|
-
preset: null,
|
|
188
|
-
clamped: clamped.clamped
|
|
189
|
-
};
|
|
118
|
+
async function* mergeTails(sources) {
|
|
119
|
+
if (sources.length === 0) return;
|
|
120
|
+
if (sources.length === 1) {
|
|
121
|
+
yield* sources[0];
|
|
122
|
+
return;
|
|
190
123
|
}
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
mode,
|
|
202
|
-
startTime: Math.round(now - presetDurationMs(preset)),
|
|
203
|
-
endTime: end,
|
|
204
|
-
preset,
|
|
205
|
-
clamped: false
|
|
124
|
+
const queue = [];
|
|
125
|
+
let waiting = null;
|
|
126
|
+
/** Sources whose end marker has been consumed, so their batches are all out. */
|
|
127
|
+
let completed = 0;
|
|
128
|
+
const endReasons = [];
|
|
129
|
+
const push = (item) => {
|
|
130
|
+
queue.push(item);
|
|
131
|
+
const wake = waiting;
|
|
132
|
+
waiting = null;
|
|
133
|
+
wake?.();
|
|
206
134
|
};
|
|
135
|
+
for (const source of sources) (async () => {
|
|
136
|
+
let endReason = null;
|
|
137
|
+
try {
|
|
138
|
+
for await (const batch of source) if (batch.type === "end") endReason = batch.reason;
|
|
139
|
+
else push({ batch });
|
|
140
|
+
} catch {} finally {
|
|
141
|
+
if (endReason !== null) endReasons.push(endReason);
|
|
142
|
+
push({ done: true });
|
|
143
|
+
}
|
|
144
|
+
})();
|
|
145
|
+
for (;;) {
|
|
146
|
+
if (queue.length === 0) {
|
|
147
|
+
if (completed >= sources.length) {
|
|
148
|
+
yield {
|
|
149
|
+
type: "end",
|
|
150
|
+
reason: mergeEndReason(endReasons)
|
|
151
|
+
};
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await new Promise((resolve) => {
|
|
155
|
+
waiting = resolve;
|
|
156
|
+
if (queue.length > 0 || completed >= sources.length) {
|
|
157
|
+
waiting = null;
|
|
158
|
+
resolve();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const item = queue.shift();
|
|
164
|
+
if ("batch" in item) yield item.batch;
|
|
165
|
+
else completed += 1;
|
|
166
|
+
}
|
|
207
167
|
}
|
|
208
168
|
//#endregion
|
|
209
169
|
//#region src/lib/server/sse.ts
|
|
@@ -435,6 +395,16 @@ async function* tailLogEvents(options) {
|
|
|
435
395
|
var PING_INTERVAL_MS = 15e3;
|
|
436
396
|
/** Stop the stream after this many consecutive failed polls. */
|
|
437
397
|
var MAX_CONSECUTIVE_ERRORS = 8;
|
|
398
|
+
/** Bounds for the archive `pageSize` parameter. */
|
|
399
|
+
var ARCHIVE_PAGE_LIMITS = {
|
|
400
|
+
min: 1,
|
|
401
|
+
max: 5e3
|
|
402
|
+
};
|
|
403
|
+
/** Bounds for the archive `max` parameter (events per request). */
|
|
404
|
+
var ARCHIVE_MAX_LIMITS = {
|
|
405
|
+
min: 1,
|
|
406
|
+
max: 1e5
|
|
407
|
+
};
|
|
438
408
|
var SSE_HEADERS = {
|
|
439
409
|
"content-type": "text/event-stream; charset=utf-8",
|
|
440
410
|
"cache-control": "no-cache, no-transform",
|
|
@@ -442,44 +412,180 @@ var SSE_HEADERS = {
|
|
|
442
412
|
"x-accel-buffering": "no"
|
|
443
413
|
};
|
|
444
414
|
/**
|
|
415
|
+
* Tags every event of one tail with its log group.
|
|
416
|
+
*
|
|
417
|
+
* A merged multi-group stream has to say which group each line came from, both
|
|
418
|
+
* for the archive and for the group column in the viewer.
|
|
419
|
+
*/
|
|
420
|
+
async function* taggedEvents(source, group) {
|
|
421
|
+
for await (const batch of source) {
|
|
422
|
+
if (batch.type !== "events") {
|
|
423
|
+
yield batch;
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
const events = [];
|
|
427
|
+
for (const event of batch.events) events.push({
|
|
428
|
+
...event,
|
|
429
|
+
group
|
|
430
|
+
});
|
|
431
|
+
yield {
|
|
432
|
+
type: "events",
|
|
433
|
+
events
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Writes one batch to the archive, under the right group.
|
|
439
|
+
*
|
|
440
|
+
* A merged multi-group stream tags every event with its own group, so a batch
|
|
441
|
+
* that mixes groups is split; a single-group stream falls back to the group the
|
|
442
|
+
* request named.
|
|
443
|
+
*/
|
|
444
|
+
async function recordBatch(archive, region, groupNames, events) {
|
|
445
|
+
const fallback = groupNames[0] ?? "";
|
|
446
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
447
|
+
for (const event of events) {
|
|
448
|
+
const group = event.group ?? fallback;
|
|
449
|
+
const bucket = byGroup.get(group);
|
|
450
|
+
if (bucket === void 0) byGroup.set(group, [event]);
|
|
451
|
+
else bucket.push(event);
|
|
452
|
+
}
|
|
453
|
+
for (const [group, groupEvents] of byGroup) await archive.record(region, group, groupEvents);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Parses a positive integer parameter within `limits`.
|
|
457
|
+
*
|
|
458
|
+
* Returns `null` for a missing value (meaning "use the default") and for an
|
|
459
|
+
* unusable one, so a typo falls back to the default instead of failing the
|
|
460
|
+
* stream; an out-of-range value is clamped rather than rejected.
|
|
461
|
+
*/
|
|
462
|
+
function parseBoundedInt(value, limits) {
|
|
463
|
+
if (value === null) return null;
|
|
464
|
+
const trimmed = value.trim();
|
|
465
|
+
if (trimmed.length === 0) return null;
|
|
466
|
+
const parsed = Number(trimmed);
|
|
467
|
+
if (!Number.isFinite(parsed)) return null;
|
|
468
|
+
return Math.min(Math.max(Math.round(parsed), limits.min), limits.max);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Builds the feed for a request.
|
|
472
|
+
*
|
|
473
|
+
* The archive path never creates a CloudWatch client, so browsing history works
|
|
474
|
+
* with no credentials and no network; it does need a region, because archived
|
|
475
|
+
* rows are stored per region. Failures come back as an `apiError` response the
|
|
476
|
+
* route returns unchanged.
|
|
477
|
+
*/
|
|
478
|
+
async function resolveFeed(request) {
|
|
479
|
+
const { source, config, env, groupNames, startTime, endTime, signal } = request;
|
|
480
|
+
if (source === "archive") {
|
|
481
|
+
const region = config.region ?? "";
|
|
482
|
+
if (region === "") return apiError(400, "Query parameter \"region\" is required when source=archive", "missing-region-param");
|
|
483
|
+
return {
|
|
484
|
+
region,
|
|
485
|
+
groupNames,
|
|
486
|
+
generator: tailArchivedEvents({
|
|
487
|
+
archive: await getArchive(env),
|
|
488
|
+
region,
|
|
489
|
+
logGroups: groupNames,
|
|
490
|
+
startTime,
|
|
491
|
+
endTime: endTime ?? Date.now(),
|
|
492
|
+
search: request.search,
|
|
493
|
+
levels: request.levels,
|
|
494
|
+
...request.pageSize === null ? {} : { pageSize: request.pageSize },
|
|
495
|
+
...request.maxEvents === null ? {} : { maxEvents: request.maxEvents },
|
|
496
|
+
signal
|
|
497
|
+
}),
|
|
498
|
+
release: () => void 0
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
let client;
|
|
502
|
+
try {
|
|
503
|
+
client = createLogsClient(config);
|
|
504
|
+
} catch (error) {
|
|
505
|
+
const described = describeAwsError(error);
|
|
506
|
+
return apiError(502, described.message, described.code);
|
|
507
|
+
}
|
|
508
|
+
let region;
|
|
509
|
+
try {
|
|
510
|
+
region = await resolveEffectiveRegion(client, config);
|
|
511
|
+
} catch (error) {
|
|
512
|
+
client.destroy();
|
|
513
|
+
const described = describeAwsError(error);
|
|
514
|
+
return apiError(502, described.message, described.code);
|
|
515
|
+
}
|
|
516
|
+
const tails = groupNames.map((group) => taggedEvents(tailLogEvents({
|
|
517
|
+
client,
|
|
518
|
+
logGroupName: group,
|
|
519
|
+
startTime,
|
|
520
|
+
endTime,
|
|
521
|
+
pollIntervalMs: request.pollIntervalMs,
|
|
522
|
+
filterPattern: request.filterPattern,
|
|
523
|
+
signal,
|
|
524
|
+
maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS
|
|
525
|
+
}), group));
|
|
526
|
+
return {
|
|
527
|
+
region,
|
|
528
|
+
groupNames,
|
|
529
|
+
generator: mergeTails(tails),
|
|
530
|
+
release: () => client.destroy()
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
445
534
|
* `GET /api/stream` - server-sent events for one log group.
|
|
446
535
|
*
|
|
447
536
|
* Emits `ready` first, then `log` per batch, `ping` after 15 s of silence and
|
|
448
|
-
* a final `end`.
|
|
449
|
-
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
537
|
+
* a final `end`. `source=cloudwatch` (the default) polls CloudWatch Logs with
|
|
538
|
+
* the ambient credentials; `source=archive` replays the local DuckDB archive and
|
|
539
|
+
* needs neither credentials nor a region parameter resolution.
|
|
540
|
+
*
|
|
541
|
+
* The stream is cancelled through `request.signal`, and every timer and listener
|
|
542
|
+
* is removed so the dev server can exit.
|
|
452
543
|
*/
|
|
453
544
|
var GET = async ({ url, request }) => {
|
|
454
|
-
const
|
|
455
|
-
if (
|
|
545
|
+
const groupSelection = parseGroupParams(url.searchParams.get("group"), url.searchParams.get("groups"));
|
|
546
|
+
if (!groupSelection.ok) return apiError(400, groupSelection.message, groupSelection.code);
|
|
547
|
+
const groupNames = groupSelection.names;
|
|
456
548
|
const parsedRegion = parseRegionParam(url.searchParams.get("region"));
|
|
457
549
|
if (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, "invalid-region");
|
|
550
|
+
const source = parseSourceParam(url.searchParams.get("source"));
|
|
551
|
+
if (source === null) return apiError(400, SOURCE_PARAM_HINT, "invalid-source");
|
|
458
552
|
const env = readEnv();
|
|
459
553
|
const config = resolveAwsConfig(env, parsedRegion.region);
|
|
460
554
|
const filterPattern = url.searchParams.get("filterPattern")?.trim();
|
|
555
|
+
const search = url.searchParams.get("search")?.trim() ?? "";
|
|
556
|
+
const levels = parseLevelParam(url.searchParams.get("level"));
|
|
557
|
+
if (levels === void 0) return apiError(400, LEVEL_PARAM_HINT, "invalid-level");
|
|
558
|
+
if (levels !== null && source !== "archive") return apiError(400, "The \"level\" filter applies to source=archive; use filterPattern to filter CloudWatch", "invalid-level");
|
|
461
559
|
const streamWindow = resolveWindow({
|
|
462
|
-
mode: url.searchParams.get("mode"),
|
|
560
|
+
mode: url.searchParams.get("mode") ?? (source === "archive" ? "historic" : null),
|
|
463
561
|
range: url.searchParams.get("range"),
|
|
464
562
|
from: url.searchParams.get("from"),
|
|
465
563
|
to: url.searchParams.get("to"),
|
|
466
564
|
startTime: url.searchParams.get("startTime"),
|
|
467
565
|
lookback: url.searchParams.get("lookback"),
|
|
468
566
|
now: Date.now()
|
|
469
|
-
});
|
|
567
|
+
}, source === "archive" ? { maxLookbackMs: null } : {});
|
|
470
568
|
if (!streamWindow.ok) return apiError(400, streamWindow.message, streamWindow.code);
|
|
471
|
-
|
|
472
|
-
let client;
|
|
473
|
-
let region;
|
|
474
|
-
try {
|
|
475
|
-
client = createLogsClient(config);
|
|
476
|
-
region = await resolveEffectiveRegion(client, config);
|
|
477
|
-
} catch (error) {
|
|
478
|
-
const described = describeAwsError(error);
|
|
479
|
-
return apiError(502, described.message, described.code);
|
|
480
|
-
}
|
|
481
|
-
const encoder = new TextEncoder();
|
|
569
|
+
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");
|
|
482
570
|
const bodyAbort = new AbortController();
|
|
571
|
+
const feed = await resolveFeed({
|
|
572
|
+
source,
|
|
573
|
+
config,
|
|
574
|
+
env,
|
|
575
|
+
groupNames,
|
|
576
|
+
startTime: streamWindow.startTime,
|
|
577
|
+
endTime: streamWindow.endTime,
|
|
578
|
+
filterPattern,
|
|
579
|
+
search: search.length === 0 ? null : search,
|
|
580
|
+
levels,
|
|
581
|
+
pageSize: parseBoundedInt(url.searchParams.get("pageSize"), ARCHIVE_PAGE_LIMITS),
|
|
582
|
+
maxEvents: parseBoundedInt(url.searchParams.get("max"), ARCHIVE_MAX_LIMITS),
|
|
583
|
+
pollIntervalMs: clampPollMs(url.searchParams.get("poll")),
|
|
584
|
+
signal: bodyAbort.signal
|
|
585
|
+
});
|
|
586
|
+
if (feed instanceof Response) return feed;
|
|
587
|
+
const archive = source === "cloudwatch" ? await getArchive(env) : null;
|
|
588
|
+
const encoder = new TextEncoder();
|
|
483
589
|
let streamController;
|
|
484
590
|
let closed = false;
|
|
485
591
|
let pingTimer;
|
|
@@ -533,27 +639,20 @@ var GET = async ({ url, request }) => {
|
|
|
533
639
|
cleanedUp = true;
|
|
534
640
|
clearPing();
|
|
535
641
|
request.signal.removeEventListener("abort", onAbort);
|
|
536
|
-
|
|
642
|
+
feed.release();
|
|
537
643
|
};
|
|
538
644
|
const pump = async () => {
|
|
539
645
|
let consecutiveErrors = 0;
|
|
540
646
|
let reason = "completed";
|
|
541
647
|
try {
|
|
542
|
-
for await (const batch of
|
|
543
|
-
client,
|
|
544
|
-
logGroupName,
|
|
545
|
-
startTime: streamWindow.startTime,
|
|
546
|
-
endTime: streamWindow.endTime,
|
|
547
|
-
pollIntervalMs,
|
|
548
|
-
filterPattern,
|
|
549
|
-
signal: bodyAbort.signal,
|
|
550
|
-
maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS
|
|
551
|
-
})) {
|
|
648
|
+
for await (const batch of feed.generator) {
|
|
552
649
|
if (closed || bodyAbort.signal.aborted) break;
|
|
553
650
|
if (batch.type === "events") {
|
|
554
|
-
const
|
|
651
|
+
const events = withDetections(batch.events);
|
|
652
|
+
const payload = { events };
|
|
555
653
|
consecutiveErrors = 0;
|
|
556
654
|
enqueue(sseFrame("log", payload));
|
|
655
|
+
if (archive !== null) await recordBatch(archive, feed.region, feed.groupNames, events);
|
|
557
656
|
} else if (batch.type === "end") {
|
|
558
657
|
reason = batch.reason;
|
|
559
658
|
break;
|
|
@@ -584,9 +683,11 @@ var GET = async ({ url, request }) => {
|
|
|
584
683
|
start(controller) {
|
|
585
684
|
streamController = controller;
|
|
586
685
|
const payload = {
|
|
587
|
-
region,
|
|
588
|
-
logGroupName,
|
|
589
|
-
|
|
686
|
+
region: feed.region,
|
|
687
|
+
logGroupName: feed.groupNames[0] ?? "",
|
|
688
|
+
groups: [...feed.groupNames],
|
|
689
|
+
endpoint: source === "archive" ? null : config.endpoint,
|
|
690
|
+
source,
|
|
590
691
|
startTime: streamWindow.startTime,
|
|
591
692
|
endTime: streamWindow.endTime,
|
|
592
693
|
mode: streamWindow.mode,
|
|
@@ -608,4 +709,4 @@ var GET = async ({ url, request }) => {
|
|
|
608
709
|
};
|
|
609
710
|
|
|
610
711
|
export { GET };
|
|
611
|
-
//# sourceMappingURL=_server.ts.js-
|
|
712
|
+
//# sourceMappingURL=_server.ts.js-BWRHawY8.js.map
|