@lagz0ne/nats-embedded 0.1.0 → 0.3.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 +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +74 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +124 -19
- package/dist/index.js.map +1 -1
- package/dist/parse.d.ts +1 -0
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +4 -0
- package/dist/parse.js.map +1 -1
- package/package.json +7 -7
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAiB3C,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,SAAS,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,GAAG,IAAI,CAehB"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { resolve as resolvePath } from "node:path";
|
|
2
|
+
function toSnakeCase(str) {
|
|
3
|
+
return str.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
|
|
4
|
+
}
|
|
5
|
+
function serializeBlock(name, obj) {
|
|
6
|
+
const lines = Object.entries(obj).map(([k, v]) => {
|
|
7
|
+
const key = toSnakeCase(k);
|
|
8
|
+
if (typeof v === "string")
|
|
9
|
+
return ` ${key}: "${v}"`;
|
|
10
|
+
return ` ${key}: ${v}`;
|
|
11
|
+
});
|
|
12
|
+
return `${name} {\n${lines.join("\n")}\n}`;
|
|
13
|
+
}
|
|
14
|
+
const WS_DEFAULTS = { port: -1, no_tls: true };
|
|
15
|
+
export function buildConfig(opts) {
|
|
16
|
+
if (!opts.websocket)
|
|
17
|
+
return null;
|
|
18
|
+
const ws = opts.websocket === true
|
|
19
|
+
? { ...WS_DEFAULTS }
|
|
20
|
+
: { ...WS_DEFAULTS, ...opts.websocket };
|
|
21
|
+
const parts = [serializeBlock("websocket", ws)];
|
|
22
|
+
if (opts.config) {
|
|
23
|
+
parts.push(`include '${resolvePath(opts.config)}'`);
|
|
24
|
+
}
|
|
25
|
+
return parts.join("\n\n") + "\n";
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAInD,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,GAAgB;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;QACrD,OAAO,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7C,CAAC;AAED,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAE5D,MAAM,UAAU,WAAW,CAAC,IAG3B;IACC,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,EAAE,GACN,IAAI,CAAC,SAAS,KAAK,IAAI;QACrB,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE;QACpB,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAa,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAE1D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACnC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,29 +3,99 @@ export interface NatsServerOptions {
|
|
|
3
3
|
port?: number;
|
|
4
4
|
/** Host to bind to. Default: 127.0.0.1 */
|
|
5
5
|
host?: string;
|
|
6
|
-
/**
|
|
6
|
+
/** Server name. Default: auto-generated by NATS */
|
|
7
|
+
serverName?: string;
|
|
8
|
+
/** File to store PID */
|
|
9
|
+
pidFile?: string;
|
|
10
|
+
/** HTTP monitoring port */
|
|
11
|
+
httpPort?: number;
|
|
12
|
+
/** HTTPS monitoring port */
|
|
13
|
+
httpsPort?: number;
|
|
14
|
+
/** Client URL to advertise to other servers */
|
|
15
|
+
clientAdvertise?: string;
|
|
16
|
+
/** Directory to write ports file */
|
|
17
|
+
portsFileDir?: string;
|
|
18
|
+
/** Enable NATS debug output (-D flag) */
|
|
19
|
+
debug?: boolean;
|
|
20
|
+
/** Enable NATS protocol trace (-V flag) */
|
|
21
|
+
trace?: boolean;
|
|
22
|
+
/** Redirect NATS log output to file */
|
|
23
|
+
log?: string;
|
|
24
|
+
/** Timestamp log entries */
|
|
25
|
+
logtime?: boolean;
|
|
26
|
+
/** Log to syslog */
|
|
27
|
+
syslog?: boolean;
|
|
28
|
+
/** Remote syslog address (e.g. udp://localhost:514) */
|
|
29
|
+
remoteSyslog?: string;
|
|
30
|
+
/** Logfile size limit */
|
|
31
|
+
logSizeLimit?: string;
|
|
32
|
+
/** Maximum printable length for traced messages */
|
|
33
|
+
maxTracedMsgLen?: number;
|
|
34
|
+
/** Enable JetStream */
|
|
7
35
|
jetstream?: boolean;
|
|
8
|
-
/** JetStream storage directory
|
|
36
|
+
/** JetStream storage directory */
|
|
9
37
|
storeDir?: string;
|
|
10
|
-
/**
|
|
11
|
-
|
|
38
|
+
/** Username required for connections */
|
|
39
|
+
user?: string;
|
|
40
|
+
/** Password required for connections */
|
|
41
|
+
pass?: string;
|
|
42
|
+
/** Authorization token required for connections */
|
|
43
|
+
token?: string;
|
|
44
|
+
/** Enable TLS */
|
|
45
|
+
tls?: boolean;
|
|
46
|
+
/** Server certificate file */
|
|
47
|
+
tlsCert?: string;
|
|
48
|
+
/** Private key for server certificate */
|
|
49
|
+
tlsKey?: string;
|
|
50
|
+
/** Enable TLS with client certificate verification */
|
|
51
|
+
tlsVerify?: boolean;
|
|
52
|
+
/** Client certificate CA for verification */
|
|
53
|
+
tlsCaCert?: string;
|
|
54
|
+
/** Routes to solicit and connect */
|
|
55
|
+
routes?: string[];
|
|
56
|
+
/** Cluster URL for solicited routes */
|
|
57
|
+
cluster?: string;
|
|
58
|
+
/** Cluster name */
|
|
59
|
+
clusterName?: string;
|
|
60
|
+
/** Do not advertise known cluster information to clients */
|
|
61
|
+
noAdvertise?: boolean;
|
|
62
|
+
/** Cluster URL to advertise to other servers */
|
|
63
|
+
clusterAdvertise?: string;
|
|
64
|
+
/** Number of connect retries for implicit routes */
|
|
65
|
+
connectRetries?: number;
|
|
66
|
+
/** Cluster URL from which members can solicit routes */
|
|
67
|
+
clusterListen?: string;
|
|
68
|
+
/** Profiling HTTP port */
|
|
69
|
+
profile?: number;
|
|
70
|
+
/** WebSocket listener. true = embedded defaults (random port, no TLS).
|
|
71
|
+
* Object = full websocket config block passed to NATS. */
|
|
72
|
+
websocket?: boolean | Record<string, unknown>;
|
|
73
|
+
/** Forward nats-server stderr to process.stderr. Default: false */
|
|
74
|
+
verbose?: boolean;
|
|
12
75
|
/** Path to a custom nats.conf file */
|
|
13
76
|
config?: string;
|
|
14
77
|
/** Extra CLI arguments passed to nats-server */
|
|
15
78
|
args?: string[];
|
|
16
79
|
}
|
|
80
|
+
export declare function buildArgs(opts: NatsServerOptions, configPath?: string): string[];
|
|
17
81
|
export declare class NatsServer {
|
|
18
82
|
/** Full NATS connection URL (e.g. nats://127.0.0.1:52431) */
|
|
19
83
|
readonly url: string;
|
|
20
84
|
/** Assigned port */
|
|
21
85
|
readonly port: number;
|
|
86
|
+
/** WebSocket port (undefined if websocket not enabled) */
|
|
87
|
+
readonly wsPort?: number;
|
|
88
|
+
/** WebSocket URL (undefined if websocket not enabled) */
|
|
89
|
+
readonly wsUrl?: string;
|
|
22
90
|
/** Resolves with the exit code when the process exits (for crash detection) */
|
|
23
91
|
readonly exited: Promise<number | null>;
|
|
24
92
|
private proc;
|
|
93
|
+
private configDir;
|
|
25
94
|
private constructor();
|
|
26
95
|
static start(opts?: NatsServerOptions): Promise<NatsServer>;
|
|
27
96
|
/** Gracefully stop the server (SIGTERM → 5s timeout → SIGKILL) */
|
|
28
97
|
stop(): Promise<void>;
|
|
29
98
|
}
|
|
30
99
|
export { resolve as resolveBinary } from "./resolve.js";
|
|
100
|
+
export { buildConfig } from "./config.js";
|
|
31
101
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,102 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdtempSync, writeFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
2
5
|
import { resolve } from "./resolve.js";
|
|
3
|
-
import { parsePort } from "./parse.js";
|
|
6
|
+
import { parsePort, parseWsPort } from "./parse.js";
|
|
7
|
+
import { buildConfig } from "./config.js";
|
|
8
|
+
/**
|
|
9
|
+
* Maps option keys to their nats-server CLI flags.
|
|
10
|
+
* - boolean options: flag is pushed only when true
|
|
11
|
+
* - string/number options: flag + value
|
|
12
|
+
* - string[] options: flag + comma-joined value
|
|
13
|
+
*
|
|
14
|
+
* Keys not in this map are handled separately (host, port, verbose, websocket, config, args).
|
|
15
|
+
*/
|
|
16
|
+
const FLAG_MAP = {
|
|
17
|
+
serverName: "--server_name",
|
|
18
|
+
pidFile: "-P",
|
|
19
|
+
httpPort: "-m",
|
|
20
|
+
httpsPort: "-ms",
|
|
21
|
+
clientAdvertise: "--client_advertise",
|
|
22
|
+
portsFileDir: "--ports_file_dir",
|
|
23
|
+
debug: "-D",
|
|
24
|
+
trace: "-V",
|
|
25
|
+
log: "-l",
|
|
26
|
+
logtime: "-T",
|
|
27
|
+
syslog: "-s",
|
|
28
|
+
remoteSyslog: "-r",
|
|
29
|
+
logSizeLimit: "--log_size_limit",
|
|
30
|
+
maxTracedMsgLen: "--max_traced_msg_len",
|
|
31
|
+
jetstream: "-js",
|
|
32
|
+
storeDir: "-sd",
|
|
33
|
+
user: "--user",
|
|
34
|
+
pass: "--pass",
|
|
35
|
+
token: "--auth",
|
|
36
|
+
tls: "--tls",
|
|
37
|
+
tlsCert: "--tlscert",
|
|
38
|
+
tlsKey: "--tlskey",
|
|
39
|
+
tlsVerify: "--tlsverify",
|
|
40
|
+
tlsCaCert: "--tlscacert",
|
|
41
|
+
routes: "--routes",
|
|
42
|
+
cluster: "--cluster",
|
|
43
|
+
clusterName: "--cluster_name",
|
|
44
|
+
noAdvertise: "--no_advertise",
|
|
45
|
+
clusterAdvertise: "--cluster_advertise",
|
|
46
|
+
connectRetries: "--connect_retries",
|
|
47
|
+
clusterListen: "--cluster_listen",
|
|
48
|
+
profile: "--profile",
|
|
49
|
+
};
|
|
50
|
+
export function buildArgs(opts, configPath) {
|
|
51
|
+
const host = opts.host ?? "127.0.0.1";
|
|
52
|
+
const port = opts.port ?? -1;
|
|
53
|
+
const args = ["-a", host, "-p", String(port)];
|
|
54
|
+
for (const [key, flag] of Object.entries(FLAG_MAP)) {
|
|
55
|
+
const val = opts[key];
|
|
56
|
+
if (val === undefined || val === false)
|
|
57
|
+
continue;
|
|
58
|
+
if (val === true) {
|
|
59
|
+
args.push(flag);
|
|
60
|
+
}
|
|
61
|
+
else if (Array.isArray(val)) {
|
|
62
|
+
args.push(flag, val.join(","));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
args.push(flag, String(val));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (configPath) {
|
|
69
|
+
args.push("-c", configPath);
|
|
70
|
+
}
|
|
71
|
+
else if (opts.config) {
|
|
72
|
+
args.push("-c", opts.config);
|
|
73
|
+
}
|
|
74
|
+
if (opts.args)
|
|
75
|
+
args.push(...opts.args);
|
|
76
|
+
return args;
|
|
77
|
+
}
|
|
4
78
|
export class NatsServer {
|
|
5
79
|
/** Full NATS connection URL (e.g. nats://127.0.0.1:52431) */
|
|
6
80
|
url;
|
|
7
81
|
/** Assigned port */
|
|
8
82
|
port;
|
|
83
|
+
/** WebSocket port (undefined if websocket not enabled) */
|
|
84
|
+
wsPort;
|
|
85
|
+
/** WebSocket URL (undefined if websocket not enabled) */
|
|
86
|
+
wsUrl;
|
|
9
87
|
/** Resolves with the exit code when the process exits (for crash detection) */
|
|
10
88
|
exited;
|
|
11
89
|
proc;
|
|
12
|
-
|
|
90
|
+
configDir;
|
|
91
|
+
constructor(proc, host, port, wsPort, configDir) {
|
|
13
92
|
this.proc = proc;
|
|
14
93
|
this.port = port;
|
|
15
94
|
this.url = `nats://${host}:${port}`;
|
|
95
|
+
if (wsPort !== undefined) {
|
|
96
|
+
this.wsPort = wsPort;
|
|
97
|
+
this.wsUrl = `ws://${host}:${wsPort}`;
|
|
98
|
+
}
|
|
99
|
+
this.configDir = configDir;
|
|
16
100
|
this.exited = new Promise((res) => {
|
|
17
101
|
proc.on("exit", (code) => res(code));
|
|
18
102
|
});
|
|
@@ -20,21 +104,21 @@ export class NatsServer {
|
|
|
20
104
|
static async start(opts = {}) {
|
|
21
105
|
const bin = resolve();
|
|
22
106
|
const host = opts.host ?? "127.0.0.1";
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
107
|
+
const needWs = !!opts.websocket;
|
|
108
|
+
// Generate config file if needed (websocket requires config block)
|
|
109
|
+
let configDir = null;
|
|
110
|
+
let configPath;
|
|
111
|
+
const configContent = buildConfig(opts);
|
|
112
|
+
if (configContent) {
|
|
113
|
+
configDir = mkdtempSync(join(tmpdir(), "nats-embedded-"));
|
|
114
|
+
configPath = join(configDir, "nats.conf");
|
|
115
|
+
writeFileSync(configPath, configContent);
|
|
29
116
|
}
|
|
30
|
-
|
|
31
|
-
args.push("-c", opts.config);
|
|
32
|
-
if (opts.args)
|
|
33
|
-
args.push(...opts.args);
|
|
117
|
+
const args = buildArgs(opts, configPath);
|
|
34
118
|
const proc = spawn(bin, args, {
|
|
35
119
|
stdio: ["ignore", "ignore", "pipe"],
|
|
36
120
|
});
|
|
37
|
-
const
|
|
121
|
+
const result = await new Promise((resolve, reject) => {
|
|
38
122
|
const timeout = setTimeout(() => {
|
|
39
123
|
proc.kill("SIGKILL");
|
|
40
124
|
reject(new Error("nats-server did not start within 5s"));
|
|
@@ -47,27 +131,40 @@ export class NatsServer {
|
|
|
47
131
|
clearTimeout(timeout);
|
|
48
132
|
reject(new Error(`nats-server exited with code ${code} before ready`));
|
|
49
133
|
});
|
|
134
|
+
let tcpPort = null;
|
|
135
|
+
let wsPort = null;
|
|
136
|
+
let resolved = false;
|
|
50
137
|
let buffer = "";
|
|
51
138
|
proc.stderr.on("data", (chunk) => {
|
|
52
139
|
const text = chunk.toString();
|
|
53
|
-
if (opts.
|
|
140
|
+
if (opts.verbose)
|
|
54
141
|
process.stderr.write(text);
|
|
142
|
+
if (resolved)
|
|
143
|
+
return;
|
|
55
144
|
buffer += text;
|
|
56
145
|
const lines = buffer.split("\n");
|
|
57
146
|
buffer = lines.pop();
|
|
58
147
|
for (const line of lines) {
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
148
|
+
const tcp = parsePort(line);
|
|
149
|
+
if (tcp !== null)
|
|
150
|
+
tcpPort = tcp;
|
|
151
|
+
const ws = parseWsPort(line);
|
|
152
|
+
if (ws !== null)
|
|
153
|
+
wsPort = ws;
|
|
154
|
+
if (tcpPort !== null && (!needWs || wsPort !== null)) {
|
|
155
|
+
resolved = true;
|
|
61
156
|
clearTimeout(timeout);
|
|
62
|
-
// Stop listening for exit as an error once we have the port
|
|
63
157
|
proc.removeAllListeners("exit");
|
|
64
|
-
resolve(
|
|
158
|
+
resolve({
|
|
159
|
+
tcpPort,
|
|
160
|
+
wsPort: wsPort ?? undefined,
|
|
161
|
+
});
|
|
65
162
|
return;
|
|
66
163
|
}
|
|
67
164
|
}
|
|
68
165
|
});
|
|
69
166
|
});
|
|
70
|
-
return new NatsServer(proc, host,
|
|
167
|
+
return new NatsServer(proc, host, result.tcpPort, result.wsPort, configDir);
|
|
71
168
|
}
|
|
72
169
|
/** Gracefully stop the server (SIGTERM → 5s timeout → SIGKILL) */
|
|
73
170
|
async stop() {
|
|
@@ -82,7 +179,15 @@ export class NatsServer {
|
|
|
82
179
|
this.proc.kill("SIGKILL");
|
|
83
180
|
await this.exited;
|
|
84
181
|
}
|
|
182
|
+
if (this.configDir) {
|
|
183
|
+
try {
|
|
184
|
+
rmSync(this.configDir, { recursive: true });
|
|
185
|
+
}
|
|
186
|
+
catch { }
|
|
187
|
+
this.configDir = null;
|
|
188
|
+
}
|
|
85
189
|
}
|
|
86
190
|
}
|
|
87
191
|
export { resolve as resolveBinary } from "./resolve.js";
|
|
192
|
+
export { buildConfig } from "./config.js";
|
|
88
193
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/parse.d.ts
CHANGED
package/dist/parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrD"}
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvD"}
|
package/dist/parse.js
CHANGED
|
@@ -2,4 +2,8 @@ export function parsePort(line) {
|
|
|
2
2
|
const match = line.match(/Listening for client connections on .+:(\d+)/);
|
|
3
3
|
return match ? parseInt(match[1], 10) : null;
|
|
4
4
|
}
|
|
5
|
+
export function parseWsPort(line) {
|
|
6
|
+
const match = line.match(/Listening for websocket clients on .+:(\d+)/);
|
|
7
|
+
return match ? parseInt(match[1], 10) : null;
|
|
8
|
+
}
|
|
5
9
|
//# sourceMappingURL=parse.js.map
|
package/dist/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lagz0ne/nats-embedded",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Embedded NATS server for Node.js and Bun — managed child process with random port allocation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"test": "bun test"
|
|
31
31
|
},
|
|
32
32
|
"optionalDependencies": {
|
|
33
|
-
"@lagz0ne/nats-embedded-linux-x64": "0.
|
|
34
|
-
"@lagz0ne/nats-embedded-linux-arm64": "0.
|
|
35
|
-
"@lagz0ne/nats-embedded-darwin-x64": "0.
|
|
36
|
-
"@lagz0ne/nats-embedded-darwin-arm64": "0.
|
|
37
|
-
"@lagz0ne/nats-embedded-win32-x64": "0.
|
|
38
|
-
"@lagz0ne/nats-embedded-win32-arm64": "0.
|
|
33
|
+
"@lagz0ne/nats-embedded-linux-x64": "0.3.0",
|
|
34
|
+
"@lagz0ne/nats-embedded-linux-arm64": "0.3.0",
|
|
35
|
+
"@lagz0ne/nats-embedded-darwin-x64": "0.3.0",
|
|
36
|
+
"@lagz0ne/nats-embedded-darwin-arm64": "0.3.0",
|
|
37
|
+
"@lagz0ne/nats-embedded-win32-x64": "0.3.0",
|
|
38
|
+
"@lagz0ne/nats-embedded-win32-arm64": "0.3.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"typescript": "^5.7.0",
|