speechflow 1.4.4 → 1.5.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.
Files changed (168) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +273 -7
  3. package/etc/claude.md +70 -0
  4. package/etc/speechflow.png +0 -0
  5. package/etc/speechflow.yaml +29 -11
  6. package/etc/stx.conf +7 -0
  7. package/package.json +7 -6
  8. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.d.ts +1 -0
  9. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +155 -0
  10. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -0
  11. package/speechflow-cli/dst/speechflow-node-a2a-compressor.d.ts +15 -0
  12. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +287 -0
  13. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -0
  14. package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.d.ts +1 -0
  15. package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.js +208 -0
  16. package/speechflow-cli/dst/speechflow-node-a2a-dynamics-wt.js.map +1 -0
  17. package/speechflow-cli/dst/speechflow-node-a2a-dynamics.d.ts +15 -0
  18. package/speechflow-cli/dst/speechflow-node-a2a-dynamics.js +312 -0
  19. package/speechflow-cli/dst/speechflow-node-a2a-dynamics.js.map +1 -0
  20. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.d.ts +1 -0
  21. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +161 -0
  22. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js.map +1 -0
  23. package/speechflow-cli/dst/speechflow-node-a2a-expander.d.ts +13 -0
  24. package/speechflow-cli/dst/speechflow-node-a2a-expander.js +208 -0
  25. package/speechflow-cli/dst/speechflow-node-a2a-expander.js.map +1 -0
  26. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +13 -3
  27. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -1
  28. package/speechflow-cli/dst/speechflow-node-a2a-filler.d.ts +14 -0
  29. package/speechflow-cli/dst/speechflow-node-a2a-filler.js +233 -0
  30. package/speechflow-cli/dst/speechflow-node-a2a-filler.js.map +1 -0
  31. package/speechflow-cli/dst/speechflow-node-a2a-gain.d.ts +12 -0
  32. package/speechflow-cli/dst/speechflow-node-a2a-gain.js +125 -0
  33. package/speechflow-cli/dst/speechflow-node-a2a-gain.js.map +1 -0
  34. package/speechflow-cli/dst/speechflow-node-a2a-gender.d.ts +0 -1
  35. package/speechflow-cli/dst/speechflow-node-a2a-gender.js +28 -12
  36. package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
  37. package/speechflow-cli/dst/speechflow-node-a2a-meter.d.ts +1 -1
  38. package/speechflow-cli/dst/speechflow-node-a2a-meter.js +35 -53
  39. package/speechflow-cli/dst/speechflow-node-a2a-meter.js.map +1 -1
  40. package/speechflow-cli/dst/speechflow-node-a2a-mute.js +2 -1
  41. package/speechflow-cli/dst/speechflow-node-a2a-mute.js.map +1 -1
  42. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise-wt.d.ts +1 -0
  43. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise-wt.js +55 -0
  44. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise-wt.js.map +1 -0
  45. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.d.ts +14 -0
  46. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js +184 -0
  47. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js.map +1 -0
  48. package/speechflow-cli/dst/speechflow-node-a2a-speex.d.ts +14 -0
  49. package/speechflow-cli/dst/speechflow-node-a2a-speex.js +156 -0
  50. package/speechflow-cli/dst/speechflow-node-a2a-speex.js.map +1 -0
  51. package/speechflow-cli/dst/speechflow-node-a2a-vad.js +3 -3
  52. package/speechflow-cli/dst/speechflow-node-a2a-vad.js.map +1 -1
  53. package/speechflow-cli/dst/speechflow-node-a2a-wav.js +22 -17
  54. package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -1
  55. package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.d.ts +18 -0
  56. package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.js +317 -0
  57. package/speechflow-cli/dst/speechflow-node-a2t-awstranscribe.js.map +1 -0
  58. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +16 -33
  59. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -1
  60. package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.d.ts +19 -0
  61. package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.js +351 -0
  62. package/speechflow-cli/dst/speechflow-node-a2t-openaitranscribe.js.map +1 -0
  63. package/speechflow-cli/dst/speechflow-node-t2a-awspolly.d.ts +16 -0
  64. package/speechflow-cli/dst/speechflow-node-t2a-awspolly.js +171 -0
  65. package/speechflow-cli/dst/speechflow-node-t2a-awspolly.js.map +1 -0
  66. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +19 -14
  67. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
  68. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +11 -6
  69. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  70. package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.d.ts +13 -0
  71. package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.js +141 -0
  72. package/speechflow-cli/dst/speechflow-node-t2t-awstranslate.js.map +1 -0
  73. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js +13 -15
  74. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js.map +1 -1
  75. package/speechflow-cli/dst/speechflow-node-t2t-format.js +10 -15
  76. package/speechflow-cli/dst/speechflow-node-t2t-format.js.map +1 -1
  77. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js +44 -31
  78. package/speechflow-cli/dst/speechflow-node-t2t-ollama.js.map +1 -1
  79. package/speechflow-cli/dst/speechflow-node-t2t-openai.js +44 -45
  80. package/speechflow-cli/dst/speechflow-node-t2t-openai.js.map +1 -1
  81. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +8 -8
  82. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js.map +1 -1
  83. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +10 -12
  84. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -1
  85. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js +22 -27
  86. package/speechflow-cli/dst/speechflow-node-t2t-transformers.js.map +1 -1
  87. package/speechflow-cli/dst/speechflow-node-x2x-filter.d.ts +1 -0
  88. package/speechflow-cli/dst/speechflow-node-x2x-filter.js +50 -15
  89. package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -1
  90. package/speechflow-cli/dst/speechflow-node-x2x-trace.js +17 -18
  91. package/speechflow-cli/dst/speechflow-node-x2x-trace.js.map +1 -1
  92. package/speechflow-cli/dst/speechflow-node-xio-device.js +13 -21
  93. package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -1
  94. package/speechflow-cli/dst/speechflow-node-xio-mqtt.d.ts +1 -0
  95. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +22 -16
  96. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -1
  97. package/speechflow-cli/dst/speechflow-node-xio-websocket.js +19 -19
  98. package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
  99. package/speechflow-cli/dst/speechflow-node.d.ts +6 -3
  100. package/speechflow-cli/dst/speechflow-node.js +13 -2
  101. package/speechflow-cli/dst/speechflow-node.js.map +1 -1
  102. package/speechflow-cli/dst/speechflow-utils-audio-wt.d.ts +1 -0
  103. package/speechflow-cli/dst/speechflow-utils-audio-wt.js +124 -0
  104. package/speechflow-cli/dst/speechflow-utils-audio-wt.js.map +1 -0
  105. package/speechflow-cli/dst/speechflow-utils-audio.d.ts +13 -0
  106. package/speechflow-cli/dst/speechflow-utils-audio.js +137 -0
  107. package/speechflow-cli/dst/speechflow-utils-audio.js.map +1 -0
  108. package/speechflow-cli/dst/speechflow-utils.d.ts +18 -0
  109. package/speechflow-cli/dst/speechflow-utils.js +123 -35
  110. package/speechflow-cli/dst/speechflow-utils.js.map +1 -1
  111. package/speechflow-cli/dst/speechflow.js +114 -27
  112. package/speechflow-cli/dst/speechflow.js.map +1 -1
  113. package/speechflow-cli/etc/oxlint.jsonc +112 -11
  114. package/speechflow-cli/etc/stx.conf +2 -2
  115. package/speechflow-cli/etc/tsconfig.json +1 -1
  116. package/speechflow-cli/package.d/@shiguredo+rnnoise-wasm+2025.1.5.patch +25 -0
  117. package/speechflow-cli/package.json +102 -94
  118. package/speechflow-cli/src/lib.d.ts +24 -0
  119. package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +151 -0
  120. package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +303 -0
  121. package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +158 -0
  122. package/speechflow-cli/src/speechflow-node-a2a-expander.ts +212 -0
  123. package/speechflow-cli/src/speechflow-node-a2a-ffmpeg.ts +13 -3
  124. package/speechflow-cli/src/speechflow-node-a2a-filler.ts +223 -0
  125. package/speechflow-cli/src/speechflow-node-a2a-gain.ts +98 -0
  126. package/speechflow-cli/src/speechflow-node-a2a-gender.ts +31 -17
  127. package/speechflow-cli/src/speechflow-node-a2a-meter.ts +37 -56
  128. package/speechflow-cli/src/speechflow-node-a2a-mute.ts +3 -2
  129. package/speechflow-cli/src/speechflow-node-a2a-rnnoise-wt.ts +62 -0
  130. package/speechflow-cli/src/speechflow-node-a2a-rnnoise.ts +164 -0
  131. package/speechflow-cli/src/speechflow-node-a2a-speex.ts +137 -0
  132. package/speechflow-cli/src/speechflow-node-a2a-vad.ts +3 -3
  133. package/speechflow-cli/src/speechflow-node-a2a-wav.ts +20 -13
  134. package/speechflow-cli/src/speechflow-node-a2t-awstranscribe.ts +308 -0
  135. package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +16 -33
  136. package/speechflow-cli/src/speechflow-node-a2t-openaitranscribe.ts +337 -0
  137. package/speechflow-cli/src/speechflow-node-t2a-awspolly.ts +187 -0
  138. package/speechflow-cli/src/speechflow-node-t2a-elevenlabs.ts +19 -14
  139. package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +12 -7
  140. package/speechflow-cli/src/speechflow-node-t2t-awstranslate.ts +152 -0
  141. package/speechflow-cli/src/speechflow-node-t2t-deepl.ts +13 -15
  142. package/speechflow-cli/src/speechflow-node-t2t-format.ts +10 -15
  143. package/speechflow-cli/src/speechflow-node-t2t-ollama.ts +55 -42
  144. package/speechflow-cli/src/speechflow-node-t2t-openai.ts +58 -58
  145. package/speechflow-cli/src/speechflow-node-t2t-sentence.ts +10 -10
  146. package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +15 -16
  147. package/speechflow-cli/src/speechflow-node-t2t-transformers.ts +27 -32
  148. package/speechflow-cli/src/speechflow-node-x2x-filter.ts +20 -16
  149. package/speechflow-cli/src/speechflow-node-x2x-trace.ts +20 -19
  150. package/speechflow-cli/src/speechflow-node-xio-device.ts +15 -23
  151. package/speechflow-cli/src/speechflow-node-xio-mqtt.ts +23 -16
  152. package/speechflow-cli/src/speechflow-node-xio-websocket.ts +19 -19
  153. package/speechflow-cli/src/speechflow-node.ts +21 -8
  154. package/speechflow-cli/src/speechflow-utils-audio-wt.ts +172 -0
  155. package/speechflow-cli/src/speechflow-utils-audio.ts +147 -0
  156. package/speechflow-cli/src/speechflow-utils.ts +125 -32
  157. package/speechflow-cli/src/speechflow.ts +118 -30
  158. package/speechflow-ui-db/dst/index.css +1 -1
  159. package/speechflow-ui-db/dst/index.js +31 -31
  160. package/speechflow-ui-db/etc/eslint.mjs +0 -1
  161. package/speechflow-ui-db/etc/tsc-client.json +3 -3
  162. package/speechflow-ui-db/package.json +11 -10
  163. package/speechflow-ui-db/src/app.vue +96 -78
  164. package/speechflow-ui-st/dst/index.js +26 -26
  165. package/speechflow-ui-st/etc/eslint.mjs +0 -1
  166. package/speechflow-ui-st/etc/tsc-client.json +3 -3
  167. package/speechflow-ui-st/package.json +11 -10
  168. package/speechflow-ui-st/src/app.vue +5 -12
