Skip to content

Commit 22d91c5

Browse files
committed
fix(devtools): show error status's
1 parent 30abad4 commit 22d91c5

File tree

2 files changed

+58
-24
lines changed

2 files changed

+58
-24
lines changed

client/app.vue

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
<script lang="ts" setup>
22
import { onDevtoolsClientConnected } from '@nuxt/devtools-kit/iframe-client'
33
import { registry } from '../src/registry'
4-
import { devtools, getScriptSize, humanFriendlyTimestamp, reactive, ref, urlToOrigin } from '#imports'
4+
import { devtools, fetchScript, humanFriendlyTimestamp, reactive, ref, urlToOrigin } from '#imports'
55
import { msToHumanReadable } from '~/utils/formatting'
66
77
const scriptRegistry = await registry()
88
99
const scripts = ref({})
1010
const scriptSizes = reactive<Record<string, string>>({})
11+
const scriptErrors = reactive<Record<string, string>>({})
1112
1213
function syncScripts(_scripts: any[]) {
1314
// augment the scripts with registry
@@ -26,13 +27,17 @@ function syncScripts(_scripts: any[]) {
2627
}
2728
const scriptSizeKey = script.src
2829
if (!scriptSizes[scriptSizeKey]) {
29-
getScriptSize(script.src).then((size) => {
30-
scriptSizes[scriptSizeKey] = size
31-
script.size = size
32-
}).catch(() => {
33-
script.size = ''
34-
scriptSizes[scriptSizeKey] = ''
35-
})
30+
fetchScript(script.src)
31+
.then((res) => {
32+
if (res.size) {
33+
scriptSizes[scriptSizeKey] = res.size
34+
script.size = res.size
35+
}
36+
if (res.error) {
37+
scriptErrors[scriptSizeKey] = res.error
38+
script.error = res.error
39+
}
40+
})
3641
}
3742
return [key, script]
3843
}),
@@ -192,7 +197,12 @@ function viewDocs(docs: string) {
192197
Status
193198
</div>
194199
<div class="capitalize">
195-
{{ script.$script.status.value }}
200+
<div v-if="scriptErrors[script.src]">
201+
{{ scriptErrors[script.src] === 'TypeError: Failed to fetch' ? 'CORS Error' : scriptErrors[script.src] }}
202+
</div>
203+
<div v-else>
204+
{{ script.$script.status }}
205+
</div>
196206
</div>
197207
</div>
198208
<div v-if="scriptSizes[script.src]">

client/utils/fetch.ts

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,48 @@
1-
export async function getScriptSize(url: string) {
2-
const compressedResponse = await fetch(url, { headers: { 'Accept-Encoding': 'gzip' } })
3-
return bytesToSize(await getResponseSize(compressedResponse))
1+
export async function fetchScript(url: string) {
2+
const compressedResponse = await fetch(url, { headers: { 'Accept-Encoding': 'gzip' } }).catch((err) => {
3+
return {
4+
size: null,
5+
error: err,
6+
}
7+
})
8+
if (compressedResponse?.error) {
9+
return compressedResponse as { size: null, error: Error }
10+
}
11+
if (!compressedResponse.ok) {
12+
return {
13+
size: null,
14+
error: new Error(`Failed to fetch ${compressedResponse.status} ${compressedResponse.statusText}`),
15+
}
16+
}
17+
const size = await getResponseSize(compressedResponse)
18+
if (!size) {
19+
return {
20+
size: null,
21+
}
22+
}
23+
return {
24+
size: bytesToSize(size),
25+
}
426
}
527

6-
async function getResponseSize(response) {
7-
const reader = response.body.getReader()
8-
const contentLength = +response.headers.get('Content-Length')
28+
async function getResponseSize(response: Response) {
29+
const reader = response.body?.getReader()
30+
const contentLength = response.headers.get('Content-Length')
931

1032
if (contentLength) {
11-
return contentLength
33+
return Number(contentLength)
1234
}
13-
else {
14-
let total = 0
15-
while (true) {
16-
const { done, value } = await reader.read()
17-
if (done)
18-
return total
19-
total += value.length
20-
}
35+
if (!reader) {
36+
return null
37+
}
38+
let total = 0
39+
let done = false
40+
while (!done) {
41+
const data = await reader.read()
42+
done = data.done
43+
total += data.value?.length || 0
2144
}
45+
return total > 0 ? total : null
2246
}
2347

2448
function bytesToSize(bytes: number) {

0 commit comments

Comments
 (0)