@rhost/testkit 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.d.ts CHANGED
@@ -1,4 +1,57 @@
1
1
  export declare const CONFIG_FILENAME = "rhost.config.json";
2
+ export interface RhostBuildConfig {
3
+ /**
4
+ * Compile RhostMUSH with WebSocket (RFC 6455) support.
5
+ * Equivalent to the ENABLE_WEBSOCKETS compile-time flag.
6
+ * Default: false
7
+ */
8
+ enableWebSockets?: boolean;
9
+ /**
10
+ * Compile RhostMUSH with the reality levels system.
11
+ * Default: false
12
+ */
13
+ enableReality?: boolean;
14
+ /**
15
+ * Arbitrary extra compiler flags passed directly to CFLAGS.
16
+ * Use for any compile-time feature not covered above.
17
+ * Example: "-DSOME_FEATURE -DANOTHER"
18
+ */
19
+ extraCflags?: string;
20
+ }
21
+ export interface RhostStunnelConfig {
22
+ /**
23
+ * Launch a stunnel process inside the container to wrap the MUSH port
24
+ * (or WebSocket port) in TLS. Required when clients connect via wss://
25
+ * or a browser enforces mixed-content rules.
26
+ * Default: false
27
+ */
28
+ enable?: boolean;
29
+ /**
30
+ * Port stunnel listens on for incoming TLS connections.
31
+ * This is the port clients connect to (e.g. for wss://).
32
+ * Default: 4203
33
+ */
34
+ acceptPort?: number;
35
+ /**
36
+ * Internal port stunnel forwards decrypted traffic to.
37
+ * Should match RHOST_PORT (plain MUSH) or the WebSocket port.
38
+ * Default: 4201
39
+ */
40
+ connectPort?: number;
41
+ /**
42
+ * Path to the PEM certificate file.
43
+ * If omitted, a self-signed certificate is generated automatically
44
+ * (suitable for testing; not for production).
45
+ * Relative to the directory containing rhost.config.json.
46
+ */
47
+ certFile?: string;
48
+ /**
49
+ * Path to the PEM private key file.
50
+ * Defaults to certFile if not set (combined cert+key PEM).
51
+ * Relative to the directory containing rhost.config.json.
52
+ */
53
+ keyFile?: string;
54
+ }
2
55
  export interface RhostConfig {
3
56
  /**
4
57
  * Path to a directory of execscript files that will be copied into the
@@ -13,6 +66,19 @@ export interface RhostConfig {
13
66
  * Relative to the directory containing `rhost.config.json`.
14
67
  */
15
68
  mushConfig?: string;
69
+ /**
70
+ * Compile-time feature flags. Only relevant when building the image from
71
+ * source via `RhostContainer.fromSource()` or `rhost-server --build-from-source`.
72
+ * Has no effect when using a pre-built image.
73
+ */
74
+ build?: RhostBuildConfig;
75
+ /**
76
+ * stunnel TLS wrapper configuration.
77
+ * When enabled, a stunnel process is launched inside the container that
78
+ * accepts TLS connections and forwards them to the plain MUSH port.
79
+ * This lets browser clients use wss:// even when the MUSH itself is plain TCP.
80
+ */
81
+ stunnel?: RhostStunnelConfig;
16
82
  }
17
83
  /**
18
84
  * Load `rhost.config.json` from `searchDir` (default: `process.cwd()`).
@@ -21,8 +87,11 @@ export interface RhostConfig {
21
87
  * container simply starts with its built-in defaults.
22
88
  *
23
89
  * @throws SyntaxError when the file exists but is not valid JSON.
24
- * @throws Error when `scriptsDir` or `mushConfig` resolve to a path
25
- * outside the project directory (path traversal guard).
90
+ * @throws Error when path fields resolve outside the project directory.
26
91
  */
27
92
  export declare function loadConfig(searchDir?: string): RhostConfig | null;
93
+ /** Convert a RhostBuildConfig into Docker build-arg key/value pairs. */
94
+ export declare function buildArgsFromConfig(build: RhostBuildConfig): Record<string, string>;
95
+ /** Convert a RhostStunnelConfig into container environment variables. */
96
+ export declare function stunnelEnvFromConfig(stunnel: RhostStunnelConfig): Record<string, string>;
28
97
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,MAAM,WAAW,WAAW;IACxB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,SAAS,GAAE,MAAsB,GAAG,WAAW,GAAG,IAAI,CAgChF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC7B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAC/B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAEzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,SAAS,GAAE,MAAsB,GAAG,WAAW,GAAG,IAAI,CAqChF;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMnF;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxF"}
package/dist/config.js CHANGED
@@ -35,6 +35,8 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.CONFIG_FILENAME = void 0;
37
37
  exports.loadConfig = loadConfig;
