src/agent/v8/debugapi.ts
import consoleLogLevel = require('console-log-level');
import * as stackdriver from '../../types/stackdriver';
import {DebugAgentConfig} from '../config';
import {ScanStats} from '../io/scanner';
import {SourceMapper} from '../io/sourcemapper';
import * as utils from '../util/utils';
export interface DebugApi {
set(
breakpoint: stackdriver.Breakpoint,
cb: (err: Error | null) => void
): void;
clear(
breakpoint: stackdriver.Breakpoint,
cb: (err: Error | null) => void
): void;
wait(
breakpoint: stackdriver.Breakpoint,
callback: (err?: Error) => void
): void;
log(
breakpoint: stackdriver.Breakpoint,
print: (format: string, exps: string[]) => void,
shouldStop: () => boolean
): void;
disconnect(): void;
numBreakpoints_(): number;
numListeners_(): number;
}
interface DebugApiConstructor {
new (
logger: consoleLogLevel.Logger,
config: DebugAgentConfig,
jsFiles: ScanStats,
sourcemapper: SourceMapper
): DebugApi;
}
let debugApiConstructor: DebugApiConstructor;
export function willUseInspector(nodeVersion?: string) {
const version = nodeVersion != null ? nodeVersion : process.version;
return utils.satisfies(version, '>=10');
}
if (willUseInspector()) {
const inspectorapi = require('./inspector-debugapi');
debugApiConstructor = inspectorapi.InspectorDebugApi;
} else {
const v8debugapi = require('./legacy-debugapi');
debugApiConstructor = v8debugapi.V8DebugApi;
}
export const MODULE_WRAP_PREFIX_LENGTH = require('module')
.wrap('☃')
.indexOf('☃');
let singleton: DebugApi;
export function create(
logger: consoleLogLevel.Logger,
config: DebugAgentConfig,
jsFiles: ScanStats,
sourcemapper: SourceMapper
): DebugApi {
if (singleton && !config.forceNewAgent_) {
return singleton;
} else if (singleton) {
singleton.disconnect();
}
singleton = new debugApiConstructor(logger, config, jsFiles, sourcemapper);
return singleton;
}