nlcurl 0.3.0 → 0.4.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/args.d.ts.map +1 -1
- package/dist/cli/args.js +84 -90
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.js +25 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +2 -2
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +55 -55
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +1 -1
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +20 -22
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +1 -1
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +20 -22
- package/dist/cookies/parser.js.map +1 -1
- package/dist/core/client.d.ts +3 -3
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +9 -8
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +64 -21
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +112 -36
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +10 -5
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/response.d.ts +2 -2
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +6 -8
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +7 -6
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +58 -43
- package/dist/core/session.js.map +1 -1
- package/dist/core/validation.d.ts +96 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +246 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/fingerprints/akamai.d.ts +1 -1
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +3 -7
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +7 -7
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +12 -18
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +4 -4
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +1 -1
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +12 -12
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/profiles/chrome.d.ts +1 -1
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +59 -100
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +1 -1
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +26 -26
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +35 -85
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +1 -1
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +35 -68
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +1 -1
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +24 -57
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +1 -1
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/http/h1/client.d.ts +4 -4
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +31 -31
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +1 -1
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +17 -19
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +1 -1
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +29 -33
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +5 -4
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +59 -71
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +7 -3
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +16 -12
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +328 -130
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/negotiator.d.ts +4 -4
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +27 -33
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +5 -5
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +5 -5
- package/dist/http/pool.js.map +1 -1
- package/dist/index.d.ts +16 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware/interceptor.d.ts +2 -2
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +2 -0
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry.d.ts +6 -4
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +10 -8
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/http-proxy.d.ts +1 -1
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +14 -14
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +1 -1
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +31 -27
- package/dist/proxy/socks.js.map +1 -1
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +1 -4
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/node-engine.d.ts +2 -2
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +60 -58
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/stealth/client-hello.d.ts +1 -1
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +8 -14
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +2 -2
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +27 -26
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +3 -3
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +62 -74
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +2 -2
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +20 -20
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +1 -1
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +13 -13
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/types.d.ts +4 -4
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +6 -0
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/encoding.d.ts +1 -1
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +23 -25
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/logger.d.ts +48 -7
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +61 -13
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +2 -2
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +2 -2
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +67 -71
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +8 -8
- package/dist/ws/frame.js.map +1 -1
- package/package.json +60 -57
package/dist/utils/logger.js
CHANGED
|
@@ -9,19 +9,56 @@ const LEVEL_ORDER = {
|
|
|
9
9
|
* Default {@link Logger} implementation that writes to `process.stderr`.
|
|
10
10
|
* Messages are prefixed with `[nlcurl:<level>]` and only emitted when the
|
|
11
11
|
* message severity meets or exceeds the configured `level`.
|
|
12
|
+
*
|
|
13
|
+
* Supports scoped child loggers via {@link ConsoleLogger.child}, which
|
|
14
|
+
* prepend a component tag to every message for easy filtering.
|
|
12
15
|
*/
|
|
13
16
|
export class ConsoleLogger {
|
|
14
17
|
level;
|
|
18
|
+
prefix;
|
|
19
|
+
bindings;
|
|
15
20
|
/**
|
|
16
21
|
* Creates a new ConsoleLogger.
|
|
17
22
|
*
|
|
18
|
-
* @param {LogLevel}
|
|
23
|
+
* @param {LogLevel} [level='warn'] - Minimum severity level to emit.
|
|
24
|
+
* @param {string} [prefix=''] - Component prefix prepended to every message.
|
|
25
|
+
* @param {LogBindings} [bindings={}] - Key-value metadata appended to every message.
|
|
26
|
+
*/
|
|
27
|
+
constructor(level = "warn", prefix = "", bindings = {}) {
|
|
28
|
+
this.level = LEVEL_ORDER[level];
|
|
29
|
+
this.prefix = prefix;
|
|
30
|
+
this.bindings = bindings;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Creates a child logger that inherits this logger's level and prepends
|
|
34
|
+
* an additional component tag to every message. Bindings from the parent
|
|
35
|
+
* are merged with the child's bindings (child values win on conflict).
|
|
36
|
+
*
|
|
37
|
+
* @param {LogBindings} bindings - Additional metadata for the child scope.
|
|
38
|
+
* @returns {ConsoleLogger} A new scoped logger instance.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const logger = new ConsoleLogger('debug');
|
|
42
|
+
* const child = logger.child({ component: 'h2' });
|
|
43
|
+
* child.debug('stream opened', { streamId: 1 });
|
|
19
44
|
*/
|
|
20
|
-
|
|
45
|
+
child(bindings) {
|
|
46
|
+
const component = typeof bindings["component"] === "string" ? bindings["component"] : "";
|
|
47
|
+
const childPrefix = this.prefix ? (component ? `${this.prefix}:${component}` : this.prefix) : component;
|
|
48
|
+
const merged = { ...this.bindings, ...bindings };
|
|
49
|
+
return new ConsoleLogger(this.resolveLevel(), childPrefix, merged);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Updates the minimum severity level at runtime without creating a new
|
|
53
|
+
* logger instance.
|
|
54
|
+
*
|
|
55
|
+
* @param {LogLevel} level - New minimum severity level.
|
|
56
|
+
*/
|
|
57
|
+
setLevel(level) {
|
|
21
58
|
this.level = LEVEL_ORDER[level];
|
|
22
59
|
}
|
|
23
60
|
/**
|
|
24
|
-
* Emits a debug-level message to `stderr`
|
|
61
|
+
* Emits a debug-level message to `stderr` -- only written when the
|
|
25
62
|
* configured minimum level is `'debug'`.
|
|
26
63
|
*
|
|
27
64
|
* @param {string} message - Primary log message.
|
|
@@ -29,11 +66,11 @@ export class ConsoleLogger {
|
|
|
29
66
|
*/
|
|
30
67
|
debug(message, ...args) {
|
|
31
68
|
if (this.level <= LEVEL_ORDER.debug) {
|
|
32
|
-
|
|
69
|
+
this.write("debug", message, args);
|
|
33
70
|
}
|
|
34
71
|
}
|
|
35
72
|
/**
|
|
36
|
-
* Emits an info-level message to `stderr`
|
|
73
|
+
* Emits an info-level message to `stderr` -- only written when the
|
|
37
74
|
* configured minimum level is `'debug'` or `'info'`.
|
|
38
75
|
*
|
|
39
76
|
* @param {string} message - Primary log message.
|
|
@@ -41,11 +78,11 @@ export class ConsoleLogger {
|
|
|
41
78
|
*/
|
|
42
79
|
info(message, ...args) {
|
|
43
80
|
if (this.level <= LEVEL_ORDER.info) {
|
|
44
|
-
|
|
81
|
+
this.write("info", message, args);
|
|
45
82
|
}
|
|
46
83
|
}
|
|
47
84
|
/**
|
|
48
|
-
* Emits a warn-level message to `stderr`
|
|
85
|
+
* Emits a warn-level message to `stderr` -- only written when the
|
|
49
86
|
* configured minimum level is `'debug'`, `'info'`, or `'warn'`.
|
|
50
87
|
*
|
|
51
88
|
* @param {string} message - Primary log message.
|
|
@@ -53,11 +90,11 @@ export class ConsoleLogger {
|
|
|
53
90
|
*/
|
|
54
91
|
warn(message, ...args) {
|
|
55
92
|
if (this.level <= LEVEL_ORDER.warn) {
|
|
56
|
-
|
|
93
|
+
this.write("warn", message, args);
|
|
57
94
|
}
|
|
58
95
|
}
|
|
59
96
|
/**
|
|
60
|
-
* Emits an error-level message to `stderr`
|
|
97
|
+
* Emits an error-level message to `stderr` -- only written when the
|
|
61
98
|
* configured minimum level is not `'silent'`.
|
|
62
99
|
*
|
|
63
100
|
* @param {string} message - Primary log message.
|
|
@@ -65,13 +102,24 @@ export class ConsoleLogger {
|
|
|
65
102
|
*/
|
|
66
103
|
error(message, ...args) {
|
|
67
104
|
if (this.level <= LEVEL_ORDER.error) {
|
|
68
|
-
|
|
105
|
+
this.write("error", message, args);
|
|
69
106
|
}
|
|
70
107
|
}
|
|
108
|
+
write(level, message, args) {
|
|
109
|
+
const tag = this.prefix ? `nlcurl:${this.prefix}:${level}` : `nlcurl:${level}`;
|
|
110
|
+
process.stderr.write(`[${tag}] ${message}${this.formatArgs(args)}\n`);
|
|
111
|
+
}
|
|
71
112
|
formatArgs(args) {
|
|
72
113
|
if (args.length === 0)
|
|
73
|
-
return
|
|
74
|
-
return
|
|
114
|
+
return "";
|
|
115
|
+
return " " + args.map((a) => (typeof a === "string" ? a : JSON.stringify(a))).join(" ");
|
|
116
|
+
}
|
|
117
|
+
resolveLevel() {
|
|
118
|
+
for (const [name, order] of Object.entries(LEVEL_ORDER)) {
|
|
119
|
+
if (order === this.level)
|
|
120
|
+
return name;
|
|
121
|
+
}
|
|
122
|
+
return "warn";
|
|
75
123
|
}
|
|
76
124
|
}
|
|
77
125
|
/**
|
|
@@ -84,7 +132,7 @@ export const SILENT_LOGGER = {
|
|
|
84
132
|
warn() { },
|
|
85
133
|
error() { },
|
|
86
134
|
};
|
|
87
|
-
let _default = new ConsoleLogger(
|
|
135
|
+
let _default = new ConsoleLogger("warn");
|
|
88
136
|
/**
|
|
89
137
|
* Replaces the process-wide default logger used by all NLcURL internals.
|
|
90
138
|
*
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO7E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,CASpG;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAEzC;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAOpE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C"}
|
package/dist/utils/url.js
CHANGED
|
@@ -55,7 +55,7 @@ export function parseURL(raw) {
|
|
|
55
55
|
*/
|
|
56
56
|
export function originOf(url) {
|
|
57
57
|
const u = new URL(url);
|
|
58
|
-
const port = u.port || (u.protocol ===
|
|
58
|
+
const port = u.port || (u.protocol === "https:" ? "443" : "80");
|
|
59
59
|
return `${u.protocol}//${u.hostname}:${port}`;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
@@ -76,7 +76,7 @@ export function sniHost(url) {
|
|
|
76
76
|
*/
|
|
77
77
|
export function hostPort(url) {
|
|
78
78
|
const u = new URL(url);
|
|
79
|
-
const defaultPort = u.protocol ===
|
|
79
|
+
const defaultPort = u.protocol === "https:" ? 443 : 80;
|
|
80
80
|
return {
|
|
81
81
|
host: u.hostname,
|
|
82
82
|
port: u.port ? parseInt(u.port, 10) : defaultPort,
|
package/dist/utils/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAwB,EAAE,QAAgB;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAkD;IAC1F,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAE5D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,QAAQ;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW;KAClD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;AAC/B,CAAC"}
|
package/dist/ws/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventEmitter } from
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
2
|
/**
|
|
3
3
|
* Options for creating a {@link WebSocketClient} connection.
|
|
4
4
|
*
|
|
@@ -23,7 +23,7 @@ export interface WebSocketOptions {
|
|
|
23
23
|
*
|
|
24
24
|
* @typedef {'connecting' | 'open' | 'closing' | 'closed'} WebSocketState
|
|
25
25
|
*/
|
|
26
|
-
export type WebSocketState =
|
|
26
|
+
export type WebSocketState = "connecting" | "open" | "closing" | "closed";
|
|
27
27
|
/**
|
|
28
28
|
* Typed event map for {@link WebSocketClient}.
|
|
29
29
|
*
|
package/dist/ws/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ws/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ws/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW3C;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,EAAE,CAAC;IACT,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IACxC,KAAK,EAAE,cAAc,CAAgB;IACrC,QAAQ,SAAM;IACrB,SAAgB,GAAG,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,cAAc,CAAuB;IAE7C;;;;;OAKG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAWvD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM5B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9B;;;;;OAKG;IACH,IAAI,CAAC,IAAI,GAAE,MAAwB,GAAG,IAAI;IAK1C;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,SAAO,EAAE,MAAM,SAAK,GAAG,IAAI;IAYrC,OAAO,CAAC,UAAU;YAMJ,OAAO;IA4DrB,OAAO,CAAC,cAAc;IA4FtB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,WAAW;CAwDpB"}
|
package/dist/ws/client.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { EventEmitter } from
|
|
2
|
-
import { NodeTLSEngine } from
|
|
3
|
-
import { StealthTLSEngine } from
|
|
4
|
-
import { getProfile } from
|
|
5
|
-
import { NLcURLError, ConnectionError } from
|
|
6
|
-
import {
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { NodeTLSEngine } from "../tls/node-engine.js";
|
|
3
|
+
import { StealthTLSEngine } from "../tls/stealth/engine.js";
|
|
4
|
+
import { getProfile } from "../fingerprints/database.js";
|
|
5
|
+
import { NLcURLError, ConnectionError } from "../core/errors.js";
|
|
6
|
+
import { validateWebSocketUrl } from "../core/validation.js";
|
|
7
|
+
import { encodeFrame, FrameParser, Opcode, generateWebSocketKey, computeAcceptKey } from "./frame.js";
|
|
7
8
|
/**
|
|
8
9
|
* WebSocket client with optional browser fingerprint impersonation. Emits
|
|
9
10
|
* typed lifecycle events (`open`, `message`, `close`, `error`, `ping`, `pong`).
|
|
@@ -16,8 +17,8 @@ import { encodeFrame, FrameParser, Opcode, generateWebSocketKey, computeAcceptKe
|
|
|
16
17
|
* ws.on('message', (data) => console.log(data));
|
|
17
18
|
*/
|
|
18
19
|
export class WebSocketClient extends EventEmitter {
|
|
19
|
-
state =
|
|
20
|
-
protocol =
|
|
20
|
+
state = "connecting";
|
|
21
|
+
protocol = "";
|
|
21
22
|
url;
|
|
22
23
|
socket = null;
|
|
23
24
|
parser = new FrameParser();
|
|
@@ -31,10 +32,11 @@ export class WebSocketClient extends EventEmitter {
|
|
|
31
32
|
*/
|
|
32
33
|
constructor(url, options = {}) {
|
|
33
34
|
super();
|
|
35
|
+
validateWebSocketUrl(url);
|
|
34
36
|
this.url = url;
|
|
35
37
|
this.connect(url, options).catch((err) => {
|
|
36
|
-
this.state =
|
|
37
|
-
this.emit(
|
|
38
|
+
this.state = "closed";
|
|
39
|
+
this.emit("error", err);
|
|
38
40
|
});
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
@@ -45,7 +47,7 @@ export class WebSocketClient extends EventEmitter {
|
|
|
45
47
|
*/
|
|
46
48
|
sendText(data) {
|
|
47
49
|
this.assertOpen();
|
|
48
|
-
const payload = Buffer.from(data,
|
|
50
|
+
const payload = Buffer.from(data, "utf8");
|
|
49
51
|
this.socket.write(encodeFrame(Opcode.TEXT, payload));
|
|
50
52
|
}
|
|
51
53
|
/**
|
|
@@ -75,73 +77,67 @@ export class WebSocketClient extends EventEmitter {
|
|
|
75
77
|
* @param {number} [code=1000] - WebSocket close status code.
|
|
76
78
|
* @param {string} [reason=''] - Human-readable close reason (UTF-8, max 123 bytes).
|
|
77
79
|
*/
|
|
78
|
-
close(code = 1000, reason =
|
|
79
|
-
if (this.state !==
|
|
80
|
+
close(code = 1000, reason = "") {
|
|
81
|
+
if (this.state !== "open")
|
|
80
82
|
return;
|
|
81
|
-
this.state =
|
|
82
|
-
const reasonBuf = Buffer.from(reason,
|
|
83
|
+
this.state = "closing";
|
|
84
|
+
const reasonBuf = Buffer.from(reason, "utf8");
|
|
83
85
|
const payload = Buffer.allocUnsafe(2 + reasonBuf.length);
|
|
84
86
|
payload.writeUInt16BE(code, 0);
|
|
85
87
|
reasonBuf.copy(payload, 2);
|
|
86
88
|
this.socket.write(encodeFrame(Opcode.CLOSE, payload));
|
|
87
89
|
}
|
|
88
90
|
assertOpen() {
|
|
89
|
-
if (this.state !==
|
|
90
|
-
throw new NLcURLError(
|
|
91
|
+
if (this.state !== "open") {
|
|
92
|
+
throw new NLcURLError("WebSocket is not open", "ERR_WS_NOT_OPEN");
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
95
|
async connect(url, options) {
|
|
94
96
|
const parsed = new URL(url);
|
|
95
|
-
const isSecure = parsed.protocol ===
|
|
96
|
-
const port = parsed.port
|
|
97
|
-
? parseInt(parsed.port, 10)
|
|
98
|
-
: isSecure ? 443 : 80;
|
|
97
|
+
const isSecure = parsed.protocol === "wss:";
|
|
98
|
+
const port = parsed.port ? parseInt(parsed.port, 10) : isSecure ? 443 : 80;
|
|
99
99
|
const host = parsed.hostname;
|
|
100
|
-
const profile = options.impersonate
|
|
101
|
-
? getProfile(options.impersonate) ?? undefined
|
|
102
|
-
: undefined;
|
|
100
|
+
const profile = options.impersonate ? (getProfile(options.impersonate) ?? undefined) : undefined;
|
|
103
101
|
let transport;
|
|
104
102
|
if (isSecure) {
|
|
105
|
-
const engine = options.stealth
|
|
106
|
-
? new StealthTLSEngine()
|
|
107
|
-
: new NodeTLSEngine();
|
|
103
|
+
const engine = options.stealth ? new StealthTLSEngine() : new NodeTLSEngine();
|
|
108
104
|
const tlsOpts = {
|
|
109
105
|
host,
|
|
110
106
|
port,
|
|
111
107
|
servername: host,
|
|
112
108
|
insecure: options.insecure ?? false,
|
|
113
|
-
alpnProtocols: [
|
|
109
|
+
alpnProtocols: ["http/1.1"],
|
|
114
110
|
timeout: options.timeout,
|
|
115
111
|
};
|
|
116
112
|
const tlsSocket = await engine.connect(tlsOpts, profile);
|
|
117
113
|
transport = tlsSocket;
|
|
118
114
|
}
|
|
119
115
|
else {
|
|
120
|
-
const net = await import(
|
|
116
|
+
const net = await import("node:net");
|
|
121
117
|
transport = await new Promise((resolve, reject) => {
|
|
122
118
|
const sock = net.createConnection({ host, port }, () => resolve(sock));
|
|
123
|
-
sock.once(
|
|
119
|
+
sock.once("error", reject);
|
|
124
120
|
if (options.timeout) {
|
|
125
121
|
sock.setTimeout(options.timeout, () => {
|
|
126
122
|
sock.destroy();
|
|
127
|
-
reject(new ConnectionError(
|
|
123
|
+
reject(new ConnectionError("WebSocket connection timed out"));
|
|
128
124
|
});
|
|
129
125
|
}
|
|
130
126
|
});
|
|
131
127
|
}
|
|
132
128
|
this.socket = transport;
|
|
133
129
|
await this.performUpgrade(transport, parsed, options);
|
|
134
|
-
this.state =
|
|
135
|
-
this.emit(
|
|
136
|
-
transport.on(
|
|
137
|
-
transport.on(
|
|
138
|
-
this.state =
|
|
139
|
-
this.emit(
|
|
130
|
+
this.state = "open";
|
|
131
|
+
this.emit("open");
|
|
132
|
+
transport.on("data", (chunk) => this.onData(chunk));
|
|
133
|
+
transport.on("error", (err) => {
|
|
134
|
+
this.state = "closed";
|
|
135
|
+
this.emit("error", err);
|
|
140
136
|
});
|
|
141
|
-
transport.on(
|
|
142
|
-
if (this.state !==
|
|
143
|
-
this.state =
|
|
144
|
-
this.emit(
|
|
137
|
+
transport.on("close", () => {
|
|
138
|
+
if (this.state !== "closed") {
|
|
139
|
+
this.state = "closed";
|
|
140
|
+
this.emit("close", 1006, "Connection lost");
|
|
145
141
|
}
|
|
146
142
|
});
|
|
147
143
|
this.drainBufferedFrames();
|
|
@@ -149,7 +145,7 @@ export class WebSocketClient extends EventEmitter {
|
|
|
149
145
|
performUpgrade(socket, url, options) {
|
|
150
146
|
return new Promise((resolve, reject) => {
|
|
151
147
|
const key = generateWebSocketKey();
|
|
152
|
-
const path = (url.pathname ||
|
|
148
|
+
const path = (url.pathname || "/") + (url.search || "");
|
|
153
149
|
let request = `GET ${path} HTTP/1.1\r\n`;
|
|
154
150
|
request += `Host: ${url.host}\r\n`;
|
|
155
151
|
request += `Upgrade: websocket\r\n`;
|
|
@@ -157,7 +153,7 @@ export class WebSocketClient extends EventEmitter {
|
|
|
157
153
|
request += `Sec-WebSocket-Key: ${key}\r\n`;
|
|
158
154
|
request += `Sec-WebSocket-Version: 13\r\n`;
|
|
159
155
|
if (options.protocols && options.protocols.length > 0) {
|
|
160
|
-
request += `Sec-WebSocket-Protocol: ${options.protocols.join(
|
|
156
|
+
request += `Sec-WebSocket-Protocol: ${options.protocols.join(", ")}\r\n`;
|
|
161
157
|
}
|
|
162
158
|
if (options.headers) {
|
|
163
159
|
for (const [k, v] of Object.entries(options.headers)) {
|
|
@@ -170,37 +166,37 @@ export class WebSocketClient extends EventEmitter {
|
|
|
170
166
|
const expectedAccept = computeAcceptKey(key);
|
|
171
167
|
const onData = (chunk) => {
|
|
172
168
|
responseData = Buffer.concat([responseData, chunk]);
|
|
173
|
-
const text = responseData.toString(
|
|
174
|
-
const headerEnd = text.indexOf(
|
|
169
|
+
const text = responseData.toString("utf8");
|
|
170
|
+
const headerEnd = text.indexOf("\r\n\r\n");
|
|
175
171
|
if (headerEnd === -1) {
|
|
176
172
|
if (responseData.length > 16384) {
|
|
177
173
|
cleanup();
|
|
178
|
-
reject(new NLcURLError(
|
|
174
|
+
reject(new NLcURLError("WebSocket upgrade response too large", "ERR_WS_UPGRADE"));
|
|
179
175
|
}
|
|
180
176
|
return;
|
|
181
177
|
}
|
|
182
178
|
cleanup();
|
|
183
179
|
const headerStr = text.substring(0, headerEnd);
|
|
184
|
-
const [statusLine, ...headerLines] = headerStr.split(
|
|
180
|
+
const [statusLine, ...headerLines] = headerStr.split("\r\n");
|
|
185
181
|
if (!statusLine) {
|
|
186
|
-
return reject(new NLcURLError(
|
|
182
|
+
return reject(new NLcURLError("Empty upgrade response", "ERR_WS_UPGRADE"));
|
|
187
183
|
}
|
|
188
184
|
const statusMatch = statusLine.match(/^HTTP\/\d\.\d (\d{3})/);
|
|
189
|
-
if (!statusMatch || statusMatch[1] !==
|
|
190
|
-
return reject(new NLcURLError(`WebSocket upgrade failed: ${statusLine}`,
|
|
185
|
+
if (!statusMatch || statusMatch[1] !== "101") {
|
|
186
|
+
return reject(new NLcURLError(`WebSocket upgrade failed: ${statusLine}`, "ERR_WS_UPGRADE"));
|
|
191
187
|
}
|
|
192
188
|
const headers = new Map();
|
|
193
189
|
for (const line of headerLines) {
|
|
194
|
-
const colonIdx = line.indexOf(
|
|
190
|
+
const colonIdx = line.indexOf(":");
|
|
195
191
|
if (colonIdx > 0) {
|
|
196
192
|
headers.set(line.substring(0, colonIdx).trim().toLowerCase(), line.substring(colonIdx + 1).trim());
|
|
197
193
|
}
|
|
198
194
|
}
|
|
199
|
-
const accept = headers.get(
|
|
195
|
+
const accept = headers.get("sec-websocket-accept");
|
|
200
196
|
if (accept !== expectedAccept) {
|
|
201
|
-
return reject(new NLcURLError(
|
|
197
|
+
return reject(new NLcURLError("Invalid Sec-WebSocket-Accept header", "ERR_WS_UPGRADE"));
|
|
202
198
|
}
|
|
203
|
-
this.protocol = headers.get(
|
|
199
|
+
this.protocol = headers.get("sec-websocket-protocol") ?? "";
|
|
204
200
|
const remaining = responseData.subarray(headerEnd + 4);
|
|
205
201
|
if (remaining.length > 0) {
|
|
206
202
|
this.parser.push(remaining);
|
|
@@ -212,11 +208,11 @@ export class WebSocketClient extends EventEmitter {
|
|
|
212
208
|
reject(err);
|
|
213
209
|
};
|
|
214
210
|
const cleanup = () => {
|
|
215
|
-
socket.removeListener(
|
|
216
|
-
socket.removeListener(
|
|
211
|
+
socket.removeListener("data", onData);
|
|
212
|
+
socket.removeListener("error", onError);
|
|
217
213
|
};
|
|
218
|
-
socket.on(
|
|
219
|
-
socket.on(
|
|
214
|
+
socket.on("data", onData);
|
|
215
|
+
socket.on("error", onError);
|
|
220
216
|
});
|
|
221
217
|
}
|
|
222
218
|
onData(chunk) {
|
|
@@ -235,8 +231,8 @@ export class WebSocketClient extends EventEmitter {
|
|
|
235
231
|
case Opcode.BINARY:
|
|
236
232
|
if (frame.fin) {
|
|
237
233
|
const isBinary = frame.opcode === Opcode.BINARY;
|
|
238
|
-
const data = isBinary ? frame.payload : frame.payload.toString(
|
|
239
|
-
this.emit(
|
|
234
|
+
const data = isBinary ? frame.payload : frame.payload.toString("utf8");
|
|
235
|
+
this.emit("message", data, isBinary);
|
|
240
236
|
}
|
|
241
237
|
else {
|
|
242
238
|
this.fragmentOpcode = frame.opcode;
|
|
@@ -249,34 +245,34 @@ export class WebSocketClient extends EventEmitter {
|
|
|
249
245
|
const assembled = Buffer.concat(this.fragments);
|
|
250
246
|
this.fragments = [];
|
|
251
247
|
const isBinary = this.fragmentOpcode === Opcode.BINARY;
|
|
252
|
-
const data = isBinary ? assembled : assembled.toString(
|
|
253
|
-
this.emit(
|
|
248
|
+
const data = isBinary ? assembled : assembled.toString("utf8");
|
|
249
|
+
this.emit("message", data, isBinary);
|
|
254
250
|
}
|
|
255
251
|
break;
|
|
256
252
|
case Opcode.CLOSE: {
|
|
257
253
|
let code = 1005;
|
|
258
|
-
let reason =
|
|
254
|
+
let reason = "";
|
|
259
255
|
if (frame.payload.length >= 2) {
|
|
260
256
|
code = frame.payload.readUInt16BE(0);
|
|
261
|
-
reason = frame.payload.subarray(2).toString(
|
|
257
|
+
reason = frame.payload.subarray(2).toString("utf8");
|
|
262
258
|
}
|
|
263
|
-
if (this.state ===
|
|
264
|
-
this.state =
|
|
259
|
+
if (this.state === "open") {
|
|
260
|
+
this.state = "closing";
|
|
265
261
|
this.socket.write(encodeFrame(Opcode.CLOSE, frame.payload));
|
|
266
262
|
}
|
|
267
|
-
this.state =
|
|
263
|
+
this.state = "closed";
|
|
268
264
|
this.socket?.destroy();
|
|
269
|
-
this.emit(
|
|
265
|
+
this.emit("close", code, reason);
|
|
270
266
|
break;
|
|
271
267
|
}
|
|
272
268
|
case Opcode.PING:
|
|
273
|
-
this.emit(
|
|
274
|
-
if (this.state ===
|
|
269
|
+
this.emit("ping", frame.payload);
|
|
270
|
+
if (this.state === "open") {
|
|
275
271
|
this.socket.write(encodeFrame(Opcode.PONG, frame.payload));
|
|
276
272
|
}
|
|
277
273
|
break;
|
|
278
274
|
case Opcode.PONG:
|
|
279
|
-
this.emit(
|
|
275
|
+
this.emit("pong", frame.payload);
|
|
280
276
|
break;
|
|
281
277
|
}
|
|
282
278
|
}
|
package/dist/ws/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ws/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ws/client.ts"],"names":[],"mappings":"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"}
|
package/dist/ws/frame.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/ws/frame.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/ws/frame.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,0BAAkB,MAAM;IACtB,YAAY,IAAM;IAClB,IAAI,IAAM;IACV,MAAM,IAAM;IACZ,KAAK,IAAM;IACX,IAAI,IAAM;IACV,IAAI,KAAM;CACX;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,UAAO,GAAG,MAAM,CA8ChF;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAmB;IAEjC;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB;;;;;;;OAOG;IACH,IAAI,IAAI,cAAc,GAAG,IAAI;CAiD9B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD"}
|
package/dist/ws/frame.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as crypto from
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
2
2
|
/**
|
|
3
3
|
* WebSocket frame opcode values as defined in RFC 6455 §5.2.
|
|
4
4
|
*
|
|
@@ -96,9 +96,9 @@ export class FrameParser {
|
|
|
96
96
|
const byte0 = this.buffer[0];
|
|
97
97
|
const byte1 = this.buffer[1];
|
|
98
98
|
const fin = (byte0 & 0x80) !== 0;
|
|
99
|
-
const opcode = (byte0 &
|
|
99
|
+
const opcode = (byte0 & 0x0f);
|
|
100
100
|
const masked = (byte1 & 0x80) !== 0;
|
|
101
|
-
let payloadLen = byte1 &
|
|
101
|
+
let payloadLen = byte1 & 0x7f;
|
|
102
102
|
let offset = 2;
|
|
103
103
|
if (payloadLen === 126) {
|
|
104
104
|
if (this.buffer.length < 4)
|
|
@@ -111,7 +111,7 @@ export class FrameParser {
|
|
|
111
111
|
return null;
|
|
112
112
|
const len64 = this.buffer.readBigUInt64BE(2);
|
|
113
113
|
if (len64 > 128n * 1024n * 1024n) {
|
|
114
|
-
throw new Error(
|
|
114
|
+
throw new Error("WebSocket frame too large");
|
|
115
115
|
}
|
|
116
116
|
payloadLen = Number(len64);
|
|
117
117
|
offset = 10;
|
|
@@ -144,7 +144,7 @@ export class FrameParser {
|
|
|
144
144
|
* @returns {string} Base64-encoded 16-byte random key.
|
|
145
145
|
*/
|
|
146
146
|
export function generateWebSocketKey() {
|
|
147
|
-
return crypto.randomBytes(16).toString(
|
|
147
|
+
return crypto.randomBytes(16).toString("base64");
|
|
148
148
|
}
|
|
149
149
|
/**
|
|
150
150
|
* Computes the expected `Sec-WebSocket-Accept` header value for the given
|
|
@@ -155,8 +155,8 @@ export function generateWebSocketKey() {
|
|
|
155
155
|
*/
|
|
156
156
|
export function computeAcceptKey(key) {
|
|
157
157
|
return crypto
|
|
158
|
-
.createHash(
|
|
159
|
-
.update(key +
|
|
160
|
-
.digest(
|
|
158
|
+
.createHash("sha1")
|
|
159
|
+
.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
|
|
160
|
+
.digest("base64");
|
|
161
161
|
}
|
|
162
162
|
//# sourceMappingURL=frame.js.map
|
package/dist/ws/frame.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/ws/frame.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/ws/frame.ts"],"names":[],"mappings":"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"}
|