38
+ exports.buildArgsFromConfig = buildArgsFromConfig;
39
+ exports.stunnelEnvFromConfig = stunnelEnvFromConfig;
38
40
  /**
39
41
  * rhost.config.json loader
40
42
  *
@@ -49,6 +51,26 @@ exports.loadConfig = loadConfig;
49
51
  * "mushConfig": "./mush.conf"
50
52
  * }
51
53
  * ```
54
+ *
55
+ * Full example with build flags and stunnel:
56
+ * ```json
57
+ * {
58
+ * "scriptsDir": "./scripts",
59
+ * "mushConfig": "./mush.conf",
60
+ * "build": {
61
+ * "enableWebSockets": true,
62
+ * "enableSsl": true,
63
+ * "extraCflags": "-DPUEBLO"
64
+ * },
65
+ * "stunnel": {
66
+ * "enable": true,
67
+ * "acceptPort": 4203,
68
+ * "connectPort": 4201,
69
+ * "certFile": "./certs/server.pem",
70
+ * "keyFile": "./certs/server.key"
71
+ * }
72
+ * }
73
+ * ```
52
74
  */
53
75
  const fs = __importStar(require("fs"));
54
76
  const path = __importStar(require("path"));
@@ -60,8 +82,7 @@ exports.CONFIG_FILENAME = 'rhost.config.json';
60
82
  * container simply starts with its built-in defaults.
61
83
  *
62
84
  * @throws SyntaxError when the file exists but is not valid JSON.
63
- * @throws Error when `scriptsDir` or `mushConfig` resolve to a path
64
- * outside the project directory (path traversal guard).
85
+ * @throws Error when path fields resolve outside the project directory.
65
86
  */
