1- import type { DevToolsLogEntry , DevToolsLogEntryInput , DevToolsLogHandle , DevToolsLogsClient } from '@vitejs/devtools-kit'
1+ import type { DevToolsLogEntryInput , DevToolsLogHandle , DevToolsLogsClient } from '@vitejs/devtools-kit'
22import 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-
214export 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