in src/debugger.js [92:185]
async start() {
this.agentMgr = new AgentMgr(this.argv, this.wsk, this.actionName);
this.watcher = new Watcher(this.argv, this.wsk);
// get the action metadata
this.actionMetadata = await this.agentMgr.peekAction();
log.debug("fetched action metadata from openwhisk");
this.wskProps.namespace = getNamespaceFromActionMetadata(this.actionMetadata);
const h = log.highlightColor;
log.step("Debugging " + h(`/${this.wskProps.namespace}/${this.actionName}`) + " on " + h(this.wskProps.apihost));
// local debug container
this.invoker = new OpenWhiskInvoker(this.actionName, this.actionMetadata, this.argv, this.wskProps, this.wsk);
// quick fail for missing requirements such as docker not running
await this.invoker.checkIfDockerAvailable();
try {
// run build initially (would be required by starting container)
if (this.argv.onBuild) {
log.highlight("On build: ", this.argv.onBuild);
spawnSync(this.argv.onBuild, {shell: true, stdio: "inherit"});
}
await this.invoker.prepare();
// parallelize slower work using promises
// task 1 - start local container
const containerTask = (async () => {
const debug2 = log.newDebug();
// start container - get it up fast for VSCode to connect within its 10 seconds timeout
await this.invoker.startContainer(debug2);
debug2(`started container: ${this.invoker.name()}`);
})();
// task 2 - fetch action code from openwhisk
const openwhiskTask = (async () => {
const debug2 = log.newDebug();
const actionWithCode = await this.agentMgr.readActionWithCode();
debug2(`downloaded action code (${prettyBytes(actionWithCode.exec.code.length)})`);
return actionWithCode;
})();
// wait for both tasks 1 & 2
const results = await Promise.all([containerTask, openwhiskTask]);
const actionWithCode = results[1];
log.spinner('Installing agent');
// parallelize slower work using promises again
// task 3 - initialize local container with code
const initTask = (async () => {
const debug2 = log.newDebug();
// /init local container
await this.invoker.init(actionWithCode);
debug2("installed action on container");
})();
// task 4 - install agent in openwhisk
const agentTask = (async () => {
const debug2 = log.newDebug();
// setup agent in openwhisk
await this.agentMgr.installAgent(this.invoker, debug2);
})();
await Promise.all([initTask, agentTask]);
if (this.argv.onStart) {
log.highlight("On start: ", this.argv.onStart);
spawnSync(this.argv.onStart, {shell: true, stdio: "inherit"});
}
// start source watching (live reload) if requested
await this.watcher.start();
this.logDetails();
const abortMsg = log.isInteractive ? log.highlightColor(" Use CTRL+C to exit.") : "";
log.ready(`Ready for activations. Started in ${prettyMilliseconds(Date.now() - this.startTime)}.${abortMsg}`);
this.ready = true;
} catch (e) {
await this.shutdown();
throw e;
}
}