|
1 |
| -import * as net from 'net'; |
2 | 1 | import * as fs from 'fs';
|
| 2 | +import type * as net from 'net'; |
| 3 | +import * as path from 'path'; |
3 | 4 | import type * as ts from 'typescript';
|
4 | 5 | import type { Request } from './server';
|
5 |
| -import type { PipeTable } from './utils'; |
6 |
| -import { pipeTable } from './utils'; |
| 6 | +import type { NamedPipeServer } from './utils'; |
| 7 | +import { connect, pipeTable } from './utils'; |
7 | 8 |
|
8 | 9 | export function collectExtractProps(
|
9 | 10 | ...args: Parameters<typeof import('./requests/collectExtractProps.js')['collectExtractProps']>
|
@@ -80,58 +81,51 @@ export function getElementAttrs(
|
80 | 81 | }
|
81 | 82 |
|
82 | 83 | async function sendRequest<T>(request: Request) {
|
83 |
| - const pipeFile = await getPipeFile(request.args[0]); |
84 |
| - if (!pipeFile) { |
85 |
| - console.error('[Vue Named Pipe Client] pipeFile not found'); |
| 84 | + const client = await connectForFile(request.args[0]); |
| 85 | + if (!client) { |
| 86 | + console.warn('[Vue Named Pipe Client] No server found for', request.args[0]); |
86 | 87 | return;
|
87 | 88 | }
|
88 |
| - return await _sendRequest<T>(request, pipeFile); |
| 89 | + const result = await sendRequestWorker<T>(request, client); |
| 90 | + client.end(); |
| 91 | + return result; |
89 | 92 | }
|
90 | 93 |
|
91 |
| -async function getPipeFile(fileName: string) { |
92 |
| - if (fs.existsSync(pipeTable)) { |
93 |
| - const table: PipeTable = JSON.parse(fs.readFileSync(pipeTable, 'utf8')); |
94 |
| - const all = Object.values(table); |
95 |
| - const configuredServers = all |
96 |
| - .filter(item => item.serverKind === 1 satisfies ts.server.ProjectKind.Configured) |
97 |
| - .sort((a, b) => Math.abs(process.pid - a.pid) - Math.abs(process.pid - b.pid)); |
98 |
| - const inferredServers = all |
99 |
| - .filter(item => item.serverKind === 0 satisfies ts.server.ProjectKind.Inferred) |
100 |
| - .sort((a, b) => Math.abs(process.pid - a.pid) - Math.abs(process.pid - b.pid)); |
101 |
| - for (const server of configuredServers) { |
102 |
| - const response = await _sendRequest<boolean>({ type: 'containsFile', args: [fileName] }, server.pipeFile); |
| 94 | +async function connectForFile(fileName: string) { |
| 95 | + if (!fs.existsSync(pipeTable)) { |
| 96 | + return; |
| 97 | + } |
| 98 | + const servers: NamedPipeServer[] = JSON.parse(fs.readFileSync(pipeTable, 'utf8')); |
| 99 | + const configuredServers = servers |
| 100 | + .filter(item => item.serverKind === 1 satisfies ts.server.ProjectKind.Configured); |
| 101 | + const inferredServers = servers |
| 102 | + .filter(item => item.serverKind === 0 satisfies ts.server.ProjectKind.Inferred) |
| 103 | + .sort((a, b) => b.currentDirectory.length - a.currentDirectory.length); |
| 104 | + for (const server of configuredServers) { |
| 105 | + const client = await connect(server.path); |
| 106 | + if (client) { |
| 107 | + const response = await sendRequestWorker<boolean>({ type: 'containsFile', args: [fileName] }, client); |
103 | 108 | if (response) {
|
104 |
| - return server.pipeFile; |
| 109 | + return client; |
105 | 110 | }
|
106 | 111 | }
|
107 |
| - for (const server of inferredServers) { |
108 |
| - const response = await _sendRequest<boolean>({ type: 'containsFile', args: [fileName] }, server.pipeFile); |
109 |
| - if (typeof response === 'boolean') { |
110 |
| - return server.pipeFile; |
| 112 | + } |
| 113 | + for (const server of inferredServers) { |
| 114 | + if (!path.relative(server.currentDirectory, fileName).startsWith('..')) { |
| 115 | + const client = await connect(server.path); |
| 116 | + if (client) { |
| 117 | + return client; |
111 | 118 | }
|
112 | 119 | }
|
113 | 120 | }
|
114 | 121 | }
|
115 | 122 |
|
116 |
| -function _sendRequest<T>(request: Request, pipeFile: string) { |
| 123 | +function sendRequestWorker<T>(request: Request, client: net.Socket) { |
117 | 124 | return new Promise<T | undefined | null>(resolve => {
|
118 |
| - try { |
119 |
| - const client = net.connect(pipeFile); |
120 |
| - client.on('connect', () => { |
121 |
| - client.write(JSON.stringify(request)); |
122 |
| - }); |
123 |
| - client.on('data', data => { |
124 |
| - const text = data.toString(); |
125 |
| - resolve(JSON.parse(text)); |
126 |
| - client.end(); |
127 |
| - }); |
128 |
| - client.on('error', err => { |
129 |
| - console.error('[Vue Named Pipe Client]', err); |
130 |
| - return resolve(undefined); |
131 |
| - }); |
132 |
| - } catch (e) { |
133 |
| - console.error('[Vue Named Pipe Client]', e); |
134 |
| - return resolve(undefined); |
135 |
| - } |
| 125 | + client.once('data', data => { |
| 126 | + const text = data.toString(); |
| 127 | + resolve(JSON.parse(text)); |
| 128 | + }); |
| 129 | + client.write(JSON.stringify(request)); |
136 | 130 | });
|
137 | 131 | }
|
0 commit comments