@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/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +4 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/server-bin.d.ts +3 -0
- package/dist/cli/server-bin.d.ts.map +1 -0
- package/dist/cli/server-bin.js +6 -0
- package/dist/cli/server-bin.js.map +1 -0
- package/dist/cli/server.d.ts +12 -0
- package/dist/cli/server.d.ts.map +1 -0
- package/dist/cli/server.js +339 -0
- package/dist/cli/server.js.map +1 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -1
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +71 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +56 -4
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts +24 -1
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +63 -5
- package/dist/connection.js.map +1 -1
- package/dist/container.d.ts +7 -7
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +73 -10
- package/dist/container.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/offline/runner.d.ts +1 -1
- package/dist/offline/runner.d.ts.map +1 -1
- package/dist/offline/runner.js +3 -3
- package/dist/offline/runner.js.map +1 -1
- package/dist/pueblo.d.ts +40 -0
- package/dist/pueblo.d.ts.map +1 -0
- package/dist/pueblo.js +265 -0
- package/dist/pueblo.js.map +1 -0
- package/package.json +16 -4
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
|
|
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
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
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
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -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
|
-
|
|
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>;
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
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"}
|
package/dist/connection.js
CHANGED
|
@@ -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);
|
|
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 (
|
|
133
|
-
|
|
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();
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/container.d.ts
CHANGED
|
@@ -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
|
|
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.
|
package/dist/container.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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;
|
package/dist/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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; } });
|