@@ -62,7 +62,6 @@ export default [
62
62
  "@stylistic/brace-style": [ "error", "stroustrup", { allowSingleLine: true } ],
63
63
  "@stylistic/quotes": [ "error", "double" ],
64
64
 
65
- "@stylistic/no-multi-spaces": "off",
66
65
  "@stylistic/no-multi-spaces": "off",
67
66
  "@stylistic/no-multiple-empty-lines": "off",
68
67
  "@stylistic/key-spacing": "off",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "outDir": "../dst",
3
+ "outDir": "../dst",
4
4
  "target": "ESNext",
5
5
  "module": "ESNext",
6
6
  "moduleResolution": "Bundler",
@@ -21,8 +21,8 @@
21
21
  },
22
22
  "include": [
23
23
  "../src/**/*.d.ts",
24
- "../src/**/*.ts",
25
- "../src/**/*.vue"
24
+ "../src/**/*.ts",
25
+ "../src/**/*.vue"
26
26
  ],
27
27
  "references": [
28
28
  { "path": "./tsc.node.json" }
@@ -1,5 +1,5 @@
1
1
  {
2
- "private": "true",
2
+ "private": true,
3
3
  "name": "speechflow-ui-db",
4
4
  "description": "SpeechFlow User Interface (Dashboard)",
5
5
  "keywords": [ "speechflow" ],
@@ -14,19 +14,20 @@
14
14
  "url": "http://engelschall.com"
15
15
  },
16
16
  "dependencies": {
17
- "vue": "3.5.18",
17
+ "vue": "3.5.20",
18
18
  "moment": "2.30.1",
19
19
  "@opensumi/reconnecting-websocket": "4.4.0",
20
20
  "axios": "1.11.0",
21
21
  "typopro-web": "4.2.7",
22
22
  "@fortawesome/fontawesome-free": "7.0.0",
23
23
  "patch-package": "8.0.0",
24
- "@rse/stx": "1.0.7"
24
+ "@rse/stx": "1.0.9"
25
25
  },
26
26
  "devDependencies": {
27
- "vite": "7.0.6",
28
- "@typescript-eslint/eslint-plugin": "8.39.0",
29
- "@typescript-eslint/parser": "8.39.0",
27
+ "vite": "7.1.3",
28
+ "typescript-eslint": "8.41.0",
29
+ "@typescript-eslint/eslint-plugin": "8.41.0",
30
+ "@typescript-eslint/parser": "8.41.0",
30
31
  "@vitejs/plugin-vue": "6.0.1",
31
32
  "@rollup/plugin-yaml": "4.1.2",
32
33
  "vite-plugin-node-polyfills": "0.24.0",
@@ -36,8 +37,8 @@
36
37
 
37
38
  "@vue/eslint-config-typescript": "14.6.0",
38
39
  "vue-eslint-parser": "10.2.0",
39
- "eslint": "9.32.0",
40
- "@eslint/js": "9.32.0",
40
+ "eslint": "9.34.0",
41
+ "@eslint/js": "9.34.0",
41
42
  "neostandard": "0.12.2",
42
43
  "eslint-plugin-import": "2.32.0",
43
44
  "eslint-plugin-vue": "10.4.0",
@@ -47,7 +48,7 @@
47
48
 
48
49
  "nodemon": "3.1.10",
49
50
  "shx": "0.4.0",
50
- "stylelint": "16.23.0",
51
+ "stylelint": "16.23.1",
51
52
  "stylelint-config-html": "1.1.0",
52
53
  "stylelint-config-recommended-vue": "1.6.1",
53
54
  "stylelint-config-standard": "39.0.0",
@@ -56,7 +57,7 @@
56
57
  "postcss-html": "1.8.0",
57
58
  "stylus": "0.64.0",
58
59
  "typescript": "5.9.2",
59
- "vue-tsc": "3.0.5",
60
+ "vue-tsc": "3.0.6",
60
61
  "delay-cli": "2.0.0",
61
62
  "cross-env": "10.0.0",
62
63
  "serve": "14.2.4"
@@ -10,31 +10,30 @@
10
10
  <div class="app">
11
11
  <div class="dashboard">
12
12
  <div v-bind:key="block.id" v-for="block of info" class="block">
13
- <div v-if="block.type === 'audio'" class="audio-col">
14
- <div class="audio-meter" v-bind:style="{
15
- height: (100 * (1 - ((block.value as number) / - 60.0))) + '%'
16
- }">
17
- <div class="audio-value">
18
- {{ (block.value as number).toFixed(1) }}
19
- <div class="audio-unit">LUFS-S</div>
13
+ <div class="block-content">
14
+ <div v-if="block.type === 'audio'" class="audio-col">
15
+ <div class="audio-meter" v-bind:style="{
16
+ height: (100 * (1 - ((block.value as number) / - 60.0))) + '%'
17
+ }">
18
+ <div class="audio-value">
19
+ {{ (block.value as number).toFixed(1) }}
20
+ <div class="audio-unit">LUFS-S</div>
21
+ </div>
20
22
  </div>
