DefinitelyTyped/types/socketcluster/socketcluster-tests.ts

155 lines
6.3 KiB
TypeScript

import * as fsutil from "socketcluster/fsutil";
import SocketCluster = require("socketcluster");
import { SCServer } from "socketcluster-server";
import { ChildProcess } from "child_process";
import path = require("path");
import * as minimist from "minimist";
import * as scHotReboot from "sc-hot-reboot";
////////////////////////////////////////////////////
/// SocketCluster tests
////////////////////////////////////////////////////
{
const options: SCServer.SCServerOptions = { port: 80 };
let sc = new SocketCluster();
sc = new SocketCluster(options);
sc = SocketCluster.create(options);
sc.options = { environment: "prod" };
sc.on(sc.EVENT_FAIL, err => {
const error: Error = err;
});
sc.on(sc.EVENT_WARNING, warning => {
const warn: Error = warning;
});
sc.on(sc.EVENT_READY, () => {});
sc.on(sc.EVENT_WORKER_START, workerInfo => {
const id: number = workerInfo.id;
const pid: number = workerInfo.pid;
const respawn: boolean = workerInfo.respawn;
});
sc.on(sc.EVENT_WORKER_EXIT, workerInfo => {
const id: number = workerInfo.id;
const pid: number = workerInfo.pid;
const code: number = workerInfo.code;
const signal: string = workerInfo.signal;
});
sc.on(sc.EVENT_BROKER_START, brokerInfo => {
const id: number = brokerInfo.id;
const pid: number = brokerInfo.pid;
const respawn: boolean = brokerInfo.respawn;
});
sc.on(sc.EVENT_BROKER_EXIT, brokerInfo => {
const id: number = brokerInfo.id;
const pid: number = brokerInfo.pid;
const code: number = brokerInfo.code;
const signal: string = brokerInfo.signal;
});
sc.on(sc.EVENT_WORKER_CLUSTER_START, workerClusterInfo => {
const pid: number = workerClusterInfo.pid;
const childProcess: ChildProcess = workerClusterInfo.childProcess;
});
sc.on(sc.EVENT_WORKER_CLUSTER_READY, workerClusterInfo => {
const pid: number = workerClusterInfo.pid;
const childProcess: ChildProcess = workerClusterInfo.childProcess;
});
sc.on(sc.EVENT_WORKER_CLUSTER_EXIT, workerClusterInfo => {
const pid: number = workerClusterInfo.pid;
const code: number = workerClusterInfo.code;
const signal: string = workerClusterInfo.signal;
const childProcess: ChildProcess = workerClusterInfo.childProcess;
});
sc.sendToWorker(123, "test");
sc.sendToWorker(222, "test 2", (err, responseData, workerId) => {
if (!err) {
sc.log(`Received ${responseData} from ${workerId}`);
}
});
sc.sendToBroker(123, "test");
sc.sendToBroker(222, "test 2", (err, responseData) => {
if (!err) {
sc.colorText(`Received ${responseData} from broker`, "yellow");
}
});
sc.killWorkers({ immediate: true });
sc.killBrokers();
sc.destroy();
}
// Adapted from the socketcluster sample
{
const argv = minimist(process.argv.slice(2));
const workerControllerPath = argv.wc || process.env.SOCKETCLUSTER_WORKER_CONTROLLER;
const brokerControllerPath = argv.bc || process.env.SOCKETCLUSTER_BROKER_CONTROLLER;
const workerClusterControllerPath = argv.wcc || process.env.SOCKETCLUSTER_WORKERCLUSTER_CONTROLLER;
const environment = process.env.ENV || "dev";
const options: SCServer.SCServerOptions = {
workers: Number(argv.w) || Number(process.env.SOCKETCLUSTER_WORKERS) || 1,
brokers: Number(argv.b) || Number(process.env.SOCKETCLUSTER_BROKERS) || 1,
port: Number(argv.p) || Number(process.env.SOCKETCLUSTER_PORT) || 8000,
// You can switch to 'sc-uws' for improved performance.
wsEngine: process.env.SOCKETCLUSTER_WS_ENGINE || "ws",
appName: argv.n || process.env.SOCKETCLUSTER_APP_NAME || null,
workerController: workerControllerPath || path.join(__dirname, "worker.js"),
brokerController: brokerControllerPath || path.join(__dirname, "broker.js"),
workerClusterController: workerClusterControllerPath || null,
socketChannelLimit: Number(process.env.SOCKETCLUSTER_SOCKET_CHANNEL_LIMIT) || 1000,
clusterStateServerHost: argv.cssh || process.env.SCC_STATE_SERVER_HOST || null,
clusterStateServerPort: process.env.SCC_STATE_SERVER_PORT || null,
clusterMappingEngine: process.env.SCC_MAPPING_ENGINE || null,
clusterClientPoolSize: process.env.SCC_CLIENT_POOL_SIZE || null,
clusterAuthKey: process.env.SCC_AUTH_KEY || null,
clusterInstanceIp: process.env.SCC_INSTANCE_IP || null,
clusterInstanceIpFamily: process.env.SCC_INSTANCE_IP_FAMILY || null,
clusterStateServerConnectTimeout: Number(process.env.SCC_STATE_SERVER_CONNECT_TIMEOUT) || null,
clusterStateServerAckTimeout: Number(process.env.SCC_STATE_SERVER_ACK_TIMEOUT) || null,
clusterStateServerReconnectRandomness: Number(process.env.SCC_STATE_SERVER_RECONNECT_RANDOMNESS) || null,
crashWorkerOnError: argv["auto-reboot"] !== false,
// If using nodemon, set this to true, and make sure that environment is 'dev'.
killMasterOnSignal: false,
environment
};
const socketCluster = new SocketCluster(options);
socketCluster.on(socketCluster.EVENT_WORKER_CLUSTER_START, workerClusterInfo => {
console.log(" >> WorkerCluster PID:", workerClusterInfo.pid);
});
if (socketCluster.options.environment === "dev") {
// This will cause SC workers to reboot when code changes anywhere in the app directory.
// The second options argument here is passed directly to chokidar.
// See https://github.com/paulmillr/chokidar#api for details.
console.log(` !! The sc-hot-reboot plugin is watching for code changes in the ${__dirname} directory`);
scHotReboot.attach(socketCluster, {
cwd: __dirname,
ignored: ["public", "node_modules", "README.md", "Dockerfile", "server.js", "broker.js", /[\/\\]\./, "*.log"]
});
}
}
////////////////////////////////////////////////////
/// fsutil tests
////////////////////////////////////////////////////
{
fsutil.fileExists("/path/to/folder", err => {});
fsutil.fileExists(Buffer.from(""), err => {});
const pathPromise: Promise<void> = fsutil.waitForFile("/path/to/folder", 100, 0, 100);
const bufferPromise: Promise<void> = fsutil.waitForFile(Buffer.from(""), 0, 0, 0, "timeout");
}