+ const connect = () => {
+ if (!cache.ideServer) {
+ cache.ideServer = true;
+
+ return ide.connect(psModule)
+ .then(ideServer => {
+ cache.ideServer = ideServer;
+ return psModule;
+ })
+ .then(ide.loadWithRetry)
+ .catch(error => {
+ if (cache.ideServer.kill) {
+ debug('ide failed to initially load modules, stopping the ide server process');
+
+ cache.ideServer.kill();
+ }
+
+ cache.ideServer = null;
+
+ return Promise.reject(error);
+ })
+ ;
+ }
+ else {
+ return Promise.resolve(psModule);
+ }
+ };
+
+ const rebuild = () =>
+ ide.rebuild(psModule).catch(error => {
+ if (error instanceof ide.UnknownModuleError) {
+ if (!cache.compilationStarted) {
+ cache.compilationStarted = true;
+
+ return compile(psModule)
+ .then(() => {
+ cache.compilationFinished = true;
+ })
+ .then(() =>
+ PsModuleMap.makeMap(options.src).then(map => {
+ debug('rebuilt module map after unknown module forced a recompilation');
+
+ cache.psModuleMap = map;
+ })
+ )
+ .then(() => ide.load(psModule))
+ .then(() => psModule)
+ ;
+ }
+ else {
+ return Promise.resolve(psModule);
+ }
+ }
+ else {
+ debug('ide rebuild failed due to an unhandled error: %o', error);
+
+ return Promise.reject(error);
+ }
+ })
+ ;
+
+ connect()
+ .then(rebuild)