aboutsummaryrefslogtreecommitdiff
path: root/src/server/session/utilities
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/session/utilities')
-rw-r--r--src/server/session/utilities/ipc.ts52
-rw-r--r--src/server/session/utilities/repl.ts128
-rw-r--r--src/server/session/utilities/session_config.ts129
-rw-r--r--src/server/session/utilities/utilities.ts31
4 files changed, 0 insertions, 340 deletions
diff --git a/src/server/session/utilities/ipc.ts b/src/server/session/utilities/ipc.ts
deleted file mode 100644
index b20f3d337..000000000
--- a/src/server/session/utilities/ipc.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { isMaster } from "cluster";
-import { Utils } from "../../../Utils";
-
-export namespace IPC {
-
- export const suffix = isMaster ? Utils.GenerateGuid() : process.env.ipc_suffix;
- const ipc_id = `ipc_id_${suffix}`;
- const response_expected = `response_expected_${suffix}`;
- const is_response = `is_response_${suffix}`;
-
- export async function dispatchMessage(target: NodeJS.EventEmitter & { send?: Function }, message: any, expectResponse = false): Promise<Error | undefined> {
- if (!target.send) {
- return new Error("Cannot dispatch when send is undefined.");
- }
- message[response_expected] = expectResponse;
- if (expectResponse) {
- return new Promise(resolve => {
- const messageId = Utils.GenerateGuid();
- message[ipc_id] = messageId;
- const responseHandler: (args: any) => void = response => {
- const { error } = response;
- if (response[is_response] && response[ipc_id] === messageId) {
- target.removeListener("message", responseHandler);
- resolve(error);
- }
- };
- target.addListener("message", responseHandler);
- target.send!(message);
- });
- } else {
- target.send(message);
- }
- }
-
- export function addMessagesHandler(target: NodeJS.EventEmitter & { send?: Function }, handler: (message: any) => void | Promise<void>): void {
- target.addListener("message", async incoming => {
- let error: Error | undefined;
- try {
- await handler(incoming);
- } catch (e) {
- error = e;
- }
- if (incoming[response_expected] && target.send) {
- const response: any = { error };
- response[ipc_id] = incoming[ipc_id];
- response[is_response] = true;
- target.send(response);
- }
- });
- }
-
-} \ No newline at end of file
diff --git a/src/server/session/utilities/repl.ts b/src/server/session/utilities/repl.ts
deleted file mode 100644
index 643141286..000000000
--- a/src/server/session/utilities/repl.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { createInterface, Interface } from "readline";
-import { red, green, white } from "colors";
-
-export interface Configuration {
- identifier: () => string | string;
- onInvalid?: (command: string, validCommand: boolean) => string | string;
- onValid?: (success?: string) => string | string;
- isCaseSensitive?: boolean;
-}
-
-export type ReplAction = (parsedArgs: Array<string>) => any | Promise<any>;
-export interface Registration {
- argPatterns: RegExp[];
- action: ReplAction;
-}
-
-export default class Repl {
- private identifier: () => string | string;
- private onInvalid: ((command: string, validCommand: boolean) => string) | string;
- private onValid: ((success: string) => string) | string;
- private isCaseSensitive: boolean;
- private commandMap = new Map<string, Registration[]>();
- public interface: Interface;
- private busy = false;
- private keys: string | undefined;
-
- constructor({ identifier: prompt, onInvalid, onValid, isCaseSensitive }: Configuration) {
- this.identifier = prompt;
- this.onInvalid = onInvalid || this.usage;
- this.onValid = onValid || this.success;
- this.isCaseSensitive = isCaseSensitive ?? true;
- this.interface = createInterface(process.stdin, process.stdout).on('line', this.considerInput);
- }
-
- private resolvedIdentifier = () => typeof this.identifier === "string" ? this.identifier : this.identifier();
-
- private usage = (command: string, validCommand: boolean) => {
- if (validCommand) {
- const formatted = white(command);
- const patterns = green(this.commandMap.get(command)!.map(({ argPatterns }) => `${formatted} ${argPatterns.join(" ")}`).join('\n'));
- return `${this.resolvedIdentifier()}\nthe given arguments do not match any registered patterns for ${formatted}\nthe list of valid argument patterns is given by:\n${patterns}`;
- } else {
- const resolved = this.keys;
- if (resolved) {
- return resolved;
- }
- const members: string[] = [];
- const keys = this.commandMap.keys();
- let next: IteratorResult<string>;
- while (!(next = keys.next()).done) {
- members.push(next.value);
- }
- return `${this.resolvedIdentifier()} commands: { ${members.sort().join(", ")} }`;
- }
- }
-
- private success = (command: string) => `${this.resolvedIdentifier()} completed local execution of ${white(command)}`;
-
- public registerCommand = (basename: string, argPatterns: (RegExp | string)[], action: ReplAction) => {
- const existing = this.commandMap.get(basename);
- const converted = argPatterns.map(input => input instanceof RegExp ? input : new RegExp(input));
- const registration = { argPatterns: converted, action };
- if (existing) {
- existing.push(registration);
- } else {
- this.commandMap.set(basename, [registration]);
- }
- }
-
- private invalid = (command: string, validCommand: boolean) => {
- console.log(red(typeof this.onInvalid === "string" ? this.onInvalid : this.onInvalid(command, validCommand)));
- this.busy = false;
- }
-
- private valid = (command: string) => {
- console.log(green(typeof this.onValid === "string" ? this.onValid : this.onValid(command)));
- this.busy = false;
- }
-
- private considerInput = async (line: string) => {
- if (this.busy) {
- console.log(red("Busy"));
- return;
- }
- this.busy = true;
- line = line.trim();
- if (this.isCaseSensitive) {
- line = line.toLowerCase();
- }
- const [command, ...args] = line.split(/\s+/g);
- if (!command) {
- return this.invalid(command, false);
- }
- const registered = this.commandMap.get(command);
- if (registered) {
- const { length } = args;
- const candidates = registered.filter(({ argPatterns: { length: count } }) => count === length);
- for (const { argPatterns, action } of candidates) {
- const parsed: string[] = [];
- let matched = true;
- if (length) {
- for (let i = 0; i < length; i++) {
- let matches: RegExpExecArray | null;
- if ((matches = argPatterns[i].exec(args[i])) === null) {
- matched = false;
- break;
- }
- parsed.push(matches[0]);
- }
- }
- if (!length || matched) {
- const result = action(parsed);
- const resolve = () => this.valid(`${command} ${parsed.join(" ")}`);
- if (result instanceof Promise) {
- result.then(resolve);
- } else {
- resolve();
- }
- return;
- }
- }
- this.invalid(command, true);
- } else {
- this.invalid(command, false);
- }
- }
-
-} \ No newline at end of file
diff --git a/src/server/session/utilities/session_config.ts b/src/server/session/utilities/session_config.ts
deleted file mode 100644
index b0e65dde4..000000000
--- a/src/server/session/utilities/session_config.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-import { Schema } from "jsonschema";
-import { yellow, red, cyan, green, blue, magenta, Color, grey, gray, white, black } from "colors";
-
-const colorPattern = /black|red|green|yellow|blue|magenta|cyan|white|gray|grey/;
-
-const identifierProperties: Schema = {
- type: "object",
- properties: {
- text: {
- type: "string",
- minLength: 1
- },
- color: {
- type: "string",
- pattern: colorPattern
- }
- }
-};
-
-const portProperties: Schema = {
- type: "number",
- minimum: 1024,
- maximum: 65535
-};
-
-export const configurationSchema: Schema = {
- id: "/configuration",
- type: "object",
- properties: {
- showServerOutput: { type: "boolean" },
- ports: {
- type: "object",
- properties: {
- server: portProperties,
- socket: portProperties
- },
- required: ["server"],
- additionalProperties: true
- },
- identifiers: {
- type: "object",
- properties: {
- master: identifierProperties,
- worker: identifierProperties,
- exec: identifierProperties
- }
- },
- polling: {
- type: "object",
- additionalProperties: false,
- properties: {
- intervalSeconds: {
- type: "number",
- minimum: 1,
- maximum: 86400
- },
- route: {
- type: "string",
- pattern: /\/[a-zA-Z]*/g
- },
- failureTolerance: {
- type: "number",
- minimum: 0,
- }
- }
- },
- }
-};
-
-type ColorLabel = "yellow" | "red" | "cyan" | "green" | "blue" | "magenta" | "grey" | "gray" | "white" | "black";
-
-export const colorMapping: Map<ColorLabel, Color> = new Map([
- ["yellow", yellow],
- ["red", red],
- ["cyan", cyan],
- ["green", green],
- ["blue", blue],
- ["magenta", magenta],
- ["grey", grey],
- ["gray", gray],
- ["white", white],
- ["black", black]
-]);
-
-interface Identifier {
- text: string;
- color: ColorLabel;
-}
-
-export interface Identifiers {
- master: Identifier;
- worker: Identifier;
- exec: Identifier;
-}
-
-export interface Configuration {
- showServerOutput: boolean;
- identifiers: Identifiers;
- ports: { [description: string]: number };
- polling: {
- route: string;
- intervalSeconds: number;
- failureTolerance: number;
- };
-}
-
-export const defaultConfig: Configuration = {
- showServerOutput: false,
- identifiers: {
- master: {
- text: "__monitor__",
- color: "yellow"
- },
- worker: {
- text: "__server__",
- color: "magenta"
- },
- exec: {
- text: "__exec__",
- color: "green"
- }
- },
- ports: { server: 3000 },
- polling: {
- route: "/",
- intervalSeconds: 30,
- failureTolerance: 0
- }
-}; \ No newline at end of file
diff --git a/src/server/session/utilities/utilities.ts b/src/server/session/utilities/utilities.ts
deleted file mode 100644
index ac8a6590a..000000000
--- a/src/server/session/utilities/utilities.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-export namespace Utilities {
-
- /**
- * At any arbitrary layer of nesting within the configuration objects, any single value that
- * is not specified by the configuration is given the default counterpart. If, within an object,
- * one peer is given by configuration and two are not, the one is preserved while the two are given
- * the default value.
- * @returns the composition of all of the assigned objects, much like Object.assign(), but with more
- * granularity in the overwriting of nested objects
- */
- export function preciseAssign(target: any, ...sources: any[]): any {
- for (const source of sources) {
- preciseAssignHelper(target, source);
- }
- return target;
- }
-
- export function preciseAssignHelper(target: any, source: any) {
- Array.from(new Set([...Object.keys(target), ...Object.keys(source)])).map(property => {
- let targetValue: any, sourceValue: any;
- if (sourceValue = source[property]) {
- if (typeof sourceValue === "object" && typeof (targetValue = target[property]) === "object") {
- preciseAssignHelper(targetValue, sourceValue);
- } else {
- target[property] = sourceValue;
- }
- }
- });
- }
-
-} \ No newline at end of file