From 7acccc6bbacd05ac9569c211e2eb3c7f891d75e5 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Mon, 1 Jul 2019 19:55:45 -0700 Subject: [PATCH 01/22] chore: Fix listener addition/removal Just in case clients get preserved across calls. --- src/ConnectionPanel.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/ConnectionPanel.ts b/src/ConnectionPanel.ts index 6050506..9ccfd45 100644 --- a/src/ConnectionPanel.ts +++ b/src/ConnectionPanel.ts @@ -86,13 +86,30 @@ export default class ConnectionPanel extends Vue { this.client.addListener("deviceadded", this.OnDeviceListChanged); this.client.addListener("deviceremoved", this.OnDeviceListChanged); this.client.addListener("scanningfinished", this.OnScanningFinished); - await this.client.Connect(aConnector); + this.client.addListener("disconnect", this.RemoveListeners); + try { + await this.client.Connect(aConnector); + } catch (e) { + this.RemoveListeners(); + throw e; + } // If we don't connect successfully, the above line will throw. Assume that // we're connected if we get this far. this.clientDevices = this.client.Devices; await this.StartScanning(); } + private RemoveListeners() { + console.log("Removing listeners"); + this.client.removeListener("deviceremoveed", this.OnDeviceListChanged); + this.client.removeListener("deviceremoved", this.OnDeviceListChanged); + this.client.removeListener("scanningfinished", this.OnScanningFinished); + this.client.removeListener("disconnect", this.RemoveListeners); + console.log("Cleaning arrays"); + this.clientDevices = []; + this.selectedDevices = []; + } + private get Connected() { return this.client.Connected; } @@ -100,13 +117,11 @@ export default class ConnectionPanel extends Vue { private async StartScanning() { await this.client.StartScanning(); setTimeout(async () => await this.StopScanning(), this.scanTime); - console.log("Starting scanning"); this.isScanning = true; } private async StopScanning() { await this.client.StopScanning(); - console.log("Stopping scanning"); this.isScanning = false; } @@ -124,6 +139,7 @@ export default class ConnectionPanel extends Vue { private async Disconnect() { await this.client.Disconnect(); + this.RemoveListeners(); } private RemoveAddress(index: number) { From 92e366a150ba32ebcb31351642e368f39f3a7688 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Tue, 2 Jul 2019 22:00:48 -0700 Subject: [PATCH 02/22] chore: Move ConnectionPanel to ButtplugPanel We only have one panel now, so just call it what we expect --- src/App.ts | 4 +-- src/App.vue | 4 +-- src/{ConnectionPanel.ts => ButtplugPanel.ts} | 28 +++++++++++-------- ...{ConnectionPanel.vue => ButtplugPanel.vue} | 5 ++-- 4 files changed, 23 insertions(+), 18 deletions(-) rename src/{ConnectionPanel.ts => ButtplugPanel.ts} (85%) rename src/{ConnectionPanel.vue => ButtplugPanel.vue} (97%) diff --git a/src/App.ts b/src/App.ts index ab8afae..f50e8d0 100644 --- a/src/App.ts +++ b/src/App.ts @@ -1,11 +1,11 @@ import Vue from "vue"; import { Component } from "vue-property-decorator"; -import ConnectionPanel from "./ConnectionPanel"; +import ButtplugPanel from "./ButtplugPanel"; import { ButtplugClient } from "buttplug"; @Component({ components: { - ConnectionPanel, + ButtplugPanel, }, }) export default class App extends Vue { diff --git a/src/App.vue b/src/App.vue index 3de806c..f4aca9d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -32,9 +32,9 @@ - - + diff --git a/src/ConnectionPanel.ts b/src/ButtplugPanel.ts similarity index 85% rename from src/ConnectionPanel.ts rename to src/ButtplugPanel.ts index 9ccfd45..8c76e52 100644 --- a/src/ConnectionPanel.ts +++ b/src/ButtplugPanel.ts @@ -1,8 +1,8 @@ import Vue from "vue"; import { Component, Prop } from "vue-property-decorator"; import { ButtplugClient, IButtplugClientConnector, ButtplugBrowserWebsocketClientConnector, - ButtplugEmbeddedClientConnector, - ButtplugClientDevice} from "buttplug"; + ButtplugEmbeddedClientConnector, + ButtplugClientDevice} from "buttplug"; class ConnectionAddress { private static sIdNumber: number = 0; @@ -27,14 +27,14 @@ class ConnectionAddress { } @Component({}) -export default class ConnectionPanel extends Vue { +export default class ButtplugPanel extends Vue { @Prop() private client: ButtplugClient; private isScanning: boolean = false; // 30 second scanning limit private scanTime: number = 30000; private scanOnConnect: boolean = true; - private selectedDevices: ButtplugClientDevice[] = []; + private selectedDevices: number[] = []; // Blank array when disconnected. Mirrors ButtplugClient device array // otherwise. Takes some extra logic to get vue to keep up with it. private clientDevices: ButtplugClientDevice[] = []; @@ -66,11 +66,11 @@ export default class ConnectionPanel extends Vue { private get HasWebBluetooth(): boolean { console.log(typeof(window) !== "undefined" && - typeof(window.navigator) !== "undefined" && + typeof(window.navigator) !== "undefined" && (navigator as any).bluetooth !== undefined); return typeof(window) !== "undefined" && - typeof(window.navigator) !== "undefined" && - (navigator as any).bluetooth !== undefined; + typeof(window.navigator) !== "undefined" && + (navigator as any).bluetooth !== undefined; } private OnDeviceListChanged(aDevice: ButtplugClientDevice) { @@ -100,12 +100,10 @@ export default class ConnectionPanel extends Vue { } private RemoveListeners() { - console.log("Removing listeners"); this.client.removeListener("deviceremoveed", this.OnDeviceListChanged); this.client.removeListener("deviceremoved", this.OnDeviceListChanged); this.client.removeListener("scanningfinished", this.OnScanningFinished); this.client.removeListener("disconnect", this.RemoveListeners); - console.log("Cleaning arrays"); this.clientDevices = []; this.selectedDevices = []; } @@ -151,7 +149,13 @@ export default class ConnectionPanel extends Vue { } private ResetAddresses() { - this.desktopAddresses = [new ConnectionAddress("localhost", 12345, true, true), - new ConnectionAddress("localhost", 12346, true, true)]; - } + this.desktopAddresses = [new ConnectionAddress("localhost", 12345, true, true), + new ConnectionAddress("localhost", 12346, true, true)]; + } + + private FireChange() { + const devices = this.clientDevices.filter((x: ButtplugClientDevice) => + this.selectedDevices.indexOf(x.Index) !== -1); + this.$emit("selecteddeviceschange", devices); + } } diff --git a/src/ConnectionPanel.vue b/src/ButtplugPanel.vue similarity index 97% rename from src/ConnectionPanel.vue rename to src/ButtplugPanel.vue index 82641b0..94ede36 100644 --- a/src/ConnectionPanel.vue +++ b/src/ButtplugPanel.vue @@ -100,15 +100,16 @@
No Devices Available
- From 13f1155f7eaa596d3c58a1ce27de244021912b9a Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Thu, 4 Jul 2019 16:22:28 -0700 Subject: [PATCH 07/22] chore: Use null instead of undefined for uiMessage checking --- src/ButtplugPanel.ts | 4 ++-- src/ButtplugPanel.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ButtplugPanel.ts b/src/ButtplugPanel.ts index d7767fc..e8f5b62 100644 --- a/src/ButtplugPanel.ts +++ b/src/ButtplugPanel.ts @@ -46,7 +46,7 @@ export default class ButtplugPanel extends Vue { private clientDevices: ButtplugClientDevice[] = []; private desktopAddresses = [new ConnectionAddress("localhost", 12345, true, true), new ConnectionAddress("localhost", 12346, true, true)]; - private uiMessage: [UiMessageType, string] | undefined = [UiMessageType.Error, "Something went wrong"]; + private uiMessage: [UiMessageType, string] | null = null; public async ConnectToIntifaceDesktop() { const connectPromises: Array> = []; @@ -174,6 +174,6 @@ export default class ButtplugPanel extends Vue { } private CloseUiMessage() { - this.uiMessage = undefined; + this.uiMessage = null; } } diff --git a/src/ButtplugPanel.vue b/src/ButtplugPanel.vue index 71ea66a..559b662 100644 --- a/src/ButtplugPanel.vue +++ b/src/ButtplugPanel.vue @@ -24,7 +24,7 @@ - Error: + Error: {{ uiMessage[1] }} From 8d18052b37894f04e14041ed344fbe7d92d78854 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Thu, 4 Jul 2019 16:22:41 -0700 Subject: [PATCH 08/22] doc: Update readme We don't actually do anything with exceptions now. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 78c9ee7..ca5a1aa 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ features like: - Connecting to Websocket and Local (In-Browser) servers - Device listing and management - Log display -- Buttplug crash/exception handling ## Table Of Contents From 5e0822304100a6d7641bc0cfdabb1469af84fe55 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Thu, 4 Jul 2019 21:59:25 -0700 Subject: [PATCH 09/22] doc: Add manual that can be included in other apps. --- manual/intiface1.png | Bin 0 -> 52508 bytes manual/manual.md | 144 +++++++++++++++++++++++++++++++++++++++++++ manual/manual1.png | Bin 0 -> 20941 bytes manual/manual2.png | Bin 0 -> 53969 bytes manual/manual3.png | Bin 0 -> 14885 bytes 5 files changed, 144 insertions(+) create mode 100755 manual/intiface1.png create mode 100644 manual/manual.md create mode 100644 manual/manual1.png create mode 100644 manual/manual2.png create mode 100644 manual/manual3.png diff --git a/manual/intiface1.png b/manual/intiface1.png new file mode 100755 index 0000000000000000000000000000000000000000..bccc2860d57510e1284a3cd55fbc46b8c8534630 GIT binary patch literal 52508 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 fbp|t~OMxjEJ6+8_; Other Settings -> + Run Certificate Setup_. + +#### Why does the browser button show _Requires WebBluetooth_? + +If your browser does not support WebBluetooth, you will see a +_Requires Bluetooth_ button where _Connect In Browser_ would normally +be. This is because your browser cannot connect to Bluetooth hardware, +and therefore won't be able to provide hardware access to the +application. + +Currently, browsers supporting WebBluetooth are: + +- [Google Chrome](https://chrome.google.com) +- [WebBLE](https://apps.apple.com/us/app/webble/id1193531073) + +#### I've connected, why can't I see my hardware listed? + +- Did you scan for hardware? +- Is your hardware on and close to your computer or phone? +- Assuming you are using Bluetooth hardware, is your bluetooth on? +- If your hardware is not being listed, and you are using Intiface + Desktop, did Intiface Desktop show any errors in its log panel? + +#### None of this answers my question, how can I ask for help? + +Here's a few places you can ask questions and get help in real time: + +- [Metafetish Forums](https://metafetish.club) +- [Metafetish Discord Chat Server](https://discord.buttplug.io) diff --git a/manual/manual1.png b/manual/manual1.png new file mode 100644 index 0000000000000000000000000000000000000000..868cc59c0d20155e344d59e650e9d134a7ed1845 GIT binary patch literal 20941 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

*xsmnX=XZ?RE43d< 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 literal 0 HcmV?d00001 diff --git a/manual/manual2.png b/manual/manual2.png new file mode 100644 index 0000000000000000000000000000000000000000..2385d5b71b7352fba1cfbcc2c978c9f30029a270 GIT binary patch literal 53969 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 literal 0 HcmV?d00001 diff --git a/manual/manual3.png b/manual/manual3.png new file mode 100644 index 0000000000000000000000000000000000000000..b87bef83bce19fc55ea8a40260d71a933fbe645e GIT binary patch literal 14885 zcmeIZcTkj3^d;CBP$UZy1VL0#BnnCn3IZyUL_ku5qC^!H$w_j~IY|!In3?fZ)Ue1 z1Om?zzV2Mchbwccx&iR*g7Fi%CkRAQ1mW@9i}3!Y{3Z5Vk zf~?P{ql21!p93&zma_=8)AQ^`1Hx;5Q|{*oIJwaoH7;7 zqrq=pp8r%E@>CnjhE4~DZb&`l_R;-%!*Fs>uAJ=VyOl^omXh&FMkciYcE6AQgo)_c zPl4U>HF53>V|#Iedw-IYDW#rVX7XcM6s|!?TxQacm(aY-^ziBbj@Rwvyn9!iYHn1F zj<2|p1p4-8C@8C|4-ZROeQBR4ws9$jsmXebCx4PRc#=-QIjc9%Gs|^w`(_k66UIxNOO4iB#0igi=RH3toMxOF%0fGMY!#)jZamsu8uoT8g4Ii z9Ur5`jeC=xi1pO%&xFj)&*LSbFa#tdEP{g3tjg(RE{-#77-C52@#uG*l5?s!>LzP5Um9W(q9 zWBL{q)n01aU#O9Hj4kkHh8asqx%G`pN4@}AH=zF`Ep2l^Ss`om;)M$iiy?~2%FW?7 zgoA>DbjPb5i6!W6GBLf&QqGv!bh&r$o^D@?6eSfEkA52wLOxEQiLIbk!oq?*Li|)f zNlA&4n!3bhS_0`he=WgtSAAx7cF^AH#fkm-OC)#h-@oE>L)fX%sOvfeR`{?5eq&Eh zf#h;}Rxz?tONsIji)ruTpUmYf(a2l2rxr%{_9}X9MJ7%;2o2Xba}iRpH)60nrhk8s z2r4jXWJ@IzlU=_a++lF*&YcU99X~ixOAcdBqn5bYG(O(nbifSdHI;XCblkan_k5w# zsz$lR@K274v6&Ki1A{w03XA71;N#o%%ke+bNDmIa@{L2Yjq!Bj(&?V}S=2>Bs*NdM z((Imw2ix$Hx`A2KY@&1&kPOI zt_xsuRoP5UO%X&i+&;X<-GyE!ZrFpdF|Fg{Qn;3hfm6oi|tX)Fa9Sz{>Z5SBg|fC3Z-2G}p(_(6IJst!8=F&+meC1Oss+ zI?=m3Qz;dK?qxKOf0aGD*m)iK_wV0(?Cd|v%fE?v9%}8-#PV6{4P+`U&%zegdR4Gv z7boT!Gus})Yx?&N%ovS`3%5Bc-*V&m+{SeC@ieJ7#K0?6RcQ~8S|NHBBr?2xHd!`` zGmIe>USXwvcXrZweC~VSa6Hc?)~qL2cVID6`T@c(Gon5GMkg`&RG2Cyuk^WzdmS=eKK?hgjz?4C>CRoN+RZjTOxo+$uesfKEwHvuPJF2{ z5evP^k}DH+v2k(qPU{nLu%4nnQ4*|nTKx?PQXgyk;>C+tRXh8k zeC?273l?tfk1*NQj+nLpVmblanF|C21j}w%NrB)L#aFL>E)V7$?DQ)f4EK1YCzvb8 z(De+yf7=`|y}n)`mY<(*1Urv-2s2W~CK*7a#OS;}QPCw7%XSNA>M0+y~H8U@7zQ_Btq{klilsVbRZRt=&MwzEi zH#+Vn+Ca*6+gW_qVUSW-SlBlkCuol!+40oGNsp1Vxx$M z*GABjLA8|RVNZDJdyJE7Cb+QQ2~6UhHC@Z{pc8`cHyrY@PdFxn}aX6+aXp z&gzIM$E-4Hg75cd(jSmKJ&ywkm7!C~|fEK}Q0f5L;UPOd>( zCJrT4)rIZJg=kq^F&A8-b5#bg2)r7 zd0Cm6x=`nicQV9PjGMlE`BG>x%;PBj?%g{BW8(_<`2y{lZ<(2y_{zrtq>SCL7XQl3 zsh5_P5U*8KY^NIWD5a81OTYLNQeUN~f2pT;3lYg8HFMd^htHTw zQ(ATMX@wl_SyjZsl8Ar#_HAn^BayELu}m z4uyes_uZAvX#I&AXKVPCfAg>DsH=CZjn~lfTWR^Cp|(mw-i82FmOR?uoUJ`v&Oy9k zr~3T)^LIYW7@?ujI(KKU6O7LGuyNvM8=Z9~_S5(8zxox#<)9J{p4^3e>v`w^m9bOj zbc;G^&1kFAcJ{k~tzJ!nv-?PiaYPSw8l>AEF7E?b>?Z%DM>Bk-iZO_JxMUE85ZDSj z1P`shD*M=Fl$w%qE@v=1d=;4oNNR9!@WRE52V;%q*~nTXS5s5d)~Yzu!>JeoOD4a{ z>(5Xx{x>1Lmi-L>cx}I&<{*R02UR7q@M$B@75)QPp3Yxq^6MpAG9_g43wUPo|HfAu zVN7Fiio{RF4LYcUQ>FSW)>eTN`Y5R~P#qmz1Bz5Fj_pUHR1jbm7+MwqEV%su`~wU+WgL?(5d#j1nU86#UT@v^$`>T6){@w}@q)Cp~#o_v~ir(kbqG z?+{#fa4|7ox*?~PQ0|tO1{Z&n?J_5Gj7VwLcf*{x_vwv(E-3n6EumI_avm=Yw_iXC z>17im<{JT1xHp2>P$vSv>(MU*Y?zt^t9Y-B?MVCX{ zs<#f0`0Kh`M~dau)U4|GxDF15dM{mcbW#%1&NxZfo!?TBV?J)WG}s>8{~;&ICnk(8 zYqI{+MqjV{nnd#M(R$Xeu2${WKfZA+f4Ix-h>;%t6aCM5 zbxSa!GD;`?7Jt+-7K0b$dg{7^hez44iQi3ecK}P2oa_+&!1uHBMDp&`6L_+g`h7iL zw=85uc<|U*NP=&Z8S_Q}-Ss@p*6E}v@6(JDof*E2iZ_?*W=W2ZusMWWQccl`3d5He z$xb(##Y-az1$I}GcbZA@E;9&!OZs%Xh~v%ULFdVXTxt(Y-i0t4rM*T>tFrnB{WGuo z4To0>#@9xvVg;o|cj;l@eCi{(f2@g(s$+rIV5Bqj>T&~PDV=UgRsUkIeHxWVRHR-ueO5 zsh6#qx20auY3&{2iI%s}@s#>C*CDo=Gq+liCF-&NIsYO;*+ZmBzg!|v7AuHfOxnky2)w88LLWS! zJi!*+v*Q2OR}bkC$s(j16)xpJ+#T1eRW zZAz2%hcZ9MpBMgQWqs+1_QmX&61{!9k6rf9D84%S{-T)zpTTd++OJ>X$w_=rMmeMJ zkP45DSQ3hP*wxjce~BllMZOT;t-X*Xh*l8X@&eURF~~q-39Y!L*R; zU*q_1T7(N?okta)?_fsV^b9%Fm8vRzIOG(F|adPWt~AdLA&VDL*~i^QL%c_d}tewcb(tPtd$tsu1rqqy2^GpIp$BtMt+9yFLJgvZirj`&BaNA-kfzzY(b!w z`j-V!41y{7)FMvo46%7nJoopOe8mL57e|QQS~)#>(AqjJ*;6Oar9;u1X?X>ismFZn^G%vx? zX2gSx^la-HEN(f@pSxT&OA>s#TVdoa*H>iC=q2h#=61CDrFL6>mW}nwguVFId|vL3 zYqk{XJyK!uhVv9BN7^Fe*<(SjvH13IZE3b%F-sDgN2!OS)=F{m?B_4>RfQk@q3y*G zRByIPx3fTZFJoH+=_J2zm6)8ICN;IldNdusyn1~`FHR<6CNXBYWK3D<$>7%f1ta5G zRGoVXdP>OkbBtVUVK}WXlSr)!)~3k5lB%jZuBpJ?`S>b@W?3CG8=*0hVOP6mGSvugKe_?5v6OI`I;zLbZH;{ zLPvI|Wop!2M;Gb)L5@*U5c|L^dJ@Q&*8lc0shT*)BW)W|JX+d+71o!el8rE`$I7p+ zPxSIe+c1cZq;$XUHu(V;p~@tDWL56fWRG${a#T^lgCWF;auBB-9TyA?$v=MeH*EA# z9b6im$|kfF;3q+iRpz2(p~QTtJ#o@*u3F_w@xta*4`1`K`=s+lS%Y^Wr$5<6#LSwd zu%5sFpEcv6gNwNtY%N1=Yop#I7V&(c2*!-Vn)Lzko+{gekoe}ZU-~6VI~5H|V(xs0 zK8T-;Zb2K+LG^`R>6~iPeK^C((Mri!Fd?(KK8kXd@_kpxcoNj>zRtY35DS%0#ac_} zep>mr8UD#1JHDifaq>Uc>Y{$NGaS7g3Q2i5;nh8x`1$>WS*zy)QTqOV^#hZ-1fLy; zMC|hV*MC$T5?Oi7JG-MjH&Q;GB<2(ZyKeWYv%hJNI7=4cuw_O4bUl~fknr(&OwacH-vU0Elm?zm!YuXl?)LPVlhj$f(Bh6yt0@ztx# zVk3N4d$IgFp-M_&Ybcs)Di!j#!xUG$LK(t5(cSpXZ0MZf>T9w_EKHGim3Ml)`KrU& zxFVLz%;`Av?a?-QuS6Kk$}N(OI;nC~rQhD*CpjA!2nk1{NLinX92fT3$*NNAj@Nj< znQ~IzsF_TzcoXEcKzr=Avk^^fyL3_2W@XqHst)_olHa&H7amGmZ4X}?8D1nCMfFv9 zC%@)8ySR65Ez;ANX(z$Gkm&k=#gPLwwQ`vS?NA&&1RruMqk19#qJk+aBKe*_kY8~;}M{e#94Uaw%bxMkn2 z9It*G{DBFg@PV|amJV>6ZP^`Eqq%)6$YuZS zAJ0SG&<{;KHaE#h#X~F7(}yEkmV0IFcn%vIjd}{|`Sq)&W-UbZqd507(z3j<+di6h zB&e8=S;|F3^qB!Rzgj*x+G8RZES+k6a@irD#B{}Oe)*c^J%~a1%F8^KmQEcVv>1NR z%N5aU+TR=fGD-`H`Bwz+N-sF1nUY!te!=2P7DuWVgTKGJn45oanIk_}T+9ts232zR z9ZDx+!Yq&OTpuP2*)WkY_9&J=bzo?y>&!~R(|B6XS^(Qj-}e1`wYoYw%X+k{Y!l|N zb+xVBgxrgO;OXg#@&4YbCO;vI7=xsV30*1v>fhsyXMnjJ`$JZowC*arI-Cv^=sv2v ze$YZ;rXPGV%gFlu!TIJd@!gHLM_CnzlDoPO25E`j{OvD-8ZqN=D1v6?P%+kj=vJbn zl=-WR8Sr#rI78TKP620DZNNve+}kpT9$7yCQjeU!G_VzQ+;ArIYaq*S!WB)5RzZgA zPu5otbGC#(( zd)3Qq62X_s8x0-GVAo`W?&-$YXT}dxDm0pAv)or>DzzMqcn=#NQ)Vc~GkQMCYG|X( zps;py?6h`6KGiJk4^KZxaLRG5bNSuLRUI?4x$lL^DbgMscq}JpoY-dwnOwrQ>Y)mC z@aTBT*8Q?F7Y#v1EyDaA^W58}UN51y&S$Ho^>4Tceo{kBh)9+n3}vd|++ zg;?g;yNz@m=lqp8qAaOeZMez~ookVkX~vBtNlDF&{+&p8o$Z)-&3C3yUlh96ujDye(w>k!88*XL_7Mq1Xv_N}q{%$C?Q{j&7a#;H7 z4|Gzwg@O&7M1`e$$*caKJ~Gj-7_{dWd-F(@24L@D9wWuxy}ZcO}!yt)d;z2d#9>! zv^DU=UdOYHyt<7(MtiCEt{fa300CHPdf-Pk;?NpUo^tPA@XsI5BZGp2Q_|A|Jdbua zK{>LY`$Z0nVScBW^wXyoa9YZP2M<=ANWz}Kd^y)A!#CIWMRZpyCeABapag6~~MJUl#$6LrFu zNEzlpb_4bvKXo%uS-aSPps%kFDA1_!8t0sLJR9J|{}sLi%}}44=GluEw?sv6AY!}P zK$~IZcOS$#mE7i<_C7 zcl7jJN~*1mLm}P6fX*hPplF6!a|J09Rx`?jT(YpgP$K#m8%(NCe3{weFR28F15pB$o8!#|0mlEBlpy4-(v#S@rbw z-&H591Ycuw*#YDm9ISV=y9$CDUZH+F$+>gqp2^BKPuuLTxOc@o!ttjVowJzC%zKGw z)!aAlkOer&5NK?x%4vM0%k)KvB?Wo;Zo~Ngj>x;u<>if5{uLo!e&@#XfekGmFC=AX z$gG?pzq*o5Eun??ka|RsUsX$d%=UQSmI(j+Xt||wVnJSBT5T=8&!0apakB-Sw*_Ab zj0Nn$HBAVH)((M2(~8}JkvbbMyK-(xbjGF%enDF(vATOih9pgb1;xM9%) zkp)$xPb7j!lBx`BgyJc$T_dNZB^bC^+NAq9qd&|0`Sa(%Q=fLuou(x#d@RXqul< z=W$>+X2tJ|Pke6K$j3#5!K(hih@DE-7whZmyVRdSTH~||LZ9Eie{Vot8Ck5Cl#mc` z09K)(;)w$Pty|}6#=C(P9-XfRLKqjg;^K+G-$r)D^7EPvWOnCSFtuDm2d|r=(P;aP zsV98a6Mv4@8+v|!Wuq1I5cu%n1L6mC^xQPxd5uY0TU%eNsYQZlnk*SO;AvoFWCtn- z3B5qC0T-PvXwdMlIGHmzB!m?dQQ*1}TF&E+aU!mt(`2LcN`?!EEmkHQ5`X^u$+CyW zx(!!YC-&&b$;tU*L3Miul)F`hrnV7ZEFSEhlgwu5^a3C8&f{~tZW-XD&cA80@2Vfyot+-VjwQCw zPWzIIZK#8U9|0xEW%Yl3WO_Wl(GB;xY~iKwZoe}LyPD=Y8d=fyKK zGlM(>>T7o0iW^8@N=olq^-MS7;Nk65a8*HTHGlsBu;*mrAA6}JE)#$H|G?{m@;yAW zIBsX&xO*3+s&-b1-DtibX7PRUdCi^y?6|o)(LZ5xVe5qk^*;mymxU;aOo&jWkssO2 zm4UTn?fJ^$UHkfjZFC6~0lrZk$P-YgaEjb8_6i|k^doaB$b8GiAV1b3t!wDl&C1PD zoFG0=;#A${(xZ)M=KgOQm+)#z97ji2oseD!^U{emnEV=u*0-QEg3^LdMAOS+=p+;m zNy!(A;=>xGipn*pr8n>1z2p;lS78e@!brxGMHz^-!mfx*Q%*H~80;ceu0a8X8U_t$ zG*^B^^T`uDsAh(s=f!JNG6}U@qa9(QsysWaZaj4n70}8XRe(SO)iKq$Cqb-JUteGN zh|;sArG*<5Vc6Rvt2FENN1PR7c7(8LyYkhvwZleN*H-S6OFWzoCR{yiBq7cuG#@vd z@O=5~S>=xjwgIeP=kMQ_2?&@31S*@h!4d=d8~~_KpFVx>TENFZK^`tKR-*KWyi9~I z8QIQDLqxg_BQ)To&cW`(J zur`dLA~!cQJNrHu2a=PM!|FM~vvJ|V1u`nCq2+CgnHNq{{<{b7wBO({7Myoyb05x| z-gNoZ)rB*~K!H@&)Ra9tJ*k=v7aq8Iu$)t{53(FoTF9Z4Qg30J#Uv>&UcBgWdVqed zstP8K%S1$T3GQpA#dozeG=76l+HxCOepuso)wb&qVuwMWKVOAv^5n^rF*i(}$MI(S z@#$W}o+~dr^`!TiD5J*)9-I2z(-xft@DEu^6HQ)qPi)_kXWy@#MsJV{ii6c|}>1|2tb zYk3K+4?+)1o6jeYk%Wy~V^$jR_dy~Sw3$LEh+-)LSV0xrT!^*a0+7LNJM$FhV#!v? zaoK3P1m&y=gZ&&8g-TMZ0EmH0y;rYZ&CJT02F=o7qSh6c`8e(eg7YFZLJXW2+~DDO z@9QgQH+LD#9u^KK3*jgbFue{sb+%wFaFXLy3JSWNzg$wV+Q1ahfg=S(?{dr0HmJF@ zA})o80rspo8%TuL&h5{Uk+xM@5OjgCmw9cb9=~LvfPe)XQ`F+3NrLMFEz}g8=1&zO zH7)~%Btt%4uPu}oXJvsBg+oz8x$4bebNS04Clw^$|5hh|=_(N^N#H2&)KB-ftF-@c zj*GRiDlzXc+nRA4*o(EQ{_y=f4FYudUw{4>bbjM_tgSGXv9;sow!1PsmFfnz2QVri zASAiL$>b=I%p6WHC;lQ<&0Vw zrUm62I{sp?vm}PpWoBNk83!neGe1Cu-v(y`pj$>T4m_8Wvn(vAtQ1IW$1?V5bE<`i zle64Bn&Gc0JJ)lgJ?{OsAY68!;C z>&2Lm4T&QoBYdLHO!*gXP>mQ{IPyO65?KkHLY9+y#f{fX-Wnbrh7ssE)EyFvh=`13 zpy_F8pPQN8hwKqA-wrmnE^wBp*En%NB!OEh7~C`wkdqwgB0C(^4f7KdoTs}w)2({7 z*ETh>!9i0o;T8h<faE+f<~Z z_yy-zQPl-m&OcNe zq40T`Aakj}Gu_uuT1o8-3cfVrUnVAI786T&WIpteMm~$Nv)<;^&c#Il;B>oHMTMz4 zq<2WO%WvH3hP>QM>I1DxhBFG0I5vz6Go>$2xQ~Mx)prx)zl9(H)&#^!W$(ea+odL z^sWPS+!{h1`Q^(~MMW|Q9GoLac&##3u9N)g)t}HR9YCfKuwMYh=`AkbXOuYVkP<_7 z2fH2IsQl(lP^;c_daRY1-3eg7VykhXL_;tMu`o0H!~3mu@3UBNIw@*ty?p-sLr?F= zK9f75qVXy@ssQ+&*w}DGSXyGqz|SOt((x9ps;Z(Farp?&H*gN&8n#sFFtdI)Y6(K3 z9`Uo|?NwJFUw_BhVd`v$#(WQ(ij7khJN6d8QVVVD91%Wb8qWZl?u`B=+^yi^K!7vh z)7P*5eI_kNCDTqdA3{QI3k%04CEbLa^&t8sIGeyPgL7zo=Y9v6(J>J)WlPJ`#EDG# zjN3PF`oPcF+x4w_$*}pBT~_@^nORt_Qd7%7q(IY*!<2J#2Ibb1-9hBH2e@WRcU(>m zvEU`sFByhr$;2jd`&cL>ER30l=P#NImL7K7t5>fwv$Jui7v6w#?&X^|G|+=Cf5dGC zCMKqT7JOQq)X)g%0nPw(of~#JZTHww=mz8&;`+upG+IVaFU3un2WFT-)J;)E#edxD zE)UP=ogD{kh#)r6g_Dwk!oJn>NF}HSWV)Ku^m!9>I-fTBt0Su{1O#~>pme1vcBVJd6YX|aGLz# zqmIU&v*6ifiGoboN!8A8oZ2stNCp@;B=r}vvS18E?~YopucQz#2`SZ(Mg$FQy48Ux zDgYd|U=M);55~mR;`*+8e!XHii%2ioL7=BUnS|t>(*OVUe?9}DtDXqx@1QK=>TGa| zmK$D}bbig65QNVd>$N+6WNM$C)=dEe#K6i`+%Lp~RuX{lJal;L8^6gVg4pD0_DU`J z=n&vS7KUyps`kV<(X$PVU|_&n+#ez5D2JU3ra)RzH;0-P9VJR=Qa1MX+I6`dc9*X7 znU08-VwN0)b`E9N|6v@eRd4iIRcwRvi`Q}aH4YdnWw^GgH+YGH3vs>*onVfdjT5ka zUtC=5M6jBtS+NCXV<^CLxVLe<$P2 z{QS06CugSzLSIK$)2pkiOG5h0z^JC*9VZw{FZdZc`{3Z<{gsj)Ap3BJzox^qv@{&^ z1KoC++cWtfw&*_$c=y@ZfDFkfEgdkfg7Q~hUfy&FHkajPGsxN1e^#CBmj_t86GTUE zvcqhV1fE9#hXb?&opyoOBmhR(Xv!)ogC?#y+1bB(dej0FIAuIDb>2_`+LDtC>*0aY z9L;MCHpZtV%_`u6iW72NPMHT+UE7iapJqB_`HvqzK9-j!0juASA3r`uMmB>1mChpP z-jzhpT`-~2et((XnNP=*|5VLU;Ybg>REgfFg3uhanmnAbt6BtO*xrOYZp+LqEZ80H zm?n4~nkKH|0M2J-*?sW&MzreTNQXc1!qgR`VJHkUFa+-Fby55KE(jdL0!JmTyN7}% zp+pH;MZ4Nzy6F<*9d>pipLk*C&#|!~o%0d}D6sN${P{B%F1&_VJ}1i09|g3*?E1Qb zr6mW>;|VU(Vj^Ap|`xNbs5P;wW|89DA_LayE zzvk&AuxN^G{kpx(C!P8U9Kd{*BYw~Y&u;cMczc6+J3%^-2S+rrQxTGi?tJXok_w?J z0*|cM(deWdBtLvfdH{1B49pl%Sv>*jlsf>7vM1=VC}!1??9U z6%`x7U-%rn*wC8%iFp(Pa~A<-y!Q|eUXc&J(V8p#=a>uN^RJyheX$ zcHBgvU&AiRdBFvG0UMu;1h-&7l@O^o&Hz_M|HErHqyp>(Wb&7>e8j1J&(zgv!8a_1 zp%=9C1Bxrb`_%Q15if8(GqVxmERP<24Gj&&Kl=0g_bpfyXp!E(fA3SxpAKthH|~gn zJ_t(5tI2_7|9}8JZkl_XoT`#XJ4^k!Z;IZ_FnUs^_T7`bJ(KO&MG^sh8P0zU-p8P@ zu#3w-r^-jIQVR<|!usN>KloK~^jQVly?aSXNjUZ_$!h2+^nElCKLA!EJ6a$ffkUJh za(Ff_uS5wpYZC)Wl z5r_SWK5OFi1z+sn{t@WPFR&Z-hG^N6w^Fes3}gNkBj6Hi2?lm_@e z;ykASVBokzkdv@CQ$8iiLZL>Cov!AsAy4!M991zeFo5!(=Jmt`rU~9;DwCU=n-g5V ze3OUg)k#QrILqC;8BKIQ{ogqyudG;jZO2ab0`{*zJv2Xs-(6xoDTWn508SEXe<3Hw z4F94NNOGrFqZL{Fh z=ZU`l#|t_)AiII^5_DRjf%3!5%K8C!;KB3A2_O-H;+&UzeP<(!?4#_LZiv_5hUC=3bK@l+oE&?P02}#Kh5fR2f zoI?cnWT;^_T{On~;kXe3h}KtiS;iHk!wudI3d7@871urRecu7SSqN2}o}}H-zZ~%E z?c2W45s?9o_rW{w(N=hgh^7(8_wrlO~t`V@YrLXd*ii`S#b;o2s?o5|G=C?3)rUgg!it&Y#0-%rW7JHc{+%O!#;K~5phh7RO^6!vRt6OLP!08LzK?SIeWDE>Ay#z!E zXc2SXx}xKqw+g&ZLez9Tzkc~b33L^l*n;_iaI9z90}TrfV+Hi^)FFHHBShi2g=kQC zxDixFxI49f2?CQ5Ff~MJ7N!A=(k<=n6xXi#!)XvuC*b7CRa#ot;Q}StoouSPNtu~J zaC+q*x(fCPu4-Zm8sq_s!w2Gq3K*(kaPr$ViO&C{1p#9|t{emDjN!G+PXm@f5?DPr z^b#e)3l@7aIyww5KCZcit_IFVK<$8R_6+J4R3->F9)Jum9q1B9r~v_Unr=wLy4O+MT$TaRGbNG>6zx99X>(&|GO4#lF<<1;qI7i9sAoa$<;H`t9 zkiMNEd_(YXKM>^L=I7vk_?qW|5br}FZXS3m#LX>q(s|>*yTQ`hz|_d~f4qT5=n>z4 W-f&3H`U!48JeQJxnlGXI{=We0TRLU{ literal 0 HcmV?d00001 From 3c81416ec4a2c3f7ec46accc14e8ad4ce6a6a5a0 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Thu, 4 Jul 2019 22:55:22 -0700 Subject: [PATCH 10/22] feat: Readd cookies for address storage --- package.json | 1 + src/ButtplugPanel.ts | 49 +++++++++++++++++++++++++++++++++++++++++++ src/ButtplugPanel.vue | 4 ++++ yarn.lock | 5 +++++ 4 files changed, 59 insertions(+) diff --git a/package.json b/package.json index c103e0f..277459d 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "dependencies": { "vue": "^2.6.10", "vue-class-component": "^7.1.0", + "vue-cookies": "^1.5.13", "vue-property-decorator": "^8.1.1", "vuetify": "^1.5.14" }, diff --git a/src/ButtplugPanel.ts b/src/ButtplugPanel.ts index e8f5b62..38b360d 100644 --- a/src/ButtplugPanel.ts +++ b/src/ButtplugPanel.ts @@ -3,8 +3,13 @@ import { Component, Prop } from "vue-property-decorator"; import { ButtplugClient, IButtplugClientConnector, ButtplugBrowserWebsocketClientConnector, ButtplugEmbeddedClientConnector, ButtplugClientDevice} from "buttplug"; +Vue.use(require("vue-cookies")); class ConnectionAddress { + public static FromObject(aObj: any): ConnectionAddress { + return new ConnectionAddress(aObj.Host, aObj.Port, aObj.Insecure, aObj.Secure); + } + private static sIdNumber: number = 0; public Id: number; @@ -16,6 +21,15 @@ class ConnectionAddress { ConnectionAddress.sIdNumber += 1; } + public AsObject(): object { + return { + Host: this.Host, + Port: this.Port, + Insecure: this.Insecure, + Secure: this.Secure, + }; + } + public get IsValidURL(): boolean { try { const url = new URL(`ws://${this.Host}:${this.Port}`); @@ -47,6 +61,23 @@ export default class ButtplugPanel extends Vue { private desktopAddresses = [new ConnectionAddress("localhost", 12345, true, true), new ConnectionAddress("localhost", 12346, true, true)]; private uiMessage: [UiMessageType, string] | null = null; + private cookies: any = (window as any).$cookies; + + public mounted() { + this.cookies.config("999d"); + try { + const addresses = JSON.parse(this.cookies.get("intiface-addresses")); + if (addresses && Array.isArray(addresses) && addresses.length > 0) { + this.RetrieveAddressCookie(addresses); + } else { + console.log("Don't have an addresses!"); + this.StoreAddressCookie(); + } + } catch { + console.log("Can't load cookie!"); + this.StoreAddressCookie(); + } + } public async ConnectToIntifaceDesktop() { const connectPromises: Array> = []; @@ -71,6 +102,21 @@ export default class ButtplugPanel extends Vue { } } + private StoreAddressCookie() { + const addrs: object[] = []; + for (const addr of this.desktopAddresses) { + addrs.push(addr.AsObject()); + } + this.cookies.set("intiface-addresses", JSON.stringify(addrs)); + } + + private RetrieveAddressCookie(aAddrs: object[]) { + this.desktopAddresses = []; + for (const addr of aAddrs) { + this.desktopAddresses.push(ConnectionAddress.FromObject(addr)); + } + } + private SetErrorMessage(aMsg: string) { this.uiMessage = [UiMessageType.Error, aMsg]; } @@ -156,15 +202,18 @@ export default class ButtplugPanel extends Vue { private RemoveAddress(index: number) { this.desktopAddresses = this.desktopAddresses.filter((x) => x.Id !== index); + this.StoreAddressCookie(); } private AddAddress() { this.desktopAddresses.push(new ConnectionAddress("", 0, true, true)); + this.StoreAddressCookie(); } private ResetAddresses() { this.desktopAddresses = [new ConnectionAddress("localhost", 12345, true, true), new ConnectionAddress("localhost", 12346, true, true)]; + this.StoreAddressCookie(); } private FireChange() { diff --git a/src/ButtplugPanel.vue b/src/ButtplugPanel.vue index 559b662..73e18b0 100644 --- a/src/ButtplugPanel.vue +++ b/src/ButtplugPanel.vue @@ -52,6 +52,7 @@ @@ -59,17 +60,20 @@ label="Port" mask="#####" v-model="address.Port" + @change="StoreAddressCookie()" > diff --git a/yarn.lock b/yarn.lock index 16f0ca2..ac6cfda 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8168,6 +8168,11 @@ vue-cli-plugin-vuetify@^0.5.0: resolved "https://registry.yarnpkg.com/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-0.5.0.tgz#14c9a61884da58cf6aaf8ff3309044931907f184" integrity sha512-TigfiZUs7SN3Z6uxKilqJUtYxte8vp0F4QxabCli6hkKPqU97JzAZc3P7AL6omkRAd2DMI26fOrIGjuALTvXww== +vue-cookies@^1.5.13: + version "1.5.13" + resolved "https://registry.yarnpkg.com/vue-cookies/-/vue-cookies-1.5.13.tgz#b1ca79a2663bf9a4f36982557011cab5ee2196c0" + integrity sha512-8pjpXnvbNWx1Lft0t3MJnW+ylv0Wa2Tb6Ch617u/pQah3+SfXUZZdkh3EL3bSpe/Sw2Wdw3+DhycgQsKANSxXg== + vue-hot-reload-api@^2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" From 5eed88ed044666a6e9db78399ee198bb6e978ee8 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Fri, 5 Jul 2019 17:23:41 -0700 Subject: [PATCH 11/22] chore: Ignore late calls to StopScanning after disconnect StartScanning has a timer it calls StopScanning on. If we've disconnected before the timer fires, just ignore it. --- src/ButtplugPanel.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ButtplugPanel.ts b/src/ButtplugPanel.ts index 38b360d..24161df 100644 --- a/src/ButtplugPanel.ts +++ b/src/ButtplugPanel.ts @@ -177,6 +177,11 @@ export default class ButtplugPanel extends Vue { } private async StopScanning() { + // The setTimeout to call this may fire after disconnect. If so, just drop + // it. + if (!this.client.Connected) { + return; + } await this.client.StopScanning(); this.isScanning = false; } From 0e00f2b841f93c2bde9a88df61821ba1d0132e51 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Mon, 8 Jul 2019 19:41:01 -0700 Subject: [PATCH 12/22] build: Update dependencies --- package.json | 20 +++++----- yarn.lock | 108 ++++++++++++++++++++++++++++----------------------- 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 277459d..9fcca22 100644 --- a/package.json +++ b/package.json @@ -15,29 +15,29 @@ "test:unit": "vue-cli-service test:unit" }, "peerDependencies": { - "buttplug": ">=0.11.6" + "buttplug": ">=0.11.7" }, "dependencies": { "vue": "^2.6.10", "vue-class-component": "^7.1.0", "vue-cookies": "^1.5.13", - "vue-property-decorator": "^8.1.1", - "vuetify": "^1.5.14" + "vue-property-decorator": "^8.2.1", + "vuetify": "^1.5.16" }, "devDependencies": { - "@mdi/font": "^3.6.95", - "@types/jest": "^24.0.13", - "@vue/cli-plugin-typescript": "^3.8.1", - "@vue/cli-plugin-unit-jest": "^3.8.0", - "@vue/cli-service": "^3.8.0", + "@mdi/font": "^3.7.95", + "@types/jest": "^24.0.15", + "@vue/cli-plugin-typescript": "^3.9.0", + "@vue/cli-plugin-unit-jest": "^3.9.0", + "@vue/cli-service": "^3.9.2", "@vue/test-utils": "1.0.0-beta.29", "buttplug": "^0.11.6", "style-loader": "^0.23.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.2", "ts-jest": "^24.0.2", - "ts-loader": "^6.0.2", - "typescript": "^3.5.1", + "ts-loader": "^6.0.4", + "typescript": "^3.5.3", "vue-cli-plugin-vuetify": "^0.5.0", "vue-template-compiler": "^2.6.10", "vuetify-loader": "^1.2.2", diff --git a/yarn.lock b/yarn.lock index ac6cfda..cfa16cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,10 +53,10 @@ cssnano-preset-default "^4.0.0" postcss "^7.0.0" -"@mdi/font@^3.6.95": - version "3.6.95" - resolved "https://registry.yarnpkg.com/@mdi/font/-/font-3.6.95.tgz#0bbde766ca2d94cfa0e469f25523b23d3112bdd3" - integrity sha512-wUbkF/RRCIh51TPzAL9qUeRSUFla9I3x1nGq62HkfWzIebRHbDY5HPaYCQuZO7398dWaLHTu4BwnBA58YbhfEA== +"@mdi/font@^3.7.95": + version "3.7.95" + resolved "https://registry.yarnpkg.com/@mdi/font/-/font-3.7.95.tgz#86f783bdef3d985e14ce1345433477cade15fd6d" + integrity sha512-JFQSv1GwhilTN6mj2SHu+YH+jZAIPn6sir/gGYoMSgyEM94nzlLGc7Ew21mnDEr0+W3LhFaInu8dqZFvNUx1bA== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -99,10 +99,10 @@ resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== -"@types/jest@^24.0.13": - version "24.0.13" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.13.tgz#10f50b64cb05fb02411fbba49e9042a3a11da3f9" - integrity sha512-3m6RPnO35r7Dg+uMLj1+xfZaOgIHHHut61djNjzwExXN4/Pm9has9C6I1KMYSfz7mahDhWUOVg4HW/nZdv5Pww== +"@types/jest@^24.0.15": + version "24.0.15" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.15.tgz#6c42d5af7fe3b44ffff7cc65de7bf741e8fa427f" + integrity sha512-MU1HIvWUme74stAoc3mgAi+aMlgKOudgEvQDIm1v4RkrDudBh1T+NFp5sftpBAdXdx1J0PbdpJ+M2EsSOi1djA== dependencies: "@types/jest-diff" "*" @@ -141,30 +141,31 @@ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.9.tgz#a67287861c928ebf4159a908d1fb1a2a34d4097a" integrity sha512-p8zp5xqkly3g4cCmo2mKOHI9+Z/kObmDj0BmjbDDJQlgDTiEGTbm17MEwTAusV6XceCy+bNw9q/ZHXHyKo3zkg== -"@vue/cli-overlay@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.8.0.tgz#e4e8e2fa92b06fc282916df9c924f1dba50eeabb" - integrity sha512-4hY/+r9OwpMb7BPFnQGKftMC8CrfbV00REEFOij52+L4swQw+m879+5zX3Z0xHfPftw6JyaqJB0rmQ0ILI6Ovw== +"@vue/cli-overlay@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.9.0.tgz#11f513d1fa11b0135fb8ba8b88d228df0dc542e0" + integrity sha512-QfyvpJl2ChehBT2qzb5EvW921JxW94uFL3+lHa6VT42ImH8awrvkTGZmxTQWhHvATa7r0LKy7M7ZRMyo547esg== -"@vue/cli-plugin-typescript@^3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.8.1.tgz#fbe1298710ed0f6feecba61640c3aab29bcc35b2" - integrity sha512-CAD19+Z46OtUHYkZaLFeDJPuQWVLFJ+1rSL3PdESVQ9Pm0ZVVsCCZYGeQAGyAbHNWtvY7Gt0CbxsZTj+5ChSpw== +"@vue/cli-plugin-typescript@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-3.9.0.tgz#8969f2df898a68b4c1d49f5a928ec9ba35a0c0fe" + integrity sha512-QXL98MLM2gdqcrLkEG3bjwyQDIhzKdJqUdVghH/ZAttSj5G3hDKklI5HPqz3TJV7FVDOocFr1szP2BcXCCLh8Q== dependencies: "@types/webpack-env" "^1.13.9" - "@vue/cli-shared-utils" "^3.8.0" + "@vue/cli-shared-utils" "^3.9.0" fork-ts-checker-webpack-plugin "^0.5.2" globby "^9.2.0" ts-loader "^5.3.3" tslint "^5.15.0" webpack ">=4 < 4.29" + yorkie "^2.0.0" -"@vue/cli-plugin-unit-jest@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.8.0.tgz#13cd3b4f5d1c9e0ef1982cbaea19b73f7df947d6" - integrity sha512-8kvoh6NZYY7FjuqRorqo47VTi62a3u69+oAxqBiIOkc28OGaju/FrL0Vm95vRB8tMkU6EPXKVRtCjPz8R2QeZA== +"@vue/cli-plugin-unit-jest@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.9.0.tgz#0662adee9467006381b9cddc7fb3b0a21ccbbd07" + integrity sha512-FzUeTXXM7VUbjNDrqbj/AoUXZd0FZVrW936VO0W57r7uDgv+bh5hcEyzZnOaqFUOHYNFhl0RYD528/Uq5Dgm0A== dependencies: - "@vue/cli-shared-utils" "^3.8.0" + "@vue/cli-shared-utils" "^3.9.0" babel-jest "^23.6.0" babel-plugin-transform-es2015-modules-commonjs "^6.26.2" jest "^23.6.0" @@ -173,15 +174,15 @@ jest-watch-typeahead "0.2.1" vue-jest "^3.0.4" -"@vue/cli-service@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.8.0.tgz#47eaa169a7bd96522c1a0df89214f1afee843cd6" - integrity sha512-ipJF4RHjyLyLC4oLx+JM1Jk6tiIG0KjCFAqfOscQ44K4CdyS03oFMAUR+SZYy/UXKccMnoeY6Ld4YrGXSytQsg== +"@vue/cli-service@^3.9.2": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.9.2.tgz#59c95500f1f20ab1cd1905c28f6c3b17c04d6de8" + integrity sha512-R4L9tCMpJ4DzLgu/aU9CEtl5QYsj/FXRrtEgXSKm+71OVtA/o2rkLTC8SLB2Bu7wHP/HCYbaoy4NZqSEQzTuLw== dependencies: "@intervolga/optimize-cssnano-plugin" "^1.0.5" "@soda/friendly-errors-webpack-plugin" "^1.7.1" - "@vue/cli-overlay" "^3.8.0" - "@vue/cli-shared-utils" "^3.8.0" + "@vue/cli-overlay" "^3.9.0" + "@vue/cli-shared-utils" "^3.9.0" "@vue/component-compiler-utils" "^2.6.0" "@vue/preload-webpack-plugin" "^1.1.0" "@vue/web-component-wrapper" "^1.2.0" @@ -201,6 +202,7 @@ cssnano "^4.1.10" current-script-polyfill "^1.0.0" debug "^4.1.1" + default-gateway "^5.0.2" dotenv "^7.0.0" dotenv-expand "^5.1.0" escape-string-regexp "^1.0.5" @@ -233,12 +235,11 @@ webpack-chain "^4.11.0" webpack-dev-server "^3.4.1" webpack-merge "^4.2.1" - yorkie "^2.0.0" -"@vue/cli-shared-utils@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.8.0.tgz#e7e728164eb92bd9e205fcd08dae896ee79cba5a" - integrity sha512-wn1L8pmQnotfftHOYm0VeXs2+cQTySd73uhWXwyO6pT0ehjqlY5c2RTipClmFF3Q+YCYjwlNpsV650F3l1tV8w== +"@vue/cli-shared-utils@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.9.0.tgz#cb56a443bf763a873849a11d07e9e7638aa16cc2" + integrity sha512-wumeMZTz5aQ+1Y6uxTKegIsgOXEWT3hT8f9sW2mj5SwNDVyQ+AHZTgSynYExTUJg3dH81uKgFDUpPdAvGxzh8g== dependencies: "@hapi/joi" "^15.0.1" chalk "^2.4.1" @@ -2180,6 +2181,14 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" +default-gateway@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-5.0.2.tgz#d2d8a13d6fee406d9365d19ec9adccb8a60b82b3" + integrity sha512-wXuT0q8T5vxQNecrTgz/KbU2lPUMRc98I9Y5dnH3yhFB3BGYqtADK4lhivLlG0OfjhmfKx1PGILG2jR4zjI+WA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" @@ -7853,10 +7862,10 @@ ts-loader@^5.3.3: micromatch "^3.1.4" semver "^5.0.1" -ts-loader@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.2.tgz#cbd46a1495668ed9d59813f5c66f4bb49ff0c14c" - integrity sha512-kkF3sGf3oBUehlvXI9fkbItbFTnNgGkYAz91vtWnsKAU4m+LAmQjuby7uTZNo3As+/zHLuyB052SkQDY6vLXtg== +ts-loader@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63" + integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g== dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -7947,10 +7956,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.1.tgz#ba72a6a600b2158139c5dd8850f700e231464202" - integrity sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw== +typescript@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" + integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== uglify-js@3.4.x: version "3.4.10" @@ -8205,11 +8214,12 @@ vue-loader@^15.7.0: vue-hot-reload-api "^2.3.0" vue-style-loader "^4.1.0" -vue-property-decorator@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-8.1.1.tgz#80dadbe5ffa0e7eb6a0ba0a07036365471a7d5ee" - integrity sha512-K+PUT17ZEMWyhrKZnl4Fc9qMyFpMcjVbZJBwx4BpA8BXfaspaTeFdoHuk1aywC/+4G86sxIr/5n4IQUQLecSWw== +vue-property-decorator@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-8.2.1.tgz#3791662033b20d20d098cb20e86fd23842982508" + integrity sha512-zgtcvzGB2JpDqnIxVhTK+6m+dv3uyhYs+tL8elL+DWiXj9kDonKcPY7f1DHYX1NlnWPCj7ht0nL/i8+S1gg76Q== dependencies: + vue "^2.6.10" vue-class-component "^7.0.1" vue-style-loader@^4.1.0: @@ -8245,10 +8255,10 @@ vuetify-loader@^1.2.2: dependencies: loader-utils "^1.1.0" -vuetify@^1.5.14: - version "1.5.14" - resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-1.5.14.tgz#ff67d0b8a398be5297da159b6cd1b31f4d2898b8" - integrity sha512-7iM+TfghR/wu/Gl+k37lKr0N8Ddr6SxzqHtoK1dIyHgCH6SJRkpaXPw2MC5/FsAg9aUDJbYNWrzSeu5eHw+Q/w== +vuetify@^1.5.16: + version "1.5.16" + resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-1.5.16.tgz#cc9d0199c389d64d15787ddc85ca47a28225eeee" + integrity sha512-yBgOsfurKQkeS+l+rrTQZ2bFk0D9ezjHhkuVM5A/yVzcg62sY2nfYaq/H++uezBWC9WYFrp/5OmSocJQcWn9Qw== w3c-hr-time@^1.0.1: version "1.0.1" From 46788bca7235ab7e94357aef9a6b9517104135e7 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Sat, 27 Jul 2019 19:52:17 -0700 Subject: [PATCH 13/22] build: Update some dependencies, move others to peer We only need vue/vuetify as peer dependencies, other projects should bring those in. Also, update Buttplug (but not vuetify yet, not ready for Vuetify 2.0) --- package.json | 22 ++++++++------- yarn.lock | 77 +++++++++++++++++++++++++++++----------------------- 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 9fcca22..9fbaee0 100644 --- a/package.json +++ b/package.json @@ -15,32 +15,34 @@ "test:unit": "vue-cli-service test:unit" }, "peerDependencies": { - "buttplug": ">=0.11.7" + "buttplug": ">=0.12.0", + "vue": "^2.6.10", + "vuetify": "^1.5.16" }, "dependencies": { - "vue": "^2.6.10", "vue-class-component": "^7.1.0", "vue-cookies": "^1.5.13", - "vue-property-decorator": "^8.2.1", - "vuetify": "^1.5.16" + "vue-property-decorator": "^8.2.1" }, "devDependencies": { - "@mdi/font": "^3.7.95", + "@mdi/font": "^3.8.95", "@types/jest": "^24.0.15", "@vue/cli-plugin-typescript": "^3.9.0", "@vue/cli-plugin-unit-jest": "^3.9.0", - "@vue/cli-service": "^3.9.2", + "@vue/cli-service": "^3.9.3", "@vue/test-utils": "1.0.0-beta.29", - "buttplug": "^0.11.6", + "buttplug": "^0.12.0", "style-loader": "^0.23.1", "stylus": "^0.54.5", "stylus-loader": "^3.0.2", "ts-jest": "^24.0.2", "ts-loader": "^6.0.4", "typescript": "^3.5.3", - "vue-cli-plugin-vuetify": "^0.5.0", + "vue": "^2.6.10", + "vue-cli-plugin-vuetify": "^0.6.1", "vue-template-compiler": "^2.6.10", - "vuetify-loader": "^1.2.2", - "webpack-cli": "^3.3.5" + "vuetify": "^1.5.16", + "vuetify-loader": "^1.3.0", + "webpack-cli": "^3.3.6" } } diff --git a/yarn.lock b/yarn.lock index cfa16cf..f5200e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,10 +53,10 @@ cssnano-preset-default "^4.0.0" postcss "^7.0.0" -"@mdi/font@^3.7.95": - version "3.7.95" - resolved "https://registry.yarnpkg.com/@mdi/font/-/font-3.7.95.tgz#86f783bdef3d985e14ce1345433477cade15fd6d" - integrity sha512-JFQSv1GwhilTN6mj2SHu+YH+jZAIPn6sir/gGYoMSgyEM94nzlLGc7Ew21mnDEr0+W3LhFaInu8dqZFvNUx1bA== +"@mdi/font@^3.8.95": + version "3.8.95" + resolved "https://registry.yarnpkg.com/@mdi/font/-/font-3.8.95.tgz#772094ed7046b126457b1f3b8c82e26b209e71e8" + integrity sha512-KR6TBdVYV3p1ZOM+Ge45Kk3P8yHfSGt3YOryVlkEKdO3vMiPjRaaDcQsdogGxVl8FcXsAt/Gz8MoXObbOF1Pzg== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -174,10 +174,10 @@ jest-watch-typeahead "0.2.1" vue-jest "^3.0.4" -"@vue/cli-service@^3.9.2": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.9.2.tgz#59c95500f1f20ab1cd1905c28f6c3b17c04d6de8" - integrity sha512-R4L9tCMpJ4DzLgu/aU9CEtl5QYsj/FXRrtEgXSKm+71OVtA/o2rkLTC8SLB2Bu7wHP/HCYbaoy4NZqSEQzTuLw== +"@vue/cli-service@^3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.9.3.tgz#4bd5786465afb8b608c5c7fc9661390e747ea756" + integrity sha512-CZE9PP4HH9bK4qAaLbTUB3tubggI+aRSbgB/QYSZrVlhtMpuVFZPj2QHbIvJQZTI2cG6LFQtLTZWXKeqo5lbAQ== dependencies: "@intervolga/optimize-cssnano-plugin" "^1.0.5" "@soda/friendly-errors-webpack-plugin" "^1.7.1" @@ -212,7 +212,7 @@ hash-sum "^1.0.2" html-webpack-plugin "^3.2.0" launch-editor-middleware "^2.2.1" - lodash.defaultsdeep "^4.6.0" + lodash.defaultsdeep "^4.6.1" lodash.mapvalues "^4.6.0" lodash.transform "^4.6.0" mini-css-extract-plugin "^0.6.0" @@ -503,7 +503,7 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.5.5: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -513,6 +513,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -1238,14 +1248,13 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -buttplug@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/buttplug/-/buttplug-0.11.6.tgz#4ac85e92fdd46bf17b08b33c3266e8eb8b005fc5" - integrity sha512-UOFL+GHEcU78Xh4fJ8i6HGcP1egoYh/9iWhHOUcbTY4OhqdMnxvoQT8D2X0tM9gjr9rNTZRweR7/N8oSYR8ftQ== +buttplug@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/buttplug/-/buttplug-0.12.0.tgz#65c1152183ca4d545fc5232d3964f567628d0ff8" + integrity sha512-JYFcxlGXzk0RKoxGUpIi7clFv8I3QR5skl/kKx09uzeOhOF2InjHfzige0Aa1u3HQ365ZblULDUQfMldX4IQjA== dependencies: - ajv "^6.10.0" + ajv "^6.10.2" class-transformer "^0.2.3" - js-yaml "^3.13.1" reflect-metadata "^0.1.13" bytes@3.0.0: @@ -4822,7 +4831,7 @@ loader-runner@^2.3.0, loader-runner@^2.3.1: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.0, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -4862,10 +4871,10 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.defaultsdeep@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" - integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= +lodash.defaultsdeep@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== lodash.mapvalues@^4.6.0: version "4.6.0" @@ -8172,10 +8181,10 @@ vue-class-component@^7.0.1, vue-class-component@^7.1.0: resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.1.0.tgz#b33efcb10e17236d684f70b1e96f1946ec793e87" integrity sha512-G9152NzUkz0i0xTfhk0Afc8vzdXxDR1pfN4dTwE72cskkgJtdXfrKBkMfGvDuxUh35U500g5Ve4xL8PEGdWeHg== -vue-cli-plugin-vuetify@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-0.5.0.tgz#14c9a61884da58cf6aaf8ff3309044931907f184" - integrity sha512-TigfiZUs7SN3Z6uxKilqJUtYxte8vp0F4QxabCli6hkKPqU97JzAZc3P7AL6omkRAd2DMI26fOrIGjuALTvXww== +vue-cli-plugin-vuetify@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-0.6.1.tgz#4fe0b7322a90a9c9f0aff2e18fd9249088b33080" + integrity sha512-WZzXXTdFOXWXVhSL4zXs1nJvC/6Py9kXm4S+bdh+W0xucwXlIAr19cgqCjV9ahR4cznQ/SBDv8x4RFCpPgGAHQ== vue-cookies@^1.5.13: version "1.5.13" @@ -8248,12 +8257,12 @@ vue@^2.6.10: resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ== -vuetify-loader@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.2.2.tgz#7c221dcfd8482344518818d598f9cef8ddd85b6b" - integrity sha512-j6KWPuwQ4xTxPDksbFwbSJle7+3oSjNvJ/CViTEgbPLFPqnNsR8JUtRldURIQ0cmAmr0/CoLSZkj0B8JKqOBMA== +vuetify-loader@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.3.0.tgz#759f1d16f3f211eddbeeffc5c0b24105f2582b07" + integrity sha512-emKS3GWpx+0kWRHfoxpDpLR4HaXvhDn9bYNQf+IaaD5iU5S3xktDyS0egG7dp/oHLQr1U/Ui9g2ElhZUkdgRqw== dependencies: - loader-utils "^1.1.0" + loader-utils "^1.2.0" vuetify@^1.5.16: version "1.5.16" @@ -8337,10 +8346,10 @@ webpack-chain@^4.11.0: deepmerge "^1.5.2" javascript-stringify "^1.6.0" -webpack-cli@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.5.tgz#f4d1238a66a2843d9cebf189835ea22142e72767" - integrity sha512-w0j/s42c5UhchwTmV/45MLQnTVwRoaUTu9fM5LuyOd/8lFoCNCELDogFoecx5NzRUndO0yD/gF2b02XKMnmAWQ== +webpack-cli@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.6.tgz#2c8c399a2642133f8d736a359007a052e060032c" + integrity sha512-0vEa83M7kJtxK/jUhlpZ27WHIOndz5mghWL2O53kiDoA9DIxSKnfqB92LoqEn77cT4f3H2cZm1BMEat/6AZz3A== dependencies: chalk "2.4.2" cross-spawn "6.0.5" From dd4d3c6dc7d6f590748d936fa0c80e7848b414e9 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Sat, 27 Jul 2019 19:53:04 -0700 Subject: [PATCH 14/22] feat: Try to load device configuration from the web Use the CDN hosted version of the config for devices --- src/ButtplugPanel.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ButtplugPanel.ts b/src/ButtplugPanel.ts index 24161df..c324f77 100644 --- a/src/ButtplugPanel.ts +++ b/src/ButtplugPanel.ts @@ -2,7 +2,8 @@ import Vue from "vue"; import { Component, Prop } from "vue-property-decorator"; import { ButtplugClient, IButtplugClientConnector, ButtplugBrowserWebsocketClientConnector, ButtplugEmbeddedClientConnector, - ButtplugClientDevice} from "buttplug"; + ButtplugClientDevice, + DeviceConfigurationManager} from "buttplug"; Vue.use(require("vue-cookies")); class ConnectionAddress { @@ -70,13 +71,19 @@ export default class ButtplugPanel extends Vue { if (addresses && Array.isArray(addresses) && addresses.length > 0) { this.RetrieveAddressCookie(addresses); } else { - console.log("Don't have an addresses!"); + console.log("Don't have config addresses available in cookie!"); this.StoreAddressCookie(); } } catch { console.log("Can't load cookie!"); this.StoreAddressCookie(); } + + DeviceConfigurationManager.LoadFromWebConfig().then(() => { + console.log("Config loaded from web"); + }).catch((e) => { + console.log(`Config not loaded from web: ${e}`); + }); } public async ConnectToIntifaceDesktop() { From 5b3ecbcbbef008aee6e8314fb9fecbf30b970023 Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Sat, 27 Jul 2019 19:54:28 -0700 Subject: [PATCH 15/22] doc: Update CHANGELOG and version for 1.0.1 --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cac9cf3..6c74928 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# Version 1.0.1 - 2019/07/27 + +- Update to buttplug-js 0.12.0 +- Try loading device config from web CDN by default + # Version 1.0.0 - 2019/06/10 - Rebuild component from the ground up, using vue-cli diff --git a/package.json b/package.json index 9fbaee0..df715a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-buttplug-material-component", - "version": "1.0.0", + "version": "1.0.1", "main": "dist/index.js", "scripts": { "serve": "vue-cli-service serve", From e9964b98d9cce68b4c5f3c7a33ad198c2d51a66e Mon Sep 17 00:00:00 2001 From: Kyle Machulis Date: Sat, 5 Oct 2019 15:52:09 -0700 Subject: [PATCH 16/22] fix: Serialize websocket connections for now Trying to do parallel websocket connection tests doesn't work right, and will require more rearchitecting. Just go one-by-one for now, even if it is a bit slow. Fixes #22 --- src/ButtplugPanel.ts | 36 +++++++++++++++++++++++------------- src/ButtplugPanel.vue | 13 ++++++++++++- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/ButtplugPanel.ts b/src/ButtplugPanel.ts index c324f77..4af4a8e 100644 --- a/src/ButtplugPanel.ts +++ b/src/ButtplugPanel.ts @@ -2,8 +2,8 @@ import Vue from "vue"; import { Component, Prop } from "vue-property-decorator"; import { ButtplugClient, IButtplugClientConnector, ButtplugBrowserWebsocketClientConnector, ButtplugEmbeddedClientConnector, - ButtplugClientDevice, - DeviceConfigurationManager} from "buttplug"; + ButtplugClientDevice, + DeviceConfigurationManager} from "buttplug"; Vue.use(require("vue-cookies")); class ConnectionAddress { @@ -52,6 +52,7 @@ export default class ButtplugPanel extends Vue { @Prop() private client: ButtplugClient; private isScanning: boolean = false; + private isConnecting: boolean = false; // 30 second scanning limit private scanTime: number = 30000; private scanOnConnect: boolean = true; @@ -86,27 +87,36 @@ export default class ButtplugPanel extends Vue { }); } - public async ConnectToIntifaceDesktop() { - const connectPromises: Array> = []; + public async ConnectToIntifaceDesktop(): Promise { + this.CloseUiMessage(); + this.isConnecting = true; + const connectPromises: Array> = []; + let isConnected = false; + const urls: string[] = []; for (const address of this.desktopAddresses) { const baseUrl = `${address.Host}:${address.Port}`; - const urls: string[] = []; if (address.Insecure) { urls.push(`ws://${baseUrl}`); } if (address.Secure) { urls.push(`wss://${baseUrl}`); } - for (const url of urls) { - connectPromises.push(this.Connect(new ButtplugBrowserWebsocketClientConnector(`${url}`)) - .then(() => Promise.resolve(true), (e) => Promise.resolve(false))); + } + + for (const url of urls) { + try { + await this.Connect(new ButtplugBrowserWebsocketClientConnector(`${url}`)); + isConnected = true; + break; + } catch (e) { + continue; } } - const connectReturns = await Promise.all(connectPromises); - if (connectReturns.indexOf(true) === -1) { + + if (!isConnected) { this.SetErrorMessage("Cannot connect to Intiface Desktop. Is the application up, and is the server running?"); - return; } + this.isConnecting = false; } private StoreAddressCookie() { @@ -153,10 +163,10 @@ export default class ButtplugPanel extends Vue { this.client.addListener("scanningfinished", this.OnScanningFinished); this.client.addListener("disconnect", this.RemoveListeners); try { - await this.client.Connect(aConnector); + await this.client.Connect(aConnector).catch((e) => {}); } catch (e) { this.RemoveListeners(); - throw e; + return Promise.reject("test"); } // If we don't connect successfully, the above line will throw. Assume that // we're connected if we get this far. diff --git a/src/ButtplugPanel.vue b/src/ButtplugPanel.vue index 73e18b0..8d33531 100644 --- a/src/ButtplugPanel.vue +++ b/src/ButtplugPanel.vue @@ -5,6 +5,7 @@ color="red lighten-2" @click="ConnectToIntifaceDesktop" class="white--text" + :disabled="isConnecting" > Connect To Intiface Desktop @@ -29,7 +30,17 @@ - + + + + Trying to connect to Intiface Desktop... + + + +