mirror of https://github.com/pulumi/pulumi.git
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
// Copyright 2016-2018, Pulumi Corporation.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
// Module that hooks into v8 and provides information about it to interested parties. Because this
|
|
// hooks into v8 events it is critical that this module is loaded early when the process starts.
|
|
// Otherwise, information may not be known when needed. This module is only intended for use on
|
|
// Node v11 and higher.
|
|
|
|
import * as v8 from "v8";
|
|
v8.setFlagsFromString("--allow-natives-syntax");
|
|
|
|
let session: Promise<import("inspector").Session | undefined> | undefined = undefined;
|
|
|
|
function getSession() {
|
|
if (session !== undefined) {
|
|
return session;
|
|
}
|
|
session = createInspectorSessionAsync();
|
|
return session;
|
|
}
|
|
|
|
const scriptIdToUrlMap = new Map<string, string>();
|
|
|
|
async function createInspectorSessionAsync(): Promise<import("inspector").Session> {
|
|
// Delay loading 'inspector' as it is not available on early versions of node, so we can't
|
|
// require it on the outside.
|
|
const inspector = await import("inspector");
|
|
const inspectorSession = new inspector.Session();
|
|
inspectorSession.connect();
|
|
|
|
// Enable debugging support so we can hear about the Debugger.scriptParsed event. We need that
|
|
// event to know how to map from scriptId's to file-urls.
|
|
await new Promise<import("inspector").Debugger.EnableReturnType>((resolve, reject) => {
|
|
inspectorSession.post("Debugger.enable", (err, res) => (err ? reject(err) : resolve(res)));
|
|
});
|
|
|
|
inspectorSession.addListener("Debugger.scriptParsed", (event) => {
|
|
const { scriptId, url } = event.params;
|
|
scriptIdToUrlMap.set(scriptId, url);
|
|
});
|
|
|
|
return inspectorSession;
|
|
}
|
|
|
|
/**
|
|
* Returns the inspector session that can be used to query the state of this
|
|
* running Node instance. Must only be called on Node11 and above. On Node10 and
|
|
* below, this will throw.
|
|
*
|
|
* @internal
|
|
*/
|
|
export async function getSessionAsync() {
|
|
return getSession();
|
|
}
|
|
|
|
/**
|
|
* Returns a promise that can be used to determine when the v8hooks have been
|
|
* injected properly and code that depends on them can continue executing.
|
|
*
|
|
* @internal
|
|
*/
|
|
export async function isInitializedAsync() {
|
|
await getSession();
|
|
}
|
|
|
|
/**
|
|
* Maps from a script-id to the local file url it corresponds to.
|
|
*
|
|
* @internal
|
|
*/
|
|
export function getScriptUrl(id: import("inspector").Runtime.ScriptId) {
|
|
return scriptIdToUrlMap.get(id);
|
|
}
|