alm
Version:
The best IDE for TypeScript
340 lines (303 loc) • 16 kB
text/typescript
import * as sls from "../socketLib/socketLibServer";
import * as contract from "./socketContract";
import http = require("http");
import https = require("https");
import * as fsu from "../server/utils/fsu";
import * as flm from "../server/workers/fileListing/fileListingMaster";
import * as workingDir from "../server/disk/workingDir";
import { FileModel } from "../server/disk/fileModel";
import * as gitService from "../server/workers/external/gitService";
import * as npmService from "../server/workers/external/npmService";
import * as findAndReplaceMultiService from "../server/workers/external/findAndReplaceMultiService";
import * as configCreatorService from "../server/workers/external/configCreatorService";
import * as settings from "../server/disk/settings";
import * as serverDiskService from "../server/workers/external/serverDiskService";
import * as session from "../server/disk/session";
import * as utils from "../common/utils";
import { TypedEvent } from '../common/events';
import { onServerExit } from "./serverExit";
import * as bundlerMaster from '../server/workers/external/demoReact/bundler/bundlerMaster';
let resolve = sls.resolve;
import * as fmc from "../server/disk/fileModelCache";
import * as activeProjectConfig from "../server/disk/activeProjectConfig";
import { errorsCache } from "../server/globalErrorCacheServer";
import * as projectServiceMaster from "../server/workers/lang/projectServiceMaster";
import { testCache, working as testedWorking } from "../server/workers/tested/testedMaster";
import * as demoService from '../server/workers/external/demoService';
import * as demoReactService from '../server/workers/external/demoReact/bundler/bundlerMaster';
export const serverGotExplicitSaveCommand = new TypedEvent<{ filePath: string }>();
namespace Server {
export var echo: typeof contract.server.echo = (data, client) => {
console.log('Echo request received:', data);
return client.increment({ num: data.num }).then((res) => {
return {
text: data.text,
num: res.num
};
});
}
export var filePaths: typeof contract.server.filePaths = (data) => {
return flm.filePathsUpdated.current().then(res => ({ filePaths: res.filePaths, completed: res.completed, rootDir: res.rootDir }));
}
export var makeAbsolute: typeof contract.server.makeAbsolute = (data) => {
return Promise.resolve({ filePath: workingDir.makeAbsolute(data.relativeFilePath) });
}
/**
* File stuff
*/
export var openFile: typeof contract.server.openFile = (data) => {
let file = fmc.getOrCreateOpenFile(data.filePath, /*autoCreate*/ true);
return resolve({ contents: file.getContents(), saved: file.saved(), editorOptions: file.editorOptions });
}
export var closeFile: typeof contract.server.closeFile = (data) => {
fmc.closeOpenFile(data.filePath);
return resolve({});
}
export var editFile: typeof contract.server.editFile = (data) => {
let file = fmc.getOrCreateOpenFile(data.filePath);
let {saved} = file.edits(data.edits);
// console.log('-------------------------');
// console.log(file.getContents());
return resolve({ saved });
}
export var saveFile: typeof contract.server.saveFile = (data) => {
fmc.saveOpenFile(data.filePath);
serverGotExplicitSaveCommand.emit({ filePath: data.filePath });
return resolve({});
}
export var getFileStatus: typeof contract.server.getFileStatus = (data) => {
let file = fmc.getOrCreateOpenFile(data.filePath, /*autoCreate*/ true);
return resolve({ saved: file.saved() });
}
export var addFile: typeof contract.server.addFile = (data) => {
let file = fmc.getOrCreateOpenFile(data.filePath, /*autoCreate*/ true);
return resolve({ error: null });
}
export var addFolder: typeof contract.server.addFolder = (data) => {
let file = fmc.addFolder(data.filePath);
return resolve({ error: null });
}
export var deleteFromDisk: typeof contract.server.deleteFromDisk = (data) => {
let file = fmc.deleteFromDisk(data);
return resolve({ errors: [] });
}
export var duplicateFile: typeof contract.server.duplicateFile = (data) => {
let file = fmc.duplicateFile(data);
return resolve({ error: null });
}
export var duplicateDir: typeof contract.server.duplicateDir = (data) => {
return fmc.duplicateDir(data).then(error => {
return { error };
});
}
export var movePath: typeof contract.server.movePath = (data) => {
return fmc.movePath(data).then(error => {
return { error };
});
}
export var launchDirectory: typeof contract.server.launchDirectory = (data) => {
return fmc.launchDirectory(data);
}
export var launchTerminal: typeof contract.server.launchTerminal = (data) => {
return fmc.launchTerminal(data);
}
/**
* Config stuff
*/
export var availableProjects: typeof contract.server.availableProjects = (data) => {
return activeProjectConfig.availableProjects.current();
};
export var getActiveProjectConfigDetails: typeof contract.server.getActiveProjectConfigDetails = (data) => {
return activeProjectConfig.activeProjectConfigDetailsUpdated.current();
};
export var setActiveProjectConfigDetails: typeof contract.server.setActiveProjectConfigDetails = (data) => {
activeProjectConfig.syncCore(data);
return resolve({});
};
export var isFilePathInActiveProject: typeof contract.server.isFilePathInActiveProject = (data) => {
return activeProjectConfig.projectFilePathsUpdated.current().then(res => {
const inActiveProject = res.filePaths.some(fp => fp === data.filePath);
return { inActiveProject };
});
};
export var setOpenUITabs: typeof contract.server.setOpenUITabs = (data) => {
session.setOpenUITabs(data.sessionId, data.tabLayout, data.selectedTabId);
return resolve({});
};
export var getOpenUITabs: typeof contract.server.getOpenUITabs = (data) => {
const result = session.getOpenUITabs(data.sessionId);
return resolve(result);
};
export var activeProjectFilePaths: typeof contract.server.activeProjectFilePaths = (data) => {
return activeProjectConfig.projectFilePathsUpdated.current();
};
export var sync: typeof contract.server.sync = (data) => {
activeProjectConfig.sync();
return resolve({});
};
export var setSetting: typeof contract.server.setSetting = (data) => {
session.setSetting(data);
return resolve({});
};
export var getSetting: typeof contract.server.getSetting = (data) => {
return resolve(session.getSetting(data));
};
export var getValidSessionId: typeof contract.server.getValidSessionId = (data) => {
return resolve(session.getValidSessionId(data.sessionId));
};
/**
* Error handling
*/
export var getErrors: typeof contract.server.getErrors = (data) => {
return resolve(errorsCache.getErrors());
}
/**
* Tested
*/
export var getTestResults: typeof contract.server.getTestResults = (data) => {
return resolve(testCache.getResults());
}
/**
* Project service
*/
export var getCompletionsAtPosition: typeof contract.server.getCompletionsAtPosition = (query) => {
return projectServiceMaster.worker.getCompletionsAtPosition(query);
}
export var quickInfo: typeof contract.server.quickInfo = (query) => {
return projectServiceMaster.worker.quickInfo(query);
}
export var getCompletionEntryDetails: typeof contract.server.getCompletionEntryDetails = projectServiceMaster.worker.getCompletionEntryDetails;
export var getRenameInfo: typeof contract.server.getRenameInfo = projectServiceMaster.worker.getRenameInfo;
export var getDefinitionsAtPosition: typeof contract.server.getDefinitionsAtPosition = projectServiceMaster.worker.getDefinitionsAtPosition;
export var getDoctorInfo: typeof contract.server.getDoctorInfo = projectServiceMaster.worker.getDoctorInfo;
export var getReferences: typeof contract.server.getReferences = projectServiceMaster.worker.getReferences;
export var formatDocument: typeof contract.server.formatDocument = projectServiceMaster.worker.formatDocument;
export var formatDocumentRange: typeof contract.server.formatDocumentRange = projectServiceMaster.worker.formatDocumentRange;
export var getNavigateToItems: typeof contract.server.getNavigateToItems = projectServiceMaster.worker.getNavigateToItems;
export var getNavigateToItemsForFilePath: typeof contract.server.getNavigateToItemsForFilePath = projectServiceMaster.worker.getNavigateToItemsForFilePath;
export var getDependencies: typeof contract.server.getDependencies = projectServiceMaster.worker.getDependencies;
export var getAST: typeof contract.server.getAST = projectServiceMaster.worker.getAST;
export var getQuickFixes: typeof contract.server.getQuickFixes = projectServiceMaster.worker.getQuickFixes;
export var applyQuickFix: typeof contract.server.applyQuickFix = projectServiceMaster.worker.applyQuickFix;
export var build: typeof contract.server.build = projectServiceMaster.worker.build;
export var getSemanticTree: typeof contract.server.getSemanticTree = projectServiceMaster.worker.getSemanticTree;
export var getOccurrencesAtPosition: typeof contract.server.getOccurrencesAtPosition = projectServiceMaster.worker.getOccurrencesAtPosition;
export var getFormattingEditsAfterKeystroke: typeof contract.server.getFormattingEditsAfterKeystroke = projectServiceMaster.worker.getFormattingEditsAfterKeystroke;
export var removeUnusedImports: typeof contract.server.removeUnusedImports = projectServiceMaster.worker.removeUnusedImports;
/**
* Documentation browser
*/
export var getTopLevelModuleNames: typeof contract.server.getTopLevelModuleNames = projectServiceMaster.worker.getTopLevelModuleNames;
export var getUpdatedModuleInformation: typeof contract.server.getUpdatedModuleInformation = projectServiceMaster.worker.getUpdatedModuleInformation;
/** UML Diagram */
export var getUmlDiagramForFile: typeof contract.server.getUmlDiagramForFile = projectServiceMaster.worker.getUmlDiagramForFile;
/** tsFlow */
export var getFlowRoots: typeof contract.server.getFlowRoots = projectServiceMaster.worker.getFlowRoots;
/** live analysis */
export var getLiveAnalysis: typeof contract.server.getLiveAnalysis = projectServiceMaster.worker.getLiveAnalysis;
/**
* Output Status
*/
export const getCompleteOutputStatusCache: typeof contract.server.getCompleteOutputStatusCache =
(data) => {
return cast.completeOutputStatusCacheUpdated.current();
}
export const getLiveBuildResults: typeof contract.server.getLiveBuildResults =
(data) => {
return cast.liveBuildResults.current();
}
export const getJSOutputStatus: typeof contract.server.getJSOutputStatus = projectServiceMaster.worker.getJSOutputStatus;
/**
* Live demo
*/
export const enableLiveDemo = demoService.WorkerImplementation.enableLiveDemo;
export const disableLiveDemo = demoService.WorkerImplementation.disableLiveDemo;
export const enableLiveDemoReact = demoReactService.ExternalAPI.enableLiveDemo;
export const disableLiveDemoReact = demoReactService.ExternalAPI.disableLiveDemo;
/**
* Git service
*/
export var gitStatus: typeof contract.server.gitStatus = gitService.gitStatus;
export var gitReset: typeof contract.server.gitReset = gitService.gitReset;
export var gitDiff: typeof contract.server.gitDiff = gitService.gitDiff;
export var gitAddAllCommitAndPush: typeof contract.server.gitAddAllCommitAndPush = gitService.gitAddAllCommitAndPush;
export var gitFetchLatestAndRebase: typeof contract.server.gitFetchLatestAndRebase = gitService.gitFetchLatestAndRebase;
/**
* NPM service
*/
export var npmLatest: typeof contract.server.npmLatest = npmService.npmLatest;
/**
* FARM
*/
export var startFarming: typeof contract.server.startFarming = findAndReplaceMultiService.startFarming;
export var stopFarmingIfRunning: typeof contract.server.stopFarmingIfRunning = findAndReplaceMultiService.stopFarmingIfRunning;
export var farmResults: typeof contract.server.farmResults = (query: {}) => findAndReplaceMultiService.farmResultsUpdated.current();
/**
* Config creator
*/
export const createEditorconfig = configCreatorService.createEditorconfig;
/**
* Settings
*/
export const getSettingsFilePath: typeof contract.server.getSettingsFilePath = (query: {}) => Promise.resolve({ filePath: settings.getSettingsFilePath() });
/**
* Server Disk Service
*/
export const getDirItems: typeof contract.server.getDirItems = (query: { dirPath: string }) => Promise.resolve({ dirItems: serverDiskService.getDirItems(query.dirPath) });
}
// Ensure that the namespace follows the contract
var _checkTypes: typeof contract.server = Server;
/** Will be available after register is called */
export let cast = contract.cast;
/** launch server */
export function register(app: http.Server | https.Server) {
let runResult = sls.run({
app,
serverImplementation: Server,
clientContract: contract.client,
cast: contract.cast
});
cast = runResult.cast;
/** File model */
fmc.savedFileChangedOnDisk.pipe(cast.savedFileChangedOnDisk);
fmc.didEdits.pipe(cast.didEdits);
fmc.didStatusChange.pipe(cast.didStatusChange);
fmc.editorOptionsChanged.pipe(cast.editorOptionsChanged);
/** File listing updates */
flm.filePathsUpdated.pipe(cast.filePathsUpdated);
/** Active Project */
activeProjectConfig.availableProjects.pipe(cast.availableProjectsUpdated);
activeProjectConfig.activeProjectConfigDetailsUpdated.pipe(cast.activeProjectConfigDetailsUpdated);
activeProjectConfig.projectFilePathsUpdated.pipe(cast.activeProjectFilePathsUpdated);
activeProjectConfig.errorsInTsconfig.errorsDelta.on((delta) => errorsCache.applyDelta(delta));
/** Errors */
errorsCache.errorsDelta.pipe(cast.errorsDelta);
/** Tested */
testCache.testResultsDelta.pipe(cast.testResultsDelta);
testedWorking.pipe(cast.testedWorking);
/** FARM */
findAndReplaceMultiService.farmResultsUpdated.pipe(cast.farmResultsUpdated);
/** JS Output Status */
cast.liveBuildResults.emit({ builtCount: 0, totalCount: 0 }); // for initial joiners
cast.completeOutputStatusCacheUpdated.emit({}); // for initial joiners
projectServiceMaster.fileOutputStatusUpdated.pipe(cast.fileOutputStatusUpdated);
projectServiceMaster.completeOutputStatusCacheUpdated.pipe(cast.completeOutputStatusCacheUpdated);
projectServiceMaster.liveBuildResults.pipe(cast.liveBuildResults);
/** Live demo */
demoService.WorkerImplementation.liveDemoData.pipe(cast.liveDemoData);
bundlerMaster.liveDemoBuildComplete.pipe(cast.liveDemoBuildComplete);
serverGotExplicitSaveCommand.on(e => {
if (e.filePath === demoService.WorkerImplementation.currentFilePath) {
demoService.WorkerImplementation.enableLiveDemo({ filePath: e.filePath });
}
if (e.filePath === demoReactService.ExternalAPI.currentFilePath) {
demoReactService.ExternalAPI.enableLiveDemo({ filePath: e.filePath });
}
})
/** TS Working */
projectServiceMaster.working.pipe(cast.tsWorking);
/** If the server exits notify the clients */
onServerExit(() => cast.serverExiting.emit({}));
// For testing
// setInterval(() => cast.hello.emit({ text: 'nice' }), 1000);
}