21
23
  </div>
22
- <div class="audio-name">
23
- {{ block.name }}
24
+ <div ref="textCol"
25
+ v-if="block.type === 'text'"
26
+ class="text-col"
27
+ v-bind:class="{ intermediate: block.lastKind === 'intermediate' }">
28
+ <div v-bind:key="value"
29
+ v-for="value of block.value"
30
+ class="text-value">
31
+ {{ value as string }}
32
+ </div>
24
33
  </div>
25
34
  </div>
26
- <div ref="textCol"
27
- v-if="block.type === 'text'"
28
- class="text-col"
29
- v-bind:class="{ intermediate: block.lastKind === 'intermediate' }">
30
- <div v-bind:key="value"
31
- v-for="value of block.value"
32
- class="text-value">
33
- {{ value as unknown as string }}
34
- </div>
35
- <div class="text-name">
36
- {{ block.name }}
37
- </div>
35
+ <div class="block-name">
36
+ {{ block.name }}
38
37
  </div>
39
38
  </div>
40
39
  </div>
@@ -62,6 +61,9 @@
62
61
  .block
63
62
  height: calc(100% - 0.5vw)
64
63
  margin-right: 0.5vw
64
+ flex-direction: column
65
+ align-items: flex-end
66
+ justify-content: flex-end
65
67
  &:last-child
