Skip to content

Commit 8490851

Browse files
committed
fix: update
1 parent 290b51a commit 8490851

1 file changed

Lines changed: 39 additions & 63 deletions

File tree

packages/core/src/client/webcomponents/state/logs-client.ts

Lines changed: 39 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,37 @@
1-
import type { DevToolsLogEntry, DevToolsLogEntryInput, DevToolsLogHandle, DevToolsLogsClient } from '@vitejs/devtools-kit'
1+
import type { DevToolsLogEntryInput, DevToolsLogHandle, DevToolsLogsClient } from '@vitejs/devtools-kit'
22
import type { DevToolsRpcClient } from '@vitejs/devtools-kit/client'
33

4-
function createRpcHandle(rpc: DevToolsRpcClient, initialEntry: DevToolsLogEntry): DevToolsLogHandle {
5-
let entry = initialEntry
6-
return {
7-
get entry() { return entry },
8-
get id() { return entry.id },
9-
async update(patch: Partial<DevToolsLogEntryInput>) {
10-
const updated = await rpc.call('devtoolskit:internal:logs:update', entry.id, patch)
11-
if (updated)
12-
entry = updated
13-
return updated ?? undefined
14-
},
15-
async dismiss() {
16-
await rpc.call('devtoolskit:internal:logs:remove', entry.id)
17-
},
18-
}
19-
}
20-
214
export function createClientLogsClient(rpc: DevToolsRpcClient): DevToolsLogsClient {
225
const buffer: (() => Promise<void>)[] = []
23-
let flushing = false
6+
let flushing: Promise<void> | undefined
247

258
async function flush() {
26-
if (flushing)
9+
if (rpc.isTrusted !== true)
2710
return
28-
flushing = true
29-
while (buffer.length > 0) {
30-
const op = buffer.shift()!
31-
await op()
11+
if (flushing === undefined) {
12+
// eslint-disable-next-line no-async-promise-executor
13+
flushing = new Promise(async (resolve) => {
14+
while (buffer.length > 0) {
15+
const op = buffer.shift()!
16+
await op()
17+
}
18+
resolve()
19+
})
3220
}
33-
flushing = false
21+
return flushing
3422
}
3523

36-
function enqueue(op: () => Promise<void>): Promise<void> {
24+
async function enqueue<T>(op: () => Promise<T>): Promise<T> {
25+
if (rpc.isTrusted === true && buffer.length !== 0)
26+
await flush()
27+
3728
if (rpc.isTrusted === true && buffer.length === 0)
38-
return op()
39-
return new Promise<void>((resolve) => {
29+
return await op()
30+
31+
return new Promise<T>((resolve) => {
4032
buffer.push(async () => {
41-
await op()
42-
resolve()
33+
const result = await op()
34+
resolve(result)
4335
})
4436
})
4537
}
@@ -50,44 +42,28 @@ export function createClientLogsClient(rpc: DevToolsRpcClient): DevToolsLogsClie
5042
})
5143

5244
return {
53-
async add(input: DevToolsLogEntryInput): Promise<DevToolsLogHandle> {
54-
if (rpc.isTrusted === true && buffer.length === 0) {
55-
const entry = await rpc.call('devtoolskit:internal:logs:add', input)
56-
return createRpcHandle(rpc, entry)
57-
}
58-
59-
// Deferred handle: resolves once the buffered add flushes
60-
let resolved: DevToolsLogHandle | undefined
61-
const ready = new Promise<DevToolsLogHandle>(resolve => buffer.push(async () => {
62-
const entry = await rpc.call('devtoolskit:internal:logs:add', input)
63-
resolved = createRpcHandle(rpc, entry)
64-
resolve(resolved)
65-
}))
66-
67-
const placeholder: DevToolsLogEntry = {
68-
...input,
69-
id: input.id ?? `pending-${Date.now()}-${Math.random().toString(36).slice(2)}`,
70-
from: 'browser',
71-
timestamp: input.timestamp ?? Date.now(),
72-
}
73-
74-
return {
75-
get entry() { return resolved?.entry ?? placeholder },
76-
get id() { return resolved?.id ?? placeholder.id },
77-
update: patch => resolved ? resolved.update(patch) : ready.then(h => h.update(patch)),
78-
dismiss: () => resolved ? resolved.dismiss() : ready.then(h => h.dismiss()),
79-
}
45+
add(input: DevToolsLogEntryInput): Promise<DevToolsLogHandle> {
46+
return enqueue(async () => {
47+
let entry = await rpc.call('devtoolskit:internal:logs:add', input)
48+
return {
49+
get entry() { return entry },
50+
get id() { return entry.id },
51+
async update(patch: Partial<DevToolsLogEntryInput>) {
52+
const updated = await rpc.call('devtoolskit:internal:logs:update', entry.id, patch)
53+
if (updated)
54+
entry = updated
55+
return updated ?? undefined
56+
},
57+
async dismiss() {
58+
await rpc.call('devtoolskit:internal:logs:remove', entry.id)
59+
},
60+
}
61+
})
8062
},
81-
8263
remove(id: string): Promise<void> {
8364
return enqueue(() => rpc.call('devtoolskit:internal:logs:remove', id))
8465
},
85-
8666
clear(): Promise<void> {
87-
if (rpc.isTrusted === true && buffer.length === 0)
88-
return rpc.call('devtoolskit:internal:logs:clear')
89-
// Discard preceding buffered operations — they'd be cleared anyway
90-
buffer.length = 0
9167
return enqueue(() => rpc.call('devtoolskit:internal:logs:clear'))
9268
},
9369
}

0 commit comments

Comments
 (0)