From 4575fca1dd5e4cd14a90e76bd75b3ffe10a2d773 Mon Sep 17 00:00:00 2001 From: angelozerr Date: Tue, 2 Feb 2021 22:09:07 +0100 Subject: [PATCH] Provide an option to clear the consumer view Fixes #40 Signed-off-by: azerr --- CHANGELOG.md | 1 + docs/Consuming.md | 36 ++++++++++- ...mer-group-after-starting-from-explorer.png | Bin 0 -> 45372 bytes docs/assets/consumer-view.png | Bin 0 -> 25366 bytes docs/assets/start-consumer-from-command.png | Bin 0 -> 6992 bytes docs/assets/start-consumer-from-explorer.png | Bin 0 -> 17189 bytes images/dark/clear-all.svg | 1 + images/light/clear-all.svg | 1 + package.json | 15 +++++ src/commands/consumers.ts | 41 +++++++++--- src/extension.ts | 12 +++- .../consumerVirtualTextDocumentProvider.ts | 60 +++++++++++------- 12 files changed, 131 insertions(+), 36 deletions(-) create mode 100644 docs/assets/consumer-group-after-starting-from-explorer.png create mode 100644 docs/assets/consumer-view.png create mode 100644 docs/assets/start-consumer-from-command.png create mode 100644 docs/assets/start-consumer-from-explorer.png create mode 100644 images/dark/clear-all.svg create mode 100644 images/light/clear-all.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 15ccdb0..bfae418 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to Kafka extension will be documented in this file. - Selected Cluster or Topic can now be deleted via the Delete shortcut (Cmd+Backspace on Mac). See [#79](https://github.com/jlandersen/vscode-kafka/issues/79) - Added SASL/SCRAM-256 and SASL/SCRAM-512 authentication support. See [#3](https://github.com/jlandersen/vscode-kafka/issues/3). - Added the option to enable basic SSL support for clusters without authentication. See [#84](https://github.com/jlandersen/vscode-kafka/issues/84). +- The consumer view now provides a `Clear Consumer View` command. See [#84](https://github.com/jlandersen/vscode-kafka/issues/40). ### Changed - Improved the "New cluster" and "New topic" wizards: now include validation and a back button. See [#21](https://github.com/jlandersen/vscode-kafka/issues/21). diff --git a/docs/Consuming.md b/docs/Consuming.md index d278bf8..01a4ea3 100644 --- a/docs/Consuming.md +++ b/docs/Consuming.md @@ -1,10 +1,44 @@ # Consuming messages -Consuming topics can be done by right clicking a topic in the explorer or from the command palette. Some things to note about consuming: +Consuming topics can be done: + +* from the [Kafka Explorer](#kafka-explorer), by right-clicking on a topic and selecting "Start Consumer". +* from the [Start Consumer](#start-consumer-command), from the command palette. + +## Consume with ... + +### Kafka explorer + +You can start consuming messages from the [Kafka Explorer](Explorer.md#explorer), by right-clicking on a topic: + +![Start Consumer with Explorer](assets/start-consumer-from-explorer.png) + +Once this command is launched, it creates a consumer group (with an auto-generated id), and opens the [Consumer View](#consumer-view) where you can see the messages being consumed: + +![Consumer group / Consumer View](assets/consumer-group-after-starting-from-explorer.png) + +In this case, the starting offset can be only be configured via the [kafka.consumers.offset](#kafkaconsumersoffset) preference. + +Known limitations: * UTF-8 encoded keys and values only. If data is encoded differently, it will not be pretty. * One consumer group is created per topic (may change in the future to just have one for the extension). +### Start Consumer command + +![Start Consumer from command palette](assets/start-consumer-from-command.png) + +## Consumer View + +The `Consumer View` is a read-only editor which shows consumed messages for a given topic: + +![Consumer view](assets/consumer-view.png) + +This editor provides 2 commands on the top right of the editor: + + * `Clear Consumer View`: clears the view. + * `Start/Stop`: to stop or (re)start the consumer. + Consumers are based on virtual documents, available in the VS Code extension API. A consumer will keep running even if you close the document in the editor. You should make sure to close the consumer explicitly, either via the command palette, the status bar element or the start/stop action button as well. The VS Code API does not support detecting if a virtual document is closed immediately. Instead, the underlying virtual document is automatically closed after two minutes if the document is closed in the editor. ## Preferences diff --git a/docs/assets/consumer-group-after-starting-from-explorer.png b/docs/assets/consumer-group-after-starting-from-explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..f92cdb329cbf27db33f345c31222594139664e76 GIT binary patch literal 45372 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 literal 0 HcmV?d00001 diff --git a/docs/assets/consumer-view.png b/docs/assets/consumer-view.png new file mode 100644 index 0000000000000000000000000000000000000000..71ab5ef4200444fa58c86d3e7a5f629b51be78e5 GIT binary patch literal 25366 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 literal 0 HcmV?d00001 diff --git a/docs/assets/start-consumer-from-explorer.png b/docs/assets/start-consumer-from-explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..f037ed89d1779eae5723378328562c987885938e GIT binary patch literal 17189 zcmc({XH-*Rv?d%YVneAa0*a8(5k!a(!Gd5Yq4%Z~F+#x5dsI{)p$MS}1WR8 z=m`9#rZEV#8vz3Cx_n?i@Dn!23~txB0d#|vg(cXs1!>f zmy4O~YRM*Eu}*(f`R(H;F@Eq3v^#n)Zeh^1P+UBI_YI>{4=W?hLSFq1OEtpkI(k9?%u- z%6ELAHBRPU(5HC!`}-b*J%a86`G^VH?s}2+f8(n*bkf#Z3(g>H&V&Y0XK_WeP}Gw! z*3RM5pamW(C+Oblv@51AV6n%7(V+j9Ix#)aDL`4YaedlCiBGnG8d+=3(~!7ysw22b9oV_Y#~ZI@D(6$eW8enj48-O{Kyc{=8qNZ;WiTkLWlN zAN_|{uE?f~A*^q7-RsI?517z~JRM3tB#b+3O=ZPo1+GQVNbJE0*!j#OWuQ+62z>&% zcFPaFFtctqI7*ZDq}VkyZoSeKoO|Mm%elQK9rwCAVIAih_jJt6^}P{mT7cLQ#=2;+ zIX|MV+Uh?s*)pWv$)Dwqyb$QFQLU!QmSeb9$9FG|D~H;_M%{iqmrAFS5>GmG>YSXi zNfyxH>PITyAS`^U%Y~P~!8b9B78o?{q@|{qYZ%d`) zxREqs)T^hV0=5=#foZVVav@2DyQW&B9Pf^WB7+fJnDjI7=VHcL8$VhvAQGe+`}i}c z@ZEVq1uWNtJCW9EO-1S`gYPnXHOu-WRAgyIAz8S1^OxNbUKgcMl&AaAiUTJWrH{YQ zEnB=k>y0iJpchR&qmrluT|%?8@4T&Gf6xMi1BiyrL~W7K>cj+@&R6TdF@$D2{-84W zwOq`l@qH7cB3tdPlw!Q;gxOGFt!f@$(a35>XJ%WmiSn!6S2Qm9qVEx&i|-n3K)$?t z4v~8QWU)qv?&FvCKc6aL8J5b4SxM<RaNB0hjo(e0N5ZM^)^-*o6Cjh^YBrW%KKD7BSBL>=z=*;47^ka0L^#%$eQ z+U%t#D81Ya!m1d5z99cgOeYzF#&SJWNpj%ZIUYYuX%jOqp*@I?XzncQ%ZiuK&(B9g zLZVDEHZ-rMy1BR{e|SaKkFt?eEbIKfks^vv4}%pHO`V#z9d7o1Z0F3NA;t81T%R9< zfGouewxUfgeKw$*NGgVLtAIt%yV2lY=lP#Yo;`IrLP>}+HraMKKJ})hxrf%UDIv|- z^(Naq1M~IXM?G|9!{?gx$wSjh>C%Wru8^sR_b0|E`3in7|onm2Qw)aS=ObZ>c@oh7<{V@QKDa~>XMM>BjU-olQi%(Q4G!9PkEND z3cvfNV~eiZiqE~dTimLvWV2>?jGiN_s<38buptCI54i#`0#qIfoUR!2jAG1QlV2yn ztqJyQOp_yK3U1?X)!>5P@d5Dg3U6S(c=cckie$kC)`69%H<6n+^J^y&CTW^Gk$9B= zy5;r^h8#jTF67Cx@x}>&9)nZF_wk=7TwudVuFM%|tzglj)lNsUi)QOLM4)Xh3`mo^<8c9D@ z9zkVOE_IfYn7Mx0(B5mc`D|5v%GShMBIAD4@UC5m8&?7R()e( z8#+3`#L1cmcfdA`(JO-t+JKm+LWcmytgt|MxHk3za`W)9g0V-?q{0kUwDHg+ZY?nn z{=hzj#gRl_-IOX5I2WIH((iW(x%rLWPSjY%LNfw$p|AXGZ87stm?cN%#E@%ai=)gz z1O7z9RVeK@JjCcyCw@tKoSzg!((sLC zI5Wl2pAKSC7jLv4<9^~UT`bp#AS~QNxrmO9a*i0_kbyy%kx*A@Amrr(Ei*t{RuwNP;(1zXbeJR(IS zW1OQcYWPr-Chx{x4esYnbidP+E?qobZFBajZ6T0r3eB%X>>IRPLNv6P+11Fa-WAP@ zh(Z5r{9RHrNuhr#l|4L-$8*_ub#XNFb^94C-oEkA0ePVTRydcsWwHg)Gjys5e!2B= z(uKf3Oy|ncd3|+eg`wbN`l4B&`qp+@TU=1bM$h6Vhl1%A?sgoFcetIIxglc%fhW|- z1_J7SAH&CG~pY~2iS0`OLbRb?vtKuEGSBc*uXwffP5GsOH{WhjzklN-l&7GdpZN4Ime`1B3Wv#Rr)`ch zSF^aB8vH(A7F@Jst-WC1Gr9EAH6aQ9(NHu0QhZslE!>uQ&)A%TAZT4<-f+K`*Ljr; zR?|e`5(A;1HPqrgcT7T=ihzM`r zQ=ZkDtZ4A>3nTT`wjw~-o@(ncj(_${n2NMU><%-NY%X z3slb<+1o}TtE> zE}5T0I7%2;d_BcWv1BfN8Tg(X(zsEzhhhO+|7n;Vrqm+xMh3DlQCjcC^ydi$pJWgs zn-lN$pg4mb*_zhcr%~9#BPFbB=2GTsm>s<$Eb}wbR*U@`V0I5}cfP zlp^GtV9xirk$GO{$=>h3%AtgW$GI72gPSVxUPf}2%5+8hx6SB?F@*Wkgj#;y0;9(A zNu}w&@3{uDG)e52!%DByp%a!Qbe^X1ZEnZiKk}%;M?2e6H$F-OPP%t}HOOq!#Ne_S zxfv!@A|$WM>d%3Vr1aMc4PBh0R$iN(fqnP+u+xXwfDzZ*FmRQ`Cn{O8VGz3K4^4F) zrSFhzw5X{Tcy~@j<-A$ir;cYx$+Vt3AF?9pUl%T|c;T@46LgcW5y?!YT-(O9;w&B- z{8!^;3QyhJ$E}aX(tRvt^5Eo!FP+)j_N0F58CxY6>dPY(%JOXNj?)8<8>`)ur}K~< zGKoT#NB?Gqbt=-em9`JmYw)jP*6ycr-ZJ^uTQGVbKzF%I{p(2vPaT6i&=>#zu|QVZ zqgCgNn0m=aLFG68ma2}%WOo4Q#ESo}u&6Prlw9zxry%8=K_2u7HvA9-8LWLhFlhM&bet}G z80ZxLEq4cYnyeS7Lq#Um63rn0bA|R}kP4Z=HtNLOZQnN?ZMMB`U)qMGk4g`PoHZ9k zjA47rr@xQky^@og%Qq8AO(8Z%q}RtLWl>3oLFVuszYm<=KDQikW2>m=+y(Im0*g`) z=^#ql_{_DIW zfzS|mm)NP?yP|Ts#|lPYLS0JCdnzw>M=~POA$t$ra{Igblt6)t4&Ks|@N=ZNswWQ% z>!Fr?l0Y~OChmF=b7m)`h!%w3Aw;NUzEYH)tqvy|>FZ^ZulA0+!XvRi_3d!T&avtCmRN!i|nz zMc+T$y5~WL=#IY@bO}1Cm&#nqG3unc0|2!V{nv7~9lHL$;o)O~An3lo`<%cs1{#@@ zf}Q*hF#L~w{{<F3;P@0zKA5*2Fsrz=s&;j+RT30e4C^uvlK$`Dv`^*NQ)hc)DA8a2DxAOyWm3Ih+F`R6J@bc_fI{o_kq+A{`=E)tfJJXbvb z1x;Xckyd6hSYPybfpHl3?V|iR8nXDy-HS+3%d3P*$CTU>6VNAtznfeWKFT#$ZHnYJ zVJdNFC-zeVZm*Z3OXLjIebkR%1oiv{l@Y6z@>Dt>@DH&%FR@1Fb-AGJ8J<^3J=6198r{~l3uLYj z-16BdC*6{kR&2@-vV^Gb?Z-0u~ zg_)1{54SR9aoc+v^PX>4DVSsITMZwnPp9!m{;vfivYo%+Gv;(iNOj7OT~}s54w-4H_*Ec;BSrgcetE5`rl$x1=SiXWP0|5(;mYBK6(0AKS%`2}loeBy? zcX_&!Z8@@uqVJq=U8rR3ak#g>; zjx#j5#ZI=(!BBMB@EvO_q>$WT#M9c{Rq7{(=A#*wnfooW5MxMtbkJNYq~Oz)^gLXB zgN$4*H}gUIWs z8nk``f4~c5Q&w;knT{-qVaQSy#YX+aZw64;XS9c0ahvqlwVG&deH;Iw#rpx_uy$$0 zDd&rYL3*){^w&21WMzjA2O zqz2=;#@WjnMI;NM78q@X6^DVD3=+wn-ux-@8h9+eYsQjAG&=Qk zX4!viJv`h3lF*%4dyo0{AZYlRQVlyN*{+BOa?WEIl?CO*7lgNfkv8H8o}%)Nm$rIT zq|7P%+_pJ0mf}PzcYJcEQEGsGmyT7Xdd!+(Qq8@=Zk^As;_#}Yqu2*#gD2ukp)_*F zkcO=#ArbuYbIG$4R+-Mt=7xHadSS$9Fox2`1n8boEI#Vl-fO=a<6c$W0aTk};R(A2vRVTqgW^=_N<#nnY3eLKWK{T%8!XAyG7c(OiZ&Z8*H&95@W^g1@RRcL$IdsS4Xes zcly`s*@%hR6BLoGo3?uQ^&-U-$a)rN$|rHpeU1wwYVvG3Y>wHl z+LKgk8vEUg!F=49SY)R|z_jk`|%OmaCNnU4Okn#9+zKF#wM7 zjupp1kEAZhx7l5&O&G1CW*>k%hlKG$ctmqbpsUNt@}>^b=MxUMKGhr*Vdtnpcvt}A zVhmfK_I61V_AyT%+1gyjb%y+`qG_woeSU2ijbX`W%8oj(p2Td9Z#7JZf5oiQw{m%f zOGxU4@{=Z-i^R(%o)R7Yl=a3Z9q+uCrf2zP8|D$Kn{7#1i6xO$T|k1~1$rBDGfn-^ zL#}EtKK;gBX+(4K<-H1L1@Sx_ zbhY8qUa2zZ4Y4a}Ut}HTyiPF_O9POHbh*!>*YFyvjG_<_=y|*1-eL-~`;5M$8V&h4 zB|7INqYfJr^4DQ9-bw|zF-UF*Jla{yILC?Sg)-CGCFHU^q9T*zG!wMiwWm8Me}ZfC z8y6jwNeZ1|!G%Gf>T&ig2ICqy`4T#8GRR}htP9u2~v{}W$-5cE;oc;=lViS&3YnL9FgqNsoN8kKr;N;v;tyBzfqrS6L$2LredogDuJkyt z?^^?7xU_g^D$FH;@iYu;a!A>RFzBiB&f^+_Fi_M(eNrx~=Kcjz40SwvOfw}&KNi!xiurR8M^Y-{5X&CY)~BiUiE+h|vwXZ|X4 zn`+!)CmWZ;vPFAhPRJH(ujkK1@jzah9WRY_ z4ov?b%Cm`dWb^p;nMym?|J3(N0^D2n09x}>EAuB`0VFHL3%fqMbuCS9a;~yJKHR@4 z`C&>1P*LBG3q5)G+pAw$a=ufgh4>Od5aUYNKU7)CcY=~}CxJ!f5ui5!j1MA@_zb!d z@P6C|mV_&@QM(b;&%C@%4XO3}qU#pWi_fzxI)pv94o-9(6tXD_}l; z`LdtS&lC%dX!Ni|pS8Xt_6tvCmEou#T8{T}(c{oQ!&QFW^13RC`LHA-E8Vz0+ZAtf zs~S?++EO}mC5#gj6XO1PscLWG9`rq2E90FLzB-UL(PQBt3&6X^gJ5k1J7gPf0vk{3 zxM>lggFMB{As~a2(F7ZqtOnCw@|3s`p_2O7axBg&RKnm7q8`8>2<$oT@(vi(wD3WA z&T``5IH3G;3*%nSkx_2fCsfVrNhEJWTZ~6?O2uI`7A2V+J7c{b!UNI2>A;@ER9=)u zT;s{l(!9v3IS$cJFz=w>(3|He>Y3*u>Gz|+U;4Rpaf_uw_(MF&(25cgSzbz`#B(h= zbX|BvgBClUyE57G2v52ArfieY zBY+W#p{HaOx%Z&bp)|ND-d;wK?hF`ux2n3nwXQu^#!P`-qH6Qk{G9J}Lufj=VYa}4gv)_pP$5E7DI@{Xg}1OX zh^oSPa78K8C*ZZUoGS@>noH6CMg4X)-D9ub(C~|0Ol|E`2^k_cjP>Qg5tRY@5>Fki zvWC9V;44!+q^r*9G&oOo)|rbFXA#3RcuTQcpE1f(4J$%xT`L|v++*ZEBGS`$FmtP6 z(FN%047^#pf ziAenx5Xf@;Hg$s))%A?F*u?;s$~~SZASZD`R3ZZq0ERw`lqU%_M8^jxQserqSRks4+AG2Pm( zILfL?=AkG5m;-%{v+odgj z9z1SzrCWnu<@Qs<1`|t;BS){fj!z6_L1OLBy<9f$oIHd0w2xYJbQA9YbrHL46rD`V z_v}F(Onpw+4;I(^1xn}I0S?Kn4jVLw4%;GYUTTrhHZidqJqcp&9RlLk*YN&#)abKocwr+QvjroAr4L zhCJSs{%98T)N?5Sz|pNkJILuJnt@}?)Q#A0ON++54O0Jf1K`Ge7qIawDoP%Am`Wr7 ztAK0(5A594mnoK*5@oO#?KLeVB+$}gc2wSie&ri5@;lHMJyjdBjkExZ-MJxXfL6(! z8@)=P2F!_UXXe%Zv8D;7=jXZGw^_d*=;7p}{}!#H7RA6&wa|=V=`u3QokhC%Y+2_MnYb$+zW@n)4~GT zuU;+Tfx#*~>}eDuWcT?5B3`!W)u0y{8sJ~;Wj3&cV~sBLieXGObZn=cPOjf2bv568 z;%Z7sOQxP0$LZL(P@aza46ONEPQR{)d_0%#r@sUaRV%WXnKi{&+jEuPk6E*3hvauq zWX1;t?VEHq_g76Y7e+Rhx4ge&%r9|%)SXTbQ!;XK`R>S?7TgMCZEaAt90Fq&?6dOh ztGtq3dAx_?hPn9FHmfr}v0Y!omn|*Uzz9{5(2jx7Duj|pEg!@PVgT&U@hL1OcOr;I z7pYAFD{w>7yKUU1U4{Zjqo6zw@ztN5!;Iy1TFN^K`0MV$FDEB#_ZkV8Ggiz5wFkvznd9LrisgXQZD5KWT|D~U`>9FwKYP(gFk zH@?ariba0g#o6SJiu$g$ya z^aYBB6n^)JhdDkVrm7!E=P#I^w^ix|cWI*ssk1Md+kxs*NJuG|IR-iYqX?%IwQ5e7 z<7~(kJs#L#8Y1O&yPD^TD!RBTI?4nL$LJpS%vni{yV1>=$tv{4R(q@5&VWxJk`-8fy zSF~>sp^@a;_Tk6q_%V#7s_sp(y5)A8m#$Jx1qUdZT2VEoW5!AidyEl zFbUqk5wd#Xy07>L)}R$8)H*snqhO1*YSrMIjrKl{=9Y59xP$~#;m=`>i#SA=m=-e; zep5^RVTugU_#(h_5+_S|3QkJP0q)d#-OdYfYPj*rWp@ow8wTD^a!fuKfq;+nr^!rP zhL;NP3;xQXI`iDk^~i2Dbg%hNm#PgT9>I+>h$80lOS-;dp+Plk6`id5{=Lp)3->hC zW$p1NS~^-M`zz$}@rx$DzV_rsl z1wG5-1zs%mw!zwk>G`>F{-`Xpp2=lYoJ}UJy4Fm~r4%DIqD63gqu}w;qF!T!I5MR< z`ZJp;rk7c(OQ0HNmNi_I2>X0B?Qs<2u2+WaA>T(mTHIdfQ+OiQIpMPvAwRQJ2Vfhn zPnNa#d=2T#P5b&gs5{EUL_|;nf5e#~aXN2#8uA&GH9m-_QD0VooufmgpKN;>I-T=8!q3;aBCVrDQa%&+veGZBKQ6ZF#7R}p zbyi>5(Z#dLCei&W7`dw76)UfM@?25telq%nvUw$_EDvfBwy57vMAI=0=HWe3Ejc>k z`caj{&>FoXfL5$EAS6>Y2~QL8cfov3oPmnS6yxJymgK~}vz$%P2onVam~G@h*qgX& zW@M>HXkL7Di!h`Co7g(dRI+*v|B({|)t_9SKjGlCb*cKbus#xR*)&@83O=Heq%Q!u z9!>;b)41KOuVmi4)$eSkqVO@TThnehGKuae*}i5gAfK56KE|d-<(6d-$)xleK}Mz9 zT@8L+m&#Vv1pP#P-}E`=>l6CEk2~mFmeJGJzk)gv%7`MW9bq!bpL`3`r_Dx|n<5u0 zYuTZE3}3sny-juLi$=42Ox<^qa9@Iq(x0_=%Dt`NHlnRi*zUrn!4Esz>`R$$ zAQH1|CkLYzowBO@oUGHM;4VJxl~L_EC(w$h;-N$fe|Gw$(svE6Ec?FL_^~NyShDb9 z=|oy@PaLqjsgCOt^>X@IIi!-MPZjRav<9%p~MsH%tMsCnlZF z4QZ4z2kXRdVtL%hF9COonKxx#XmkWXJs92WKni>tdGq<-3qRIZr_&@ zU@u(b$#dH-l(xL+7rq(Ro}G=rt>|P)5s0RYKynR;F7p;pShiyR`N)< zr^3{>c@tJczRP)&#ricfjLS=_8^6XeCbdp%lVDZz!_tBbCfYC7ym<{arK(vOR`{DZ zud1))A!kC+OyA1hhkn$)2W>5w2HLp(RTOa){paI;%OkyO6<1ZI8Ht%M71i@!IsvR- zF-hHi8e^9ZG?sItzLDd^%1z7FwTd+z91p73BRO9c?Pcsh+zK)y3-#Tu7+o~BL09$# z=g}&)U;;TP2T@g(p80W9UwIjq=v2hwaEo!s)_q@?t6jP>SHwEm88viqDeFy7OxEqE zYm2j61r+&;HPPBUueA#AYCra+l7`uc9u|5*eThC|vpHMig8J3y=`?)zi)}45%4&P^ z@$(_H^oZaB+u-zF)RmsNBiR+1`<;5Kq9B5gkEEYpWGErA%50p=+|`&HEJb(VIHh7CiMWOy#e4>4V?=-?LmV19I+&ZZyI;;{)_EvpN^A6IF%2$J zmI5dNZUF*05NP<*tH4uCv5h^Wz(oGkKg7uM7ZCpk5G|-NbKN?7p1HSthi3!OpKT5F z2J#vK)cYS_DdC0CqPMb-qIX;JqypU8+Yq7-VKSF<`|~!^^fy0?z@~8G0qD7H7eL$r zrP``X3{c;=s+$p7yDSd;2lCBu!7_+jU-~Q`0;H#Hy{bgnmOBZW{*&}HDT?tV-0?n4 z;;5WhpzhfAKo^bPo`GE**)hCI25n5xOHeegV)`siFeksQm;yYbb@cWii#11=7uey} zC^FmQF6Q>!OU`cXP9SlqyKFGd#bA%xESt^do=Rc8-QyrxX8T&PHLg#)CAq*$$}`Zf zEIBJ|2dVn zyU?&Z$u z!7>07U%$yKGeWBE&g+Z9+n1K=;sg9a{7?#kHMtJ>P>3c|5Cjri(Sfbo%7FmnOVxMp9J zMKBba$H#~2rkGv%ojI8j2(V&U!g5!JYoQ}E_( z`VqbY9BryE7B}T-+crOBc<}u~vXvy~b!1_riDgoSqS-*yMC!-GQ8vCPD)Q$NK)Dy= z;ul?uZQEaq1)vqbM;d>#(0g3^aYgYYAk`~f%6<{}?t}C7LUOAy`271p<=tO7; zzxE2>X$q6)pGXcXt)pIACX^H*A<4BZ;2Rsm3d7p_(zRy&Lxf zdOIho2P2x;figw}AEE{2o|xDXFgIA-US|6HA0nZ(vw@jdlcSvI>9x>pVvt0#%JkIz z)!0RB&<-TaW4~wVc2#h`AVC~8X8I?4cMetooM3)d-*Ml6N_5U&J^%2ONm95fpm@5f zMHW>`;B)G?ubnfQ2%qyZDr!EsD%UJ=c{Vs&!Pi5VAM$c}sdJUh|NOSstyQoPzb=xS zi!EJu!-7!hr}(mjUgcfx^H1S+doGc-6!`v-b@U9Y@A!5jkH~;ZUdCs-l&A3(m~B8P zMQ1?nJMRGb1Me?5?CE^$YDHZ7{>SAJ^lIFW+jwZmo-Q$f2)GF7-atMrRJb!H2gwKI zcDEg7AeP!HynE{{hx&Q(OC`60ftFf(C+~mm1+*j|G+hV&e$!e$A|gWE>MLw|W`-~P z-HVm36f)uG9wN@}waWI~F9rD8WmiG!1gk|vzRZDQzoHSr>b1exg{(2M;Pfo;WIA|X zBGrarpgo=r5h;iDb@% z2hgh{0b@z*If0}AgRK&buWy2KC%bp?t7-aV+}ap}PbI$;U_fqZ_dBDzUc8c&*7XIL z9?0NV?E-N`aZWupe$0~_C|IGx+_Ln?teB1`?Rv1#x^{OsnnZ;VxGQ~ zfevoSI%;4LCwdoEj4=nVqej|#lO_}|?TWNouKzxJ{q}N3sDORYMBdzH^+JBI3G!am zZ}RX{hs?t}_cukSY425fwqB{cYh_m-m6~#)s3J<#jR6kVa~}LbSsHXRVH;y)N5E&Z z@;5aVjLGsjpM~0%-8ru&b~0a{Af{#Hg`BA@J&b=9#oNTFVOS$E;T(vdUOvd=dd8+<%sj12VZ6ygn?%SQo?k!yg zlr29^-3?4MlJcY8;^M&%Z%`%Gv<-$=cU9k5j{SXhy+bK}*wc69$+r9I>!yAW)z7wo z0XQ;!0BGI8>Q(#O>))y7_Z|5<@RsP5l=9=_8mg`=^tiaBE`88KgpUC(&sUDlZ{>U; zTQA@WumAA7u716G;;X4O9$Ms4OCv{ZzYq{o48`Z|xzd`C#ece0yi4Wik08>nulsEp zm-kf7nYA2>+J6hRZ^be>-$L4T!Wzk4wST(4^_oQNY)ac*?mwZ1B0U`PcYVisNa2`2 zu-bj)2mDAb%L!X*h=I_oyr`WgPnsb2_~-l%R-F<^XXHYFT!5aKeDP|ts*&lQMwuYU zAN_h+E;jCteEM#gHZTr<+v|JOo;xx;^Qb?)8c9oI%v&-_ktIX{lByEixzo+kZbV-H zmNK=~&K3e~-xz>ueJMb)j(wu2d%hk7+iNpTDw7{lvb|8OvmTiSrUH3uz z-fzg8s}@GrFMsXi+twhl{xrqquF{!hZ+^>VVm6;Jfnj2D%RPgcVz%XyQu+MXkrDZd zu#;S{KS@mB9R~bHK&X#fKzt?xE)$}2rY zMV>PE1l_VB=-HqCVFExI29}EXUSD#C9@G998X0uCKy_T>DRFbxv>3q96~=w^m|0xcOyihzZCTTGuFFbh z7AvZg_!_sB6?MBp5Ac(zTNc~n@T3LH|3w;mL-bM}K~sUnq=;cWF*({o~@~UL&xt{g76Mdm))hV-^uQ1@r^2Dew)gIga&YfzflJ^Pznu zv1SGpA(!bTQ*Oi@GJ6)0zB7fqc-Q*9eHE4z`h z*iw|5cF%H&lezY)J{t;5H-O>(!XKcB!SRL13-m0x0n(TI;h-(LEtAF)6}=t#=$3?h z8C9ti+Rj}-6iQ<4K4*$}k<4LPG!b!`%3+kC8;GNP};K1D0 zQbzsgM#cAVI{|PYAuQS%bT zX%X`{_nqeZTq^DfAX-VfunIuPO26)>bBo1_n^zZzWdcHt7HM-b?c=Lt2{J|w-U4h$R|vVRUw54=sSSM4)pH+7F+`#=|s zc8&*Qm2M-K{uNkN7)&NMF0R1R`HU6;bSGz4dntqAuOL0LmzhZKP<-|MsUQ}ZpBw=i zR*rNz1p4hJ0Dx={?+@n&v=90+ijlK3Gws7i-zw+KMvx(EWXrTr|7{oq+guqIBL`b;g1xPoJ`8;ozPgdHU|{6p4?N|mTSHWM{{vX3=R08I?uux|h0qc@{R+X0 zHSu1y?u+rkoyPbfiWd?Oj|mg(^`s3fT~m%6I)fTx=f0>ey336Y zzG=&9kPUx2$#FsrHStuSus$gLy%Y^@#6YuqdlV<%ecb3_#up9Z0)Q04YB}@j;H11A46v z=WnL3SJF%OTkvE-Bd0Dl$MQTRdAbaC@98)9!2tbWXoTLqpX`o_^_R26Ep?h=n@Ol! z4ysZA79Z1RTgUp|c^hNC;F3ltN3My7<#-&k_(BZ%qFTPz>yaJ=8p4uA)-r#sbI&() z1Aa7VBsSdTE>H&Salx7l_u2xlJ6i4;+K9#<`J;Sg{hcy52bz{~@t2f67?G}IxkrX) zcxb5+8yGg`8b3?e>S(Ui%7C^P*Kx||64GjaiUJ-#)vtwa+uv7Tsdbu~4nA<5l>@CQ z;wUfe9v)$>p94%^HDg-#ejpE_CQ-ZTfQrS&`#2CcN8Hn)$Sdv1zho~TeI?(xV7#g> zNUdr7IePa~*i20yxMkqMaK7-{+U#{zEPi<2cZ60ua!DwswxK_xbr+p>dZ8$R9~?~P403(w-(kPI{b4pb6L$5NsjFl zP|t^3r3X!EbyY_~+p8`L0EegdEf~iGdRzMfr3`=OTo?nDt#A9W{qvpSolq2B^X9L{ zO*h`wcx}f#7+V979k(9>PT&5W1NIyW$MO#cr3-9tZ728qKRk~+hkHEP#$)>)e;J?c zGk=S@04T{`t$d2uHt7bCGW;I%pw~Va62dOZ?g4??0lU;52|$L*-msU{o;qv}MTEaa zIe9#h1rDeO=z$3nm~YB#(|pJlBR@dpL1KFLX$!b*KkOkyGFponH#60h?uZ$c3*9}&@qp2!%RqWCwg;yAnt_TB z6{8-_Tn&eUh{BW`zw-bBtN(Zd>?GKz{Bl3&D5xNUlY!L119taDx0(pq7vH+T+5-g< zgj4&8r+_7{f5_#m4R^o7@u25f>qq2&k*IGw{J;Gt9nSglZfRVdP0)>%rmk)OtqAxH Lgl5^bTaW$+T!Mh1 literal 0 HcmV?d00001 diff --git a/images/dark/clear-all.svg b/images/dark/clear-all.svg new file mode 100644 index 0000000..316bbe2 --- /dev/null +++ b/images/dark/clear-all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/light/clear-all.svg b/images/light/clear-all.svg new file mode 100644 index 0000000..3bb24db --- /dev/null +++ b/images/light/clear-all.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/package.json b/package.json index ced50e7..ae2aa9d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "onCommand:vscode-kafka.consumer.consume", "onCommand:vscode-kafka.consumer.list", "onCommand:vscode-kafka.consumer.toggle", + "onCommand:vscode-kafka.consumer.clear", "onCommand:vscode-kafka.explorer.copylabel", "onCommand:vscode-kafka.explorer.deleteselected", "onView:kafkaExplorer", @@ -270,6 +271,15 @@ "light": "images/light/toggle.svg", "dark": "images/dark/toggle.svg" } + }, + { + "command": "vscode-kafka.consumer.clear", + "title": "Clear Consumer View", + "category": "Kafka", + "icon": { + "light": "images/light/clear-all.svg", + "dark": "images/dark/clear-all.svg" + } } ], "menus": { @@ -337,6 +347,11 @@ "command": "vscode-kafka.consumer.toggle", "group": "navigation", "when": "resourceScheme == kafka" + }, + { + "command": "vscode-kafka.consumer.clear", + "group": "navigation", + "when": "resourceScheme == kafka" } ] }, diff --git a/src/commands/consumers.ts b/src/commands/consumers.ts index 9204721..7da8b81 100644 --- a/src/commands/consumers.ts +++ b/src/commands/consumers.ts @@ -5,6 +5,7 @@ import { pickTopic } from "./common"; import { ClusterSettings } from "../settings"; import { CommonMessages } from "../constants"; import { KafkaExplorer } from "../explorer"; +import { ConsumerVirtualTextDocumentProvider } from "../providers"; export interface StartConsumerCommand { clusterId: string; @@ -17,7 +18,7 @@ export class StartConsumerCommandHandler { private clusterSettings: ClusterSettings, private consumerCollection: ConsumerCollection, private explorer: KafkaExplorer - ) { + ) { } async execute(startConsumerCommand?: StartConsumerCommand): Promise { @@ -55,6 +56,9 @@ export class StartConsumerCommandHandler { } export class ToggleConsumerCommandHandler { + + public static COMMAND_ID = 'vscode-kafka.consumer.toggle'; + constructor(private consumerCollection: ConsumerCollection) { } @@ -75,6 +79,25 @@ export class ToggleConsumerCommandHandler { } } } +export class ClearConsumerViewCommandHandler { + + public static COMMAND_ID = 'vscode-kafka.consumer.clear'; + + constructor(private provider: ConsumerVirtualTextDocumentProvider) { + + } + async execute(): Promise { + if (!vscode.window.activeTextEditor) { + return; + } + + const { document } = vscode.window.activeTextEditor; + if (document.uri.scheme !== "kafka") { + return; + } + this.provider.clear(document); + } +} enum ConsumerOption { Open, @@ -144,7 +167,7 @@ async function openDocument(uri: vscode.Uri): Promise { // If there's no document we open it if (!document) { - document = await vscode.workspace.openTextDocument(uri); + document = await vscode.workspace.openTextDocument(uri); } // Check if there's an active editor, to later decide in which column the consumer @@ -163,12 +186,12 @@ async function openDocument(uri: vscode.Uri): Promise { // Instead, a new TextEditor instance is added to the active panel. This is the // default vscode behavior await vscode.window.showTextDocument( - document, - { - preview: false, - preserveFocus: true, - viewColumn: hasActiveEditor?vscode.ViewColumn.Beside:vscode.ViewColumn.Active, - } - ); + document, + { + preview: false, + preserveFocus: true, + viewColumn: hasActiveEditor ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active, + } + ); await vscode.languages.setTextDocumentLanguage(document, "kafka-consumer"); } diff --git a/src/extension.ts b/src/extension.ts index e77511e..f18026b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -15,6 +15,7 @@ import { DeleteClusterCommandHandler, SelectClusterCommandHandler, handleErrors, + ClearConsumerViewCommandHandler, } from "./commands"; import { Context } from "./context"; import { BrokerItem, KafkaExplorer, TopicItem } from "./explorer"; @@ -50,6 +51,7 @@ export function activate(context: vscode.ExtensionContext): void { context.subscriptions.push(explorer); context.subscriptions.push(new ConsumerStatusBarItem(consumerCollection)); context.subscriptions.push(new SelectedClusterStatusBarItem(clusterSettings)); + const consumerVirtualTextDocumentProvider = new ConsumerVirtualTextDocumentProvider(consumerCollection) // Commands const createTopicCommandHandler = new CreateTopicCommandHandler(clientAccessor, clusterSettings, explorer); @@ -58,6 +60,7 @@ export function activate(context: vscode.ExtensionContext): void { const startConsumerCommandHandler = new StartConsumerCommandHandler(clientAccessor, clusterSettings, consumerCollection, explorer); const listConsumersCommandHandler = new ListConsumersCommandHandler(consumerCollection); const toggleConsumerCommandHandler = new ToggleConsumerCommandHandler(consumerCollection); + const clearConsumerViewCommandHandler = new ClearConsumerViewCommandHandler(consumerVirtualTextDocumentProvider); const addClusterCommandHandler = new AddClusterCommandHandler(clusterSettings, explorer); const deleteClusterCommandHandler = new DeleteClusterCommandHandler(clusterSettings, clientAccessor, explorer); const selectClusterCommandHandler = new SelectClusterCommandHandler(clusterSettings); @@ -108,8 +111,12 @@ export function activate(context: vscode.ExtensionContext): void { "vscode-kafka.consumer.list", handleErrors(() => listConsumersCommandHandler.execute()))); context.subscriptions.push(vscode.commands.registerCommand( - "vscode-kafka.consumer.toggle", + ToggleConsumerCommandHandler.COMMAND_ID, handleErrors(() => toggleConsumerCommandHandler.execute()))); + context.subscriptions.push(vscode.commands.registerCommand( + ClearConsumerViewCommandHandler.COMMAND_ID, + handleErrors(() => clearConsumerViewCommandHandler.execute()))); + registerVSCodeKafkaDocumentationCommands(context); // .kafka file related @@ -123,8 +130,7 @@ export function activate(context: vscode.ExtensionContext): void { vscode.languages.registerCodeLensProvider(documentSelector, new ProducerCodeLensProvider())); context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider( - ConsumerVirtualTextDocumentProvider.SCHEME, - new ConsumerVirtualTextDocumentProvider(consumerCollection))); + ConsumerVirtualTextDocumentProvider.SCHEME, consumerVirtualTextDocumentProvider)); } export function deactivate(): void { diff --git a/src/providers/consumerVirtualTextDocumentProvider.ts b/src/providers/consumerVirtualTextDocumentProvider.ts index 9f8935b..f041fa4 100644 --- a/src/providers/consumerVirtualTextDocumentProvider.ts +++ b/src/providers/consumerVirtualTextDocumentProvider.ts @@ -4,6 +4,7 @@ import { ConsumedRecord, ConsumerChangedStatusEvent, ConsumerCollection, Consume import { CommonMessages } from "../constants"; export class ConsumerVirtualTextDocumentProvider implements vscode.TextDocumentContentProvider, vscode.Disposable { + public static SCHEME = "kafka"; private buffer: { [id: string]: string } = {}; private disposables: vscode.Disposable[] = []; @@ -32,10 +33,9 @@ export class ConsumerVirtualTextDocumentProvider implements vscode.TextDocumentC } public provideTextDocumentContent(uri: vscode.Uri): string { - if (!this.buffer.hasOwnProperty(uri.toString())) { + if (!this.isActive(uri)) { return ""; } - return this.buffer[uri.toString()]; } @@ -60,27 +60,20 @@ export class ConsumerVirtualTextDocumentProvider implements vscode.TextDocumentC } private onDidChangeStatus(uri: vscode.Uri, status: string): void { - let uriBuffer = this.buffer[uri.toString()]; + if (!this.isActive(uri)) { + return; + } const line = `Consumer: ${status}\n\n`; - uriBuffer = uriBuffer + line; - - this.buffer[uri.toString()] = uriBuffer; - this.onDidChangeEmitter.fire(uri); + this.updateBuffer(uri, line); } private onDidReceiveRecord(uri: vscode.Uri, message: ConsumedRecord): void { - let uriBuffer = this.buffer[uri.toString()]; - - if (!uriBuffer) { + if (!this.isActive(uri)) { return; } - let line = `Key: ${message.key}\nPartition: ${message.partition}\nOffset: ${message.offset}\n`; line = line + `Value:\n${message.value}\n\n`; - uriBuffer = uriBuffer + line; - - this.buffer[uri.toString()] = uriBuffer; - this.onDidChangeEmitter.fire(uri); + this.updateBuffer(uri, line); } private onDidCloseConsumer(uri: vscode.Uri): void { @@ -93,25 +86,46 @@ export class ConsumerVirtualTextDocumentProvider implements vscode.TextDocumentC private onDidCloseTextDocument(document: vscode.TextDocument): void { // When language is plaintext we assume the event was triggered as a result of switching language mode - if (document.uri.scheme !== "kafka" || document.languageId === "plaintext") { + const uri = document.uri; + if (uri.scheme !== "kafka" || document.languageId === "plaintext") { return; } - const buffer = this.buffer[document.uri.toString()]; - - if (!buffer) { + if (!this.isActive(uri)) { return; } - if (this.consumerCollection.has(document.uri)) { - this.consumerCollection.close(document.uri); + if (this.consumerCollection.has(uri)) { + this.consumerCollection.close(uri); } - delete this.buffer[document.uri.toString()]; + delete this.buffer[uri.toString()]; + } + + public clear(document: vscode.TextDocument): void { + const uri = document.uri; + if (!this.isActive(uri)) { + return; + } + this.updateBuffer(uri, '', true); } public dispose(): void { this.consumerCollection.dispose(); - this.disposables.forEach(d=>d.dispose()); + this.disposables.forEach(d => d.dispose()); + } + + private isActive(uri: vscode.Uri): boolean { + return this.buffer.hasOwnProperty(uri.toString()); + } + + private updateBuffer(uri: vscode.Uri, content: string, replace = false) { + if (replace) { + this.buffer[uri.toString()] = content; + } else { + const uriBuffer = this.buffer[uri.toString()]; + this.buffer[uri.toString()] = uriBuffer + content; + } + this.onDidChangeEmitter.fire(uri); } }