66
68
  margin-right: 0
67
69
  &:has(.audio-col)
@@ -70,64 +72,66 @@
70
72
  flex-grow: 1
71
73
  flex-shrink: 1
72
74
  flex-basis: 0
73
- .audio-col
74
- width: 10vw
75
- height: 100%
76
- display: flex
77
- flex-direction: column
78
- align-items: flex-end
79
- justify-content: flex-end
80
- background-color: var(--color-acc-bg-3)
81
- .audio-meter
82
- width: 100%
75
+ .block-name
76
+ width: 100%
77
+ height: 2.5vw
78
+ text-align: center
79
+ background-color: var(--color-std-bg-3)
80
+ color: var(--color-std-fg-3)
81
+ font-size: 1.5vw
82
+ margin-top: 0.5vw
83
+ border-radius: 0.5vw
84
+ .block-content
85
+ background-color: var(--color-std-bg-3)
86
+ height: calc(100% - 3.0vw)
87
+ border-radius: 0.5vw
88
+ overflow: hidden
89
+ .audio-col
90
+ width: 10vw
91
+ height: 100%
83
92
  display: flex
84
93
  flex-direction: column
85
94
  align-items: flex-end
86
95
  justify-content: flex-end
87
- background-color: var(--color-acc-fg-3)
88
- .audio-value
96
+ background-color: var(--color-std-bg-3)
97
+ .audio-meter
89
98
  width: 100%
90
- font-size: 2.5vw
91
- text-align: center
92
- color: var(--color-std-bg-0)
93
- .audio-unit
94
- font-size: 1.5vw
95
- margin-top: -0.5vw
96
- margin-bottom: 0.5vw
97
- .audio-name
98
- width: 100%
99
- text-align: center
100
- background-color: var(--color-acc-bg-1)
101
- color: var(--color-acc-fg-3)
102
- font-size: 2vw
103
- .text-col
104
- width: 100%
105
- height: 100%
106
- overflow-x: hidden
107
- overflow-y: scroll
108
- display: flex
109
- flex-direction: column
110
- align-items: flex-end
111
- justify-content: flex-end
112
- .text-value
113
- width: calc(100% - 2 * 1.0vw)
114
- background-color: var(--color-acc-bg-3)
115
- color: var(--color-acc-fg-3)
116
- border-radius: 0.5vw
117
- font-size: 1.5vw
118
- padding: 0.5vw 1.0vw
119
- margin-bottom: 0.5vw
120
- overflow-wrap: break-word
121
- .text-name
99
+ display: flex
100
+ flex-direction: column
101
+ align-items: flex-end
102
+ justify-content: flex-end
103
+ background-color: var(--color-acc-bg-5)
104
+ .audio-value
105
+ width: 100%
106
+ font-size: 2.5vw
107
+ text-align: center
108
+ color: var(--color-std-fg-5)
109
+ .audio-unit
110
+ font-size: 1.5vw
111
+ margin-top: -0.5vw
112
+ margin-bottom: 0.5vw
113
+ .text-col
122
114
  width: 100%
123
- text-align: center
124
- background-color: var(--color-acc-bg-1)
125
- color: var(--color-acc-fg-3)
126
- font-size: 2vw
127
- .text-col.intermediate
128
- .text-value:nth-last-child(2)
129
- background-color: var(--color-sig-bg-3)
130
- color: var(--color-sig-fg-3)
115
+ height: 100%
116
+ overflow-x: hidden
117
+ overflow-y: scroll
118
+ display: flex
119
+ flex-direction: column
120
+ align-items: flex-end
121
+ justify-content: flex-end
122
+ .text-value
123
+ width: calc(100% - 2 * 1.0vw)
124
+ background-color: var(--color-acc-bg-3)
125
+ color: var(--color-acc-fg-5)
126
+ border-radius: 0.5vw
127
+ font-size: 1.5vw
128
+ padding: 0.5vw 1.0vw
129
+ margin-top: 0.5vw
130
+ overflow-wrap: break-word
131
+ .text-col.intermediate
132
+ .text-value:last-child
133
+ background-color: var(--color-sig-bg-3)
134
+ color: var(--color-sig-fg-5)
131
135
  </style>
132
136
 
133
137
  <script setup lang="ts">
@@ -150,7 +154,8 @@ export default defineComponent({
150
154
  components: {
151
155
  },
152
156
  data: () => ({
153
- info: [] as Info[]
157
+ info: [] as Info[],
158
+ ws: null as ReconnectingWebSocket | null
154
159
  }),
155
160
  created () {
156
161
  },
@@ -171,17 +176,24 @@ export default defineComponent({
171
176
  }
172
177
 
173
178
  /* connect to WebSocket API for receiving dashboard information */
174
- const ws = new ReconnectingWebSocket(url, [], {
179
+ this.ws = new ReconnectingWebSocket(url, [], {
175
180
  reconnectionDelayGrowFactor: 1.3,
176
181
  maxReconnectionDelay: 4000,
177
182
  minReconnectionDelay: 1000,
178
183
  connectionTimeout: 4000,
179
184
  minUptime: 5000
180
185
  })
181
- ws.addEventListener("open", (ev) => {
186
+ this.ws.addEventListener("open", (ev) => {
182
187
  })
183
- ws.addEventListener("message", (ev) => {
184
- const event = JSON.parse(ev.data)
188
+ this.ws.addEventListener("message", (ev) => {
189
+ let event
190
+ try {
191
+ event = JSON.parse(ev.data)
192
+ }
193
+ catch (error) {
194
+ this.log("ERROR", "Failed to parse WebSocket message", { error, data: ev.data })
195
+ return
196
+ }
185
197
  if (event.response !== "DASHBOARD")
186
198
  return
187
199
  const [ type, id, kind, value ] = event.args
@@ -211,6 +223,12 @@ export default defineComponent({
211
223
  }
212
224
  })
213
225
  },
226
+ beforeUnmount () {
227
+ if (this.ws) {
228
+ this.ws.close()
229
+ this.ws = null
230
+ }
231
+ },
214
232
  methods: {
215
233
  log (level: string, msg: string, data: { [ key: string ]: any } | null = null) {
216
234
  const timestamp = moment().format("YYYY-MM-DD hh:mm:ss.SSS")