66
87
  function loadConfig(searchDir = process.cwd()) {
67
88
  const configPath = path.join(searchDir, exports.CONFIG_FILENAME);
@@ -70,8 +91,6 @@ function loadConfig(searchDir = process.cwd()) {
70
91
  }
71
92
  const raw = fs.readFileSync(configPath, 'utf8');
72
93
  const parsed = JSON.parse(raw);
73
- // Resolve relative paths to absolute, anchored at the config file location,
74
- // then assert they remain within the project root (searchDir).
75
94
  const root = path.resolve(searchDir) + path.sep;
76
95
  const base = path.dirname(configPath);
77
96
  function resolveConfined(field, value) {
@@ -89,6 +108,39 @@ function loadConfig(searchDir = process.cwd()) {
89
108
  if (parsed.mushConfig) {
90
109
  parsed.mushConfig = resolveConfined('mushConfig', parsed.mushConfig);
91
110
  }
111
+ if (parsed.stunnel?.certFile) {
112
+ parsed.stunnel.certFile = resolveConfined('stunnel.certFile', parsed.stunnel.certFile);
113
+ }
114
+ if (parsed.stunnel?.keyFile) {
115
+ parsed.stunnel.keyFile = resolveConfined('stunnel.keyFile', parsed.stunnel.keyFile);
116
+ }
92
117
  return parsed;
93
118
  }
119
+ /** Convert a RhostBuildConfig into Docker build-arg key/value pairs. */
120
+ function buildArgsFromConfig(build) {
121
+ const args = {};
122
+ if (build.enableWebSockets)
123
+ args['ENABLE_WEBSOCKETS'] = '1';
124
+ if (build.enableReality)
125
+ args['ENABLE_REALITY'] = '1';
126
+ if (build.extraCflags)
127
+ args['EXTRA_CFLAGS'] = build.extraCflags;
128
+ return args;
129
+ }
130
+ /** Convert a RhostStunnelConfig into container environment variables. */
131
+ function stunnelEnvFromConfig(stunnel) {
132
+ const env = {};
133
+ if (stunnel.enable) {
134
+ env['STUNNEL_ENABLE'] = 'true';
135
+ if (stunnel.acceptPort)
136
+ env['STUNNEL_ACCEPT_PORT'] = String(stunnel.acceptPort);
137
+ if (stunnel.connectPort)
138
+ env['STUNNEL_CONNECT_PORT'] = String(stunnel.connectPort);
139
+ if (stunnel.certFile)
140
+ env['STUNNEL_CERT'] = stunnel.certFile;
141
+ if (stunnel.keyFile)
142
+ env['STUNNEL_KEY'] = stunnel.keyFile;
143
+ }
144
+ return env;
145
+ }
94
146
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,gCAgCC;AA/ED;;;;;;;;;;;;;;GAcG;AACH,uCAAyB;AACzB,2CAA6B;AAEhB,QAAA,eAAe,GAAG,mBAAmB,CAAC;AAmBnD;;;;;;;;;GASG;AACH,SAAgB,UAAU,CAAC,YAAoB,OAAO,CAAC,GAAG,EAAE;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAe,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IAE9C,4EAA4E;IAC5E,+DAA+D;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,SAAS,eAAe,CAAC,KAAa,EAAE,KAAa;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CACX,uBAAuB,KAAK,2CAA2C;gBACvE,oBAAoB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI;gBAC/C,oBAAoB,QAAQ,EAAE,CACjC,CAAC;QACN,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -11,14 +11,37 @@ declare class AsyncLineQueue {
11
11
  drainSync(): string[];
12
12
  cancelAll(reason: string): void;
13
13
  }
14
+ export interface MushConnectionOptions {
15
+ /**
16
+ * When true, connects via WebSocket (RFC 6455) instead of raw TCP.
17
+ * Requires RhostMUSH compiled with ENABLE_WEBSOCKETS. Default: false.
18
+ */
19
+ useWebSocket?: boolean;
20
+ /**
21
+ * WebSocket request path. Default: '/'.
22
+ * Only relevant when useWebSocket is true.
23
+ */
24
+ websocketPath?: string;
25
+ /**
26
+ * Use wss:// instead of ws://. Requires a TLS terminator (e.g. stunnel)
27
+ * in front of the MUSH port. Default: false.
28
+ */
29
+ websocketSecure?: boolean;
30
+ }
14
31
  export declare class MushConnection extends EventEmitter {
15
32
  private readonly host;
16
33
  private readonly port;
17
34
  private socket;
35
+ private ws;
18
36
  private rawBuffer;
19
37
  readonly lines: AsyncLineQueue;
20
- constructor(host: string, port: number);
38
+ private readonly useWebSocket;
39
+ private readonly websocketPath;
40
+ private readonly websocketSecure;
41
+ constructor(host: string, port: number, options?: MushConnectionOptions);
21
42
  connect(connectTimeoutMs?: number): Promise<void>;
43
+ private connectTcp;
44
+ private connectWebSocket;
22
45
  private onData;
23
46
  send(command: string): void;
24
47
  close(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;GAGG;AACH,cAAM,cAAc;IAChB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAgF;IAE/F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQxB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBxC,SAAS,IAAI,MAAM,EAAE;IAMrB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAIlC;AAED,qBAAa,cAAe,SAAQ,YAAY;IAKhC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAU,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJhE,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,SAAS,CAAM;IACvB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;gBAEF,IAAI,EAAE,MAAM,EAAmB,IAAI,EAAE,MAAM;IAKxE,OAAO,CAAC,gBAAgB,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBhD,OAAO,CAAC,MAAM;IAWd,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAUzB"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC;;;GAGG;AACH,cAAM,cAAc;IAChB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAgF;IAE/F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQxB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBxC,SAAS,IAAI,MAAM,EAAE;IAMrB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAIlC;AAED,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,cAAe,SAAQ,YAAY;IAUxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVzB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAM;IACvB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAGrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAC7B,OAAO,GAAE,qBAA0B;IASvC,OAAO,CAAC,gBAAgB,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,MAAM;IAWd,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAc3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBzB"}
@@ -32,10 +32,14 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.MushConnection = void 0;
37
40
  const net = __importStar(require("net"));
38
41
  const events_1 = require("events");
42
+ const ws_1 = __importDefault(require("ws"));
39
43
  /**
40
44
  * Async FIFO queue for lines received from the server.
41
45
  * Delivers directly to waiting consumers; buffers when none are waiting.
@@ -86,15 +90,24 @@ class AsyncLineQueue {
86
90
  }
87
91
  }
88
92
  class MushConnection extends events_1.EventEmitter {
89
- constructor(host, port) {
93
+ constructor(host, port, options = {}) {
90
94
  super();
91
95
  this.host = host;
92
96
  this.port = port;
93
97
  this.socket = null;
98
+ this.ws = null;
94
99
  this.rawBuffer = '';
95
100
  this.lines = new AsyncLineQueue();
101
+ this.useWebSocket = options.useWebSocket ?? false;
102
+ this.websocketPath = options.websocketPath ?? '/';
103
+ this.websocketSecure = options.websocketSecure ?? false;
96
104
  }
97
105
  connect(connectTimeoutMs = 10000) {
106
+ return this.useWebSocket
107
+ ? this.connectWebSocket(connectTimeoutMs)
108
+ : this.connectTcp(connectTimeoutMs);
109
+ }
110
+ connectTcp(connectTimeoutMs) {
98
111
  return new Promise((resolve, reject) => {
99
112
  this.socket = new net.Socket();
100
113
  this.socket.setEncoding('utf8');
@@ -105,7 +118,7 @@ class MushConnection extends events_1.EventEmitter {
105
118
  reject(new Error(`connect() timed out after ${connectTimeoutMs}ms`));
106
119
  });
107
120
  this.socket.connect(this.port, this.host, () => {
108
- this.socket.setTimeout(0); // disable timeout after connection established
121
+ this.socket.setTimeout(0);
109
122
  this.socket.removeAllListeners('error');
110
123
  this.socket.removeAllListeners('timeout');
111
124
  this.socket.on('error', (err) => this.emit('error', err));
@@ -118,6 +131,33 @@ class MushConnection extends events_1.EventEmitter {
118
131
  });
119
132
  });
120
133
  }
134
+ connectWebSocket(connectTimeoutMs) {
135
+ return new Promise((resolve, reject) => {
136
+ const scheme = this.websocketSecure ? 'wss' : 'ws';
137
+ const url = `${scheme}://${this.host}:${this.port}${this.websocketPath}`;
138
+ this.ws = new ws_1.default(url);
139
+ const timer = setTimeout(() => {
140
+ this.ws.terminate();
141
+ reject(new Error(`connect() timed out after ${connectTimeoutMs}ms`));
142
+ }, connectTimeoutMs);
143
+ this.ws.once('open', () => {
144
+ clearTimeout(timer);
145
+ this.ws.on('error', (err) => this.emit('error', err));
146
+ this.ws.on('close', () => {
147
+ this.lines.cancelAll('Connection closed');
148
+ this.emit('close');
149
+ });
150
+ this.ws.on('message', (data) => {
151
+ this.onData(data.toString());
152
+ });
153
+ resolve();
154
+ });
155
+ this.ws.once('error', (err) => {
156
+ clearTimeout(timer);
157
+ reject(err);
158
+ });
159
+ });
160
+ }
121
161
  onData(chunk) {
122
162
  this.rawBuffer += chunk;
123
163
  let newlineIdx;
@@ -129,12 +169,30 @@ class MushConnection extends events_1.EventEmitter {
129
169
  }
130
170
  }
131
171
  send(command) {
132
- if (!this.socket || this.socket.destroyed) {
133
- throw new Error('Not connected');
172
+ if (this.useWebSocket) {
173
+ if (!this.ws || this.ws.readyState !== ws_1.default.OPEN) {
174
+ throw new Error('Not connected');
175
+ }
176
+ this.ws.send(command + '\r\n');
177
+ }
178
+ else {
179
+ if (!this.socket || this.socket.destroyed) {
180
+ throw new Error('Not connected');
181
+ }
182
+ this.socket.write(command + '\r\n');
134
183
  }
135
- this.socket.write(command + '\r\n');
136
184
  }
137
185
  close() {
186
+ if (this.useWebSocket) {
187
+ return new Promise((resolve) => {
188
+ if (!this.ws || this.ws.readyState === ws_1.default.CLOSED) {
189
+ resolve();
190
+ return;
191
+ }
192
+ this.ws.once('close', () => resolve());
193
+ this.ws.close();
194
+ });
195
+ }
138
196
  return new Promise((resolve) => {
139
197
  if (!this.socket || this.socket.destroyed) {
140
198
  resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import { RhostConfig } from './config';
2
2
  export interface ContainerConnectionInfo {
3
3
  host: string;
4
+ /** Plain MUSH / telnet port */
4
5
  port: number;
6
+ /** stunnel TLS port, if stunnel was enabled */
7
+ stunnelPort?: number;
5
8
  }
6
9
  export declare class RhostContainer {
7
10
  private started;
@@ -23,6 +26,9 @@ export declare class RhostContainer {
23
26
  * The first build clones and compiles RhostMUSH from source — allow 5-10
24
27
  * minutes. Subsequent runs reuse Docker's layer cache.
25
28
  *
29
+ * Compile-time features in `config.build` (enableWebSockets, enableSsl,
30
+ * enablePueblo, enableReality, extraCflags) are passed as Docker build args.
31
+ *
26
32
  * @param projectRoot Path to the rhostmush-docker directory.
27
33
  * Defaults to `../` relative to this file (i.e. the repo root).
28
34
  * @param config Optional config overrides. If omitted, `rhost.config.json`
@@ -31,13 +37,7 @@ export declare class RhostContainer {
31
37
  static fromSource(projectRoot?: string, config?: RhostConfig): RhostContainer;
32
38
  /**
33
39
  * Start the container. Blocks until port 4201 is accepting connections.
34
- * Returns the host and dynamically-assigned port to pass to `RhostClient`.
35
- *
36
- * If `config.scriptsDir` is set, the directory is copied into the container
37
- * at `/home/rhost/game/scripts` before startup.
38
- *
39
- * If `config.mushConfig` is set, the file is copied into the container at
40
- * `/home/rhost/game/mush.config` before startup.
40
+ * Returns host/port info to pass to `RhostClient`.
41
41
  *
42
42
  * @param startupTimeout Max ms to wait for the server to be ready.
43
43
  * Default: 120000 (2 min). Increase for slow machines or first builds.
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,WAAW,EAAc,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAUD,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,OAAO;IAKP;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,SAA6B,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc;IAK1F;;;;;;;;;;OAUG;IACH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc;IAY7E;;;;;;;;;;;;OAYG;IACG,KAAK,CAAC,cAAc,SAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqCvE,oEAAoE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,kEAAkE;IAClE,iBAAiB,IAAI,uBAAuB;CAS/C"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AA4CA,OAAO,EAAE,WAAW,EAAyD,MAAM,UAAU,CAAC;AAE9F,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAcD,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,OAAO;IAKP;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,SAA6B,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc;IAK1F;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc;IAkB7E;;;;;;OAMG;IACG,KAAK,CAAC,cAAc,SAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA+EvE,oEAAoE;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,kEAAkE;IAClE,iBAAiB,IAAI,uBAAuB;CAc/C"}
package/dist/container.js CHANGED
@@ -57,6 +57,18 @@ exports.RhostContainer = void 0;
57
57
  *
58
58
  * RhostContainer.fromSource(undefined, { scriptsDir: './my-scripts' })
59
59
  *
60
+ * Compile-time features (fromSource only)
61
+ * ────────────────────────────────────────
62
+ * RhostContainer.fromSource(undefined, {
63
+ * build: { enableWebSockets: true, enableSsl: true }
64
+ * })
65
+ *
66
+ * stunnel TLS wrapper
67
+ * ───────────────────
68
+ * RhostContainer.fromImage('lcanady/rhostmush:latest', {
69
+ * stunnel: { enable: true, acceptPort: 4203, certFile: './cert.pem' }
70
+ * })
71
+ *
60
72
  * See `src/config.ts` for the full `RhostConfig` interface.
61
73
  */
62
74
  const fs = __importStar(require("fs"));
@@ -67,6 +79,9 @@ const config_1 = require("./config");
67
79
  const CONTAINER_SCRIPTS_PATH = '/home/rhost/game/scripts';
68
80
  /** Path inside the container where mush.config lives. */
69
81
  const CONTAINER_MUSH_CONFIG_PATH = '/home/rhost/game/mush.config';
82
+ /** Path inside the container where stunnel cert/key are copied. */
83
+ const CONTAINER_STUNNEL_CERT_PATH = '/home/rhost/stunnel-cert.pem';
84
+ const CONTAINER_STUNNEL_KEY_PATH = '/home/rhost/stunnel-key.pem';
70
85
  class RhostContainer {
71
86
  constructor(factory, config) {
72
87
  this.started = null;
@@ -91,6 +106,9 @@ class RhostContainer {
91
106
  * The first build clones and compiles RhostMUSH from source — allow 5-10
92
107
  * minutes. Subsequent runs reuse Docker's layer cache.
93
108
  *
109
+ * Compile-time features in `config.build` (enableWebSockets, enableSsl,
110
+ * enablePueblo, enableReality, extraCflags) are passed as Docker build args.
111
+ *
94
112
  * @param projectRoot Path to the rhostmush-docker directory.
95
113
  * Defaults to `../` relative to this file (i.e. the repo root).
96
114
  * @param config Optional config overrides. If omitted, `rhost.config.json`
@@ -102,24 +120,23 @@ class RhostContainer {
102
120
  : path.resolve(__dirname, '../');
103
121
  const cfg = config ?? (0, config_1.loadConfig)() ?? {};
104
122
  return new RhostContainer(async () => {
105
- return testcontainers_1.GenericContainer.fromDockerfile(root).build();
123
+ let builder = testcontainers_1.GenericContainer.fromDockerfile(root);
124
+ if (cfg.build) {
125
+ builder = builder.withBuildArgs((0, config_1.buildArgsFromConfig)(cfg.build));
126
+ }
127
+ return builder.build();
106
128
  }, cfg);
107
129
  }
108
130
  /**
109
131
  * Start the container. Blocks until port 4201 is accepting connections.
110
- * Returns the host and dynamically-assigned port to pass to `RhostClient`.
111
- *
112
- * If `config.scriptsDir` is set, the directory is copied into the container
113
- * at `/home/rhost/game/scripts` before startup.
114
- *
115
- * If `config.mushConfig` is set, the file is copied into the container at
116
- * `/home/rhost/game/mush.config` before startup.
132
+ * Returns host/port info to pass to `RhostClient`.
117
133
  *
118
134
  * @param startupTimeout Max ms to wait for the server to be ready.
119
135
  * Default: 120000 (2 min). Increase for slow machines or first builds.
120
136
  */
121
137
  async start(startupTimeout = 120000) {
122
138
  let base = await this.factory();
139
+ // ── File copies ───────────────────────────────────────────────────────
123
140
  if (this.config.scriptsDir) {
124
141
  if (!fs.existsSync(this.config.scriptsDir)) {
125
142
  throw new Error(`RhostContainer: scriptsDir not found: ${this.config.scriptsDir}`);
@@ -138,8 +155,49 @@ class RhostContainer {
138
155
  target: CONTAINER_MUSH_CONFIG_PATH,
139
156
  }]);
140
157
  }
158
+ // ── stunnel ──────────────────────────────────────────────────────────
159
+ const stunnelCfg = this.config.stunnel;
160
+ const stunnelEnabled = stunnelCfg?.enable === true;
161
+ const stunnelAcceptPort = stunnelCfg?.acceptPort ?? 4203;
162
+ if (stunnelEnabled) {
163
+ // Build env vars from scratch rather than using stunnelEnvFromConfig()
164
+ // so that cert/key paths are always set to the in-container paths,
165
+ // never host paths that wouldn't exist inside the container.
166
+ const envVars = { STUNNEL_ENABLE: 'true' };
167
+ if (stunnelCfg.acceptPort)
168
+ envVars['STUNNEL_ACCEPT_PORT'] = String(stunnelCfg.acceptPort);
169
+ if (stunnelCfg.connectPort)
170
+ envVars['STUNNEL_CONNECT_PORT'] = String(stunnelCfg.connectPort);
171
+ const certFile = stunnelCfg.certFile;
172
+ const keyFile = stunnelCfg.keyFile;
173
+ if (certFile) {
174
+ if (!fs.existsSync(certFile)) {
175
+ throw new Error(`RhostContainer: stunnel.certFile not found: ${certFile}`);
176
+ }
177
+ base = base.withCopyFilesToContainer([{ source: certFile, target: CONTAINER_STUNNEL_CERT_PATH }]);
178
+ envVars['STUNNEL_CERT'] = CONTAINER_STUNNEL_CERT_PATH;
179
+ // Separate key file only when it differs from the cert file
180
+ if (keyFile && keyFile !== certFile) {
181
+ if (!fs.existsSync(keyFile)) {
182
+ throw new Error(`RhostContainer: stunnel.keyFile not found: ${keyFile}`);
183
+ }
184
+ base = base.withCopyFilesToContainer([{ source: keyFile, target: CONTAINER_STUNNEL_KEY_PATH }]);
185
+ envVars['STUNNEL_KEY'] = CONTAINER_STUNNEL_KEY_PATH;
186
+ }
187
+ // If keyFile === certFile (combined PEM), stunnel reads key from the same file;
188
+ // STUNNEL_KEY is left unset so entrypoint.sh defaults it to STUNNEL_CERT.
189
+ }
190
+ // If no certFile is given, entrypoint.sh auto-generates a self-signed cert.
191
+ for (const [k, v] of Object.entries(envVars)) {
192
+ base = base.withEnvironment({ [k]: v });
193
+ }
194
+ }
195
+ // ── Ports ─────────────────────────────────────────────────────────────
196
+ const exposedPorts = [4201];
197
+ if (stunnelEnabled)
198
+ exposedPorts.push(stunnelAcceptPort);
141
199
  this.started = await base
142
- .withExposedPorts(4201)
200
+ .withExposedPorts(...exposedPorts)
143
201
  .withWaitStrategy(testcontainers_1.Wait.forListeningPorts().withStartupTimeout(startupTimeout))
144
202
  .start();
145
203
  return this.getConnectionInfo();
@@ -154,10 +212,15 @@ class RhostContainer {
154
212
  if (!this.started) {
155
213
  throw new Error('Container is not running — call start() first.');
156
214
  }
157
- return {
215
+ const info = {
158
216
  host: this.started.getHost(),
159
217
  port: this.started.getMappedPort(4201),
160
218
  };
219
+ const stunnelAcceptPort = this.config.stunnel?.acceptPort ?? 4203;
220
+ if (this.config.stunnel?.enable) {
221
+ info.stunnelPort = this.started.getMappedPort(stunnelAcceptPort);
222
+ }
223
+ return info;
161
224
  }
162
225
  }
163
226
  exports.RhostContainer = RhostContainer;
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,uCAAyB;AACzB,2CAA6B;AAC7B,mDAIwB;AACxB,qCAAmD;AAOnD,6DAA6D;AAC7D,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAE1D,yDAAyD;AACzD,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;AAIlE,MAAa,cAAc;IAKvB,YAAoB,OAAyB,EAAE,MAAmB;QAJ1D,YAAO,GAAgC,IAAI,CAAC;QAKhD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAI,MAAM,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,0BAA0B,EAAE,MAAoB;QACrE,MAAM,GAAG,GAAG,MAAM,IAAI,IAAA,mBAAU,GAAE,IAAI,EAAE,CAAC;QACzC,OAAO,IAAI,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,iCAAgB,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,UAAU,CAAC,WAAoB,EAAE,MAAoB;QACxD,MAAM,IAAI,GAAG,WAAW;YACpB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAErC,MAAM,GAAG,GAAG,MAAM,IAAI,IAAA,mBAAU,GAAE,IAAI,EAAE,CAAC;QAEzC,OAAO,IAAI,cAAc,CAAC,KAAK,IAAI,EAAE;YACjC,OAAO,iCAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACzD,CAAC,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,MAAO;QAChC,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CACX,yCAAyC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CACpE,CAAC;YACN,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC;oBACxC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;oBAC9B,MAAM,EAAE,sBAAsB;iBACjC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CACX,yCAAyC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CACpE,CAAC;YACN,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;oBAC9B,MAAM,EAAE,0BAA0B;iBACrC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI;aACpB,gBAAgB,CAAC,IAAI,CAAC;aACtB,gBAAgB,CACb,qBAAI,CAAC,iBAAiB,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAC9D;aACA,KAAK,EAAE,CAAC;QAEb,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACpC,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,kEAAkE;IAClE,iBAAiB;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC;SACzC,CAAC;IACN,CAAC;CACJ;AAhHD,wCAgHC"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -14,6 +14,8 @@ export { RhostBenchmark, runBench, formatBenchResults, BenchOptions, BenchmarkRe
14
14
  export { deploy, parseDeployFile, snapshotObjects, restoreSnapshot, DeployCommand, DeploySnapshot, DeployOptions, DeployResult, } from './deployer';
15
15
  export { SnapshotManager, SnapshotStats, SnapshotStatus, SnapshotCheckResult, formatSnapshotDiff } from './snapshots';
16
16
  export { RhostWatcher, WatchOptions, discoverTestFiles } from './watcher';
17
+ export { convertPueblo, parsePuebloHandshake, generatePuebloHandshake } from './pueblo';
18
+ export type { PuebloConvertOptions, PuebloHandshake } from './pueblo';
17
19
  export { parseDocument, parseDocumentFile, loadFiles, loadGlob, OfflineRunner, OfflineExpect, OfflineExpectError, } from './offline';
18
20
  export type { OfflineDocument, OfflineAttr, OfflineExpectChain, OfflineTestContext, OfflineSuiteContext, OfflineRunOptions, OfflineRunResult, } from './offline';
19
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtG,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGpE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG/F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGtG,OAAO,EACH,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EACH,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,MAAM,EACN,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,UAAU,GACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1G,OAAO,EACH,MAAM,EACN,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG1E,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtG,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGpE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG/F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGtG,OAAO,EACH,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EACH,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,MAAM,EACN,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,UAAU,GACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1G,OAAO,EACH,MAAM,EACN,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG1E,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACxF,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OfflineExpectError = exports.OfflineExpect = exports.OfflineRunner = exports.loadGlob = exports.loadFiles = exports.parseDocumentFile = exports.parseDocument = exports.discoverTestFiles = exports.RhostWatcher = exports.formatSnapshotDiff = exports.SnapshotManager = exports.restoreSnapshot = exports.snapshotObjects = exports.parseDeployFile = exports.deploy = exports.formatBenchResults = exports.runBench = exports.RhostBenchmark = exports.format = exports.BUILTIN_FUNCTIONS = exports.compatibilityReport = exports.validateFile = exports.validate = exports.RhostRunner = exports.Reporter = exports.PreflightError = exports.assertConfigEquals = exports.assertFunctionMissing = exports.assertFunctionExists = exports.preflightCheck = exports.preflight = exports.WorldSideEffectError = exports.WorldSnapshot = exports.RhostWorld = exports.RhostExpectError = exports.RhostExpect = exports.isRhostError = exports.RhostAssertionError = exports.RhostAssert = exports.CONFIG_FILENAME = exports.loadConfig = exports.RhostContainer = exports.MushConnection = exports.stripAnsi = exports.RhostClient = void 0;
3
+ exports.OfflineExpectError = exports.OfflineExpect = exports.OfflineRunner = exports.loadGlob = exports.loadFiles = exports.parseDocumentFile = exports.parseDocument = exports.generatePuebloHandshake = exports.parsePuebloHandshake = exports.convertPueblo = exports.discoverTestFiles = exports.RhostWatcher = exports.formatSnapshotDiff = exports.SnapshotManager = exports.restoreSnapshot = exports.snapshotObjects = exports.parseDeployFile = exports.deploy = exports.formatBenchResults = exports.runBench = exports.RhostBenchmark = exports.format = exports.BUILTIN_FUNCTIONS = exports.compatibilityReport = exports.validateFile = exports.validate = exports.RhostRunner = exports.Reporter = exports.PreflightError = exports.assertConfigEquals = exports.assertFunctionMissing = exports.assertFunctionExists = exports.preflightCheck = exports.preflight = exports.WorldSideEffectError = exports.WorldSnapshot = exports.RhostWorld = exports.RhostExpectError = exports.RhostExpect = exports.isRhostError = exports.RhostAssertionError = exports.RhostAssert = exports.CONFIG_FILENAME = exports.loadConfig = exports.RhostContainer = exports.MushConnection = exports.stripAnsi = exports.RhostClient = void 0;
4
4
  // Core client
5
5
  var client_1 = require("./client");
6
6
  Object.defineProperty(exports, "RhostClient", { enumerable: true, get: function () { return client_1.RhostClient; } });
@@ -71,6 +71,11 @@ Object.defineProperty(exports, "formatSnapshotDiff", { enumerable: true, get: fu
71
71
  var watcher_1 = require("./watcher");
72
72
  Object.defineProperty(exports, "RhostWatcher", { enumerable: true, get: function () { return watcher_1.RhostWatcher; } });
73
73
  Object.defineProperty(exports, "discoverTestFiles", { enumerable: true, get: function () { return watcher_1.discoverTestFiles; } });
74
+ // Pueblo markup → semantic HTML converter
75
+ var pueblo_1 = require("./pueblo");
76
+ Object.defineProperty(exports, "convertPueblo", { enumerable: true, get: function () { return pueblo_1.convertPueblo; } });
77
+ Object.defineProperty(exports, "parsePuebloHandshake", { enumerable: true, get: function () { return pueblo_1.parsePuebloHandshake; } });
78
+ Object.defineProperty(exports, "generatePuebloHandshake", { enumerable: true, get: function () { return pueblo_1.generatePuebloHandshake; } });
74
79
  // Offline static analysis — no server required
75
80
  var offline_1 = require("./offline");
76
81
  Object.defineProperty(exports, "parseDocument", { enumerable: true, get: function () { return offline_1.parseDocument; } });