As of Actionhero v21, the socket server is not included with Actionhero by default. You can add it (this package) via npm install actionhero-socket-server.
As of version 3.0.0 of this package, Actionhero v28+ is required.
❯ telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
{"welcome":"actionhero.welcomeMessage","context":"api"}
randomNumber
{"randomNumber":0.11296216329530862,"stringRandomNumber":"Your random number is 0.11296216329530862","context":"response","messageId":"8778822d-0953-4d0c-9c04-98cd53b53b7d"}
exit
{"status":"Bye","context":"api"}
Connection closed by foreign host.- Add the package to your actionhero project: 
npm install actionhero-socket-server --save - Copy the config file into your project 
cp ./node_modules/actionhero-socket-server/src/config/socket.ts src/config/socket.ts - Enable the plugin:
 
// in config/plugins.ts
import * as path from "path";
export const DEFAULT = {
  plugins: () => {
    return {
      "actionhero-socket-server": {
        path: path.join(
          __dirname,
          "..",
          "..",
          "node_modules",
          "actionhero-socket-server"
        ),
      },
    };
  },
};- Add a serializer for errors:
 
// in config/errors.ts
// you are adding config.errors.serializers.socket
socket: error => {
  if (error.message) {
    return String(error.message);
  } else {
    return error;
  }
},All options are exposed via the config file:
const namespace = "socket";
declare module "actionhero" {
  export interface ActionheroConfigInterface {
    [namespace]: ReturnType<typeof DEFAULT[typeof namespace]>;
  }
}
export const DEFAULT = {
  [namespace]: () => {
    return {
      enabled: true,
      // TCP or TLS?
      secure: false,
      // Passed to tls.createServer if secure=true. Should contain SSL certificates
      serverOptions: {},
      // Port or Socket
      port: 5000,
      // Which IP to listen on (use 0.0.0.0 for all)
      bindIP: "0.0.0.0",
      // Enable TCP KeepAlive pings on each connection?
      setKeepAlive: false,
      // Delimiter string for incoming messages
      delimiter: "\n",
      // Maximum incoming message string length in Bytes (use 0 for Infinite)
      maxDataLength: 0,
    };
  },
};