(options: net.ListenOptions)
| 230 | } |
| 231 | |
| 232 | function startDebugServer(options: net.ListenOptions) { |
| 233 | const services = createGlobalContainer({ storagePath, isVsCode: false }); |
| 234 | const managers = new Set<DapSessionManager>(); |
| 235 | |
| 236 | const server = net |
| 237 | .createServer(async socket => { |
| 238 | try { |
| 239 | const logger = new ProxyLogger(); |
| 240 | const transport = new StreamDapTransport(socket, socket, logger); |
| 241 | const connection = new DapConnection(transport, logger); |
| 242 | const dap = connection.dap(); |
| 243 | |
| 244 | const initialized = await collectInitialize(dap); |
| 245 | if ('__pendingTargetId' in initialized.launchParams) { |
| 246 | const ptId = initialized.launchParams.__pendingTargetId; |
| 247 | const manager = ptId && [...managers].find(m => m.hasPendingTarget(ptId)); |
| 248 | if (!manager) { |
| 249 | throw new Error(`Cannot find pending target for ${ptId}`); |
| 250 | } |
| 251 | logger.connectTo(manager.services.get(ILogger)); |
| 252 | manager.handleConnection({ ...initialized, connection }); |
| 253 | } else { |
| 254 | const sessionServices = createTopLevelSessionContainer(services); |
| 255 | const manager = new DapSessionManager(dap, sessionServices); |
| 256 | managers.add(manager); |
| 257 | sessionServices.bind(IInitializeParams).toConstantValue(initialized.initializeParams); |
| 258 | logger.connectTo(sessionServices.get(ILogger)); |
| 259 | const binder = new Binder( |
| 260 | manager, |
| 261 | connection, |
| 262 | sessionServices, |
| 263 | new TargetOrigin('targetOrigin'), |
| 264 | ); |
| 265 | transport.closed(() => { |
| 266 | binder.dispose(); |
| 267 | managers.delete(manager); |
| 268 | }); |
| 269 | initialized.deferred.resolve(await binder.boot(initialized.launchParams, dap)); |
| 270 | } |
| 271 | } catch (e) { |
| 272 | console.error(e); |
| 273 | return socket.destroy(); |
| 274 | } |
| 275 | }) |
| 276 | .on('error', err => { |
| 277 | console.error(err); |
| 278 | process.exit(1); |
| 279 | }) |
| 280 | .listen(options, () => { |
| 281 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion |
| 282 | const addr = server.address()!; |
| 283 | console.log( |
| 284 | `Debug server listening at ${ |
| 285 | typeof addr === 'string' ? addr : `${addr.address}:${addr.port}` |
| 286 | }`, |
| 287 | ); |
| 288 | }); |
| 289 | } |
no test coverage detected