curl-cffi-node 0.1.7

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.
Files changed (46) hide show
  1. package/README.md +716 -0
  2. package/curl-cffi-node.darwin-arm64.node +0 -0
  3. package/curl-cffi-node.darwin-x64.node +0 -0
  4. package/curl-cffi-node.linux-arm64-gnu.node +0 -0
  5. package/curl-cffi-node.linux-x64-gnu.node +0 -0
  6. package/curl-cffi-node.win32-x64-msvc.node +0 -0
  7. package/dist/binding.d.ts +2 -0
  8. package/dist/binding.d.ts.map +1 -0
  9. package/dist/binding.js +90 -0
  10. package/dist/binding.js.map +1 -0
  11. package/dist/enums.d.ts +87 -0
  12. package/dist/enums.d.ts.map +1 -0
  13. package/dist/enums.js +101 -0
  14. package/dist/enums.js.map +1 -0
  15. package/dist/errors.d.ts +61 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +116 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +77 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +88 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/response.d.ts +86 -0
  24. package/dist/response.d.ts.map +1 -0
  25. package/dist/response.js +137 -0
  26. package/dist/response.js.map +1 -0
  27. package/dist/session.d.ts +93 -0
  28. package/dist/session.d.ts.map +1 -0
  29. package/dist/session.js +228 -0
  30. package/dist/session.js.map +1 -0
  31. package/dist/websocket.d.ts +68 -0
  32. package/dist/websocket.d.ts.map +1 -0
  33. package/dist/websocket.js +176 -0
  34. package/dist/websocket.js.map +1 -0
  35. package/npm/darwin-arm64/curl-cffi-node.darwin-arm64.node +0 -0
  36. package/npm/darwin-arm64/package.json +19 -0
  37. package/npm/darwin-x64/curl-cffi-node.darwin-x64.node +0 -0
  38. package/npm/darwin-x64/package.json +19 -0
  39. package/npm/linux-arm64-gnu/curl-cffi-node.linux-arm64-gnu.node +0 -0
  40. package/npm/linux-arm64-gnu/package.json +22 -0
  41. package/npm/linux-x64-gnu/curl-cffi-node.linux-x64-gnu.node +0 -0
  42. package/npm/linux-x64-gnu/package.json +22 -0
  43. package/npm/linux-x64-musl/package.json +14 -0
  44. package/npm/win32-x64-msvc/curl-cffi-node.win32-x64-msvc.node +0 -0
  45. package/npm/win32-x64-msvc/package.json +19 -0
  46. package/package.json +83 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../lib/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * CurlWebSocket — WebSocket client with TLS fingerprint impersonation.
3
+ *
4
+ * Uses curl's native WebSocket API (curl_ws_send/curl_ws_recv) under the hood,
5
+ * providing impersonated TLS handshakes for anti-bot evasion.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const ws = new CurlWebSocket('wss://echo.websocket.org', { impersonate: 'chrome116' });
10
+ * ws.on('open', () => ws.send('Hello!'));
11
+ * ws.on('message', (data) => console.log('Received:', data));
12
+ * ws.on('close', () => console.log('Closed'));
13
+ * await ws.connect();
14
+ * ```
15
+ */
16
+ import { EventEmitter } from 'events';
17
+ export declare const WS_TEXT = 1;
18
+ export declare const WS_BINARY = 2;
19
+ export declare const WS_CLOSE = 8;
20
+ export interface CurlWebSocketOptions {
21
+ /** Browser to impersonate for TLS fingerprinting. */
22
+ impersonate?: string;
23
+ /** Custom headers for the upgrade request. */
24
+ headers?: Record<string, string>;
25
+ /** Whether to apply default browser headers (default: true). */
26
+ defaultHeaders?: boolean;
27
+ /** Timeout for the initial connection in seconds. */
28
+ timeout?: number;
29
+ /** Proxy URL. */
30
+ proxy?: string;
31
+ /** Whether to verify SSL (default: true). */
32
+ verify?: boolean;
33
+ }
34
+ export declare class CurlWebSocket extends EventEmitter {
35
+ private _handle;
36
+ private _url;
37
+ private _options;
38
+ private _connected;
39
+ private _polling;
40
+ private _pollTimer;
41
+ constructor(url: string, options?: CurlWebSocketOptions);
42
+ /** Whether the WebSocket is currently connected. */
43
+ get connected(): boolean;
44
+ /** The WebSocket URL. */
45
+ get url(): string;
46
+ /**
47
+ * Establish the WebSocket connection.
48
+ *
49
+ * Performs the HTTP upgrade handshake and starts the receive loop.
50
+ * Emits 'open' when connected, 'error' on failure.
51
+ */
52
+ connect(): Promise<void>;
53
+ /**
54
+ * Send a text message.
55
+ */
56
+ send(data: string): void;
57
+ /**
58
+ * Send a binary message.
59
+ */
60
+ send(data: Buffer): void;
61
+ /**
62
+ * Close the WebSocket connection gracefully.
63
+ */
64
+ close(): void;
65
+ private _startRecvLoop;
66
+ private _stopRecvLoop;
67
+ }
68
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../lib/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gEAAgE;IAChE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAA+C;gBAErD,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB;IA2C3D,oDAAoD;IACpD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,yBAAyB;IACzB,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACxB;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmBxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAiBb,OAAO,CAAC,cAAc;IAyCtB,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * CurlWebSocket — WebSocket client with TLS fingerprint impersonation.
4
+ *
5
+ * Uses curl's native WebSocket API (curl_ws_send/curl_ws_recv) under the hood,
6
+ * providing impersonated TLS handshakes for anti-bot evasion.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const ws = new CurlWebSocket('wss://echo.websocket.org', { impersonate: 'chrome116' });
11
+ * ws.on('open', () => ws.send('Hello!'));
12
+ * ws.on('message', (data) => console.log('Received:', data));
13
+ * ws.on('close', () => console.log('Closed'));
14
+ * await ws.connect();
15
+ * ```
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.CurlWebSocket = exports.WS_CLOSE = exports.WS_BINARY = exports.WS_TEXT = void 0;
19
+ const events_1 = require("events");
20
+ const binding_js_1 = require("./binding.js");
21
+ const errors_js_1 = require("./errors.js");
22
+ const NativeCurl = binding_js_1.nativeBinding.Curl;
23
+ const NativeCurlOpt = binding_js_1.nativeBinding.CurlOpt;
24
+ // WebSocket frame flags (matching libcurl CURLWS_*)
25
+ exports.WS_TEXT = 1;
26
+ exports.WS_BINARY = 2;
27
+ exports.WS_CLOSE = 8;
28
+ class CurlWebSocket extends events_1.EventEmitter {
29
+ _handle;
30
+ _url;
31
+ _options;
32
+ _connected = false;
33
+ _polling = false;
34
+ _pollTimer = null;
35
+ constructor(url, options = {}) {
36
+ super();
37
+ this._url = url;
38
+ this._options = options;
39
+ this._handle = new NativeCurl();
40
+ // Configure
41
+ this._handle.setoptStr(NativeCurlOpt.Url, url);
42
+ if (options.impersonate) {
43
+ this._handle.impersonateStr(options.impersonate, options.defaultHeaders ?? true);
44
+ }
45
+ if (options.headers) {
46
+ const list = [];
47
+ for (const [k, v] of Object.entries(options.headers)) {
48
+ list.push(`${k}: ${v}`);
49
+ }
50
+ this._handle.setoptList(NativeCurlOpt.HttpHeader, list);
51
+ }
52
+ if (options.timeout) {
53
+ this._handle.setoptLong(NativeCurlOpt.ConnectTimeoutMs, Math.floor(options.timeout * 1000));
54
+ }
55
+ if (options.proxy) {
56
+ this._handle.setoptStr(NativeCurlOpt.Proxy, options.proxy);
57
+ }
58
+ if (options.verify === false) {
59
+ this._handle.setoptLong(NativeCurlOpt.SslVerifyPeer, 0);
60
+ this._handle.setoptLong(NativeCurlOpt.SslVerifyHost, 0);
61
+ }
62
+ this._handle.setoptLong(NativeCurlOpt.FollowLocation, 1);
63
+ }
64
+ /** Whether the WebSocket is currently connected. */
65
+ get connected() {
66
+ return this._connected;
67
+ }
68
+ /** The WebSocket URL. */
69
+ get url() {
70
+ return this._url;
71
+ }
72
+ /**
73
+ * Establish the WebSocket connection.
74
+ *
75
+ * Performs the HTTP upgrade handshake and starts the receive loop.
76
+ * Emits 'open' when connected, 'error' on failure.
77
+ */
78
+ async connect() {
79
+ try {
80
+ this._handle.wsConnect();
81
+ this._connected = true;
82
+ this.emit('open');
83
+ this._startRecvLoop();
84
+ }
85
+ catch (e) {
86
+ const err = (0, errors_js_1.parseCurlError)(e instanceof Error ? e.message : String(e));
87
+ this.emit('error', err);
88
+ throw err;
89
+ }
90
+ }
91
+ send(data) {
92
+ if (!this._connected) {
93
+ throw new Error('WebSocket is not connected');
94
+ }
95
+ try {
96
+ if (typeof data === 'string') {
97
+ this._handle.wsSend(Buffer.from(data, 'utf8'), exports.WS_TEXT);
98
+ }
99
+ else {
100
+ this._handle.wsSend(data, exports.WS_BINARY);
101
+ }
102
+ }
103
+ catch (e) {
104
+ const err = (0, errors_js_1.parseCurlError)(e instanceof Error ? e.message : String(e));
105
+ this.emit('error', err);
106
+ throw err;
107
+ }
108
+ }
109
+ /**
110
+ * Close the WebSocket connection gracefully.
111
+ */
112
+ close() {
113
+ if (!this._connected)
114
+ return;
115
+ this._stopRecvLoop();
116
+ try {
117
+ this._handle.wsSend(Buffer.alloc(0), exports.WS_CLOSE);
118
+ }
119
+ catch (_) {
120
+ // Ignore errors during close — connection may already be dead
121
+ }
122
+ this._connected = false;
123
+ this.emit('close');
124
+ }
125
+ // ─── Internal ─────────────────────────────────────────────────────────
126
+ _startRecvLoop() {
127
+ if (this._polling)
128
+ return;
129
+ this._polling = true;
130
+ // Poll for incoming messages using setInterval
131
+ this._pollTimer = setInterval(() => {
132
+ if (!this._connected || !this._polling) {
133
+ this._stopRecvLoop();
134
+ return;
135
+ }
136
+ try {
137
+ const frame = this._handle.wsRecv();
138
+ if (frame === null)
139
+ return; // No data available (CURLE_AGAIN)
140
+ if (frame.flags & exports.WS_CLOSE) {
141
+ this._stopRecvLoop();
142
+ this._connected = false;
143
+ this.emit('close');
144
+ return;
145
+ }
146
+ if (frame.flags & exports.WS_TEXT) {
147
+ this.emit('message', frame.data.toString('utf8'));
148
+ }
149
+ else if (frame.flags & exports.WS_BINARY) {
150
+ this.emit('message', frame.data);
151
+ }
152
+ else {
153
+ // Other frame types (e.g., continuation)
154
+ this.emit('message', frame.data);
155
+ }
156
+ }
157
+ catch (_e) {
158
+ // Connection closed by server — treat as clean close
159
+ this._stopRecvLoop();
160
+ if (this._connected) {
161
+ this._connected = false;
162
+ this.emit('close');
163
+ }
164
+ }
165
+ }, 10); // 10ms polling interval
166
+ }
167
+ _stopRecvLoop() {
168
+ this._polling = false;
169
+ if (this._pollTimer) {
170
+ clearInterval(this._pollTimer);
171
+ this._pollTimer = null;
172
+ }
173
+ }
174
+ }
175
+ exports.CurlWebSocket = CurlWebSocket;
176
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../lib/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@curl-cffi-node/darwin-arm64",
3
+ "version": "0.1.7",
4
+ "os": [
5
+ "darwin"
6
+ ],
7
+ "cpu": [
8
+ "arm64"
9
+ ],
10
+ "main": "curl-cffi-node.darwin-arm64.node",
11
+ "files": [
12
+ "curl-cffi-node.darwin-arm64.node"
13
+ ],
14
+ "description": "curl-cffi-node native binding for macOS ARM64 (Apple Silicon)",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@curl-cffi-node/darwin-x64",
3
+ "version": "0.1.7",
4
+ "os": [
5
+ "darwin"
6
+ ],
7
+ "cpu": [
8
+ "x64"
9
+ ],
10
+ "main": "curl-cffi-node.darwin-x64.node",
11
+ "files": [
12
+ "curl-cffi-node.darwin-x64.node"
13
+ ],
14
+ "description": "curl-cffi-node native binding for macOS x64 (Intel)",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
18
+ }
19
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@curl-cffi-node/linux-arm64-gnu",
3
+ "version": "0.1.7",
4
+ "os": [
5
+ "linux"
6
+ ],
7
+ "cpu": [
8
+ "arm64"
9
+ ],
10
+ "libc": [
11
+ "glibc"
12
+ ],
13
+ "main": "curl-cffi-node.linux-arm64-gnu.node",
14
+ "files": [
15
+ "curl-cffi-node.linux-arm64-gnu.node"
16
+ ],
17
+ "description": "curl-cffi-node native binding for Linux ARM64 (glibc)",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@curl-cffi-node/linux-x64-gnu",
3
+ "version": "0.1.7",
4
+ "os": [
5
+ "linux"
6
+ ],
7
+ "cpu": [
8
+ "x64"
9
+ ],
10
+ "libc": [
11
+ "glibc"
12
+ ],
13
+ "main": "curl-cffi-node.linux-x64-gnu.node",
14
+ "files": [
15
+ "curl-cffi-node.linux-x64-gnu.node"
16
+ ],
17
+ "description": "curl-cffi-node native binding for Linux x64 (glibc)",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
21
+ }
22
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "@curl-cffi-node/linux-x64-musl",
3
+ "version": "0.1.0",
4
+ "os": ["linux"],
5
+ "cpu": ["x64"],
6
+ "libc": ["musl"],
7
+ "main": "curl-cffi-node.linux-x64-musl.node",
8
+ "files": ["curl-cffi-node.linux-x64-musl.node"],
9
+ "description": "curl-cffi-node native binding for Linux x64 (musl)",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
13
+ }
14
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@curl-cffi-node/win32-x64-msvc",
3
+ "version": "0.1.7",
4
+ "os": [
5
+ "win32"
6
+ ],
7
+ "cpu": [
8
+ "x64"
9
+ ],
10
+ "main": "curl-cffi-node.win32-x64-msvc.node",
11
+ "files": [
12
+ "curl-cffi-node.win32-x64-msvc.node"
13
+ ],
14
+ "description": "curl-cffi-node native binding for Windows x64 (MSVC)",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
18
+ }
19
+ }
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "curl-cffi-node",
3
+ "version": "0.1.7",
4
+ "description": "Node.js binding for curl-impersonate via napi-rs. HTTP client with browser TLS/JA3/HTTP2 fingerprint impersonation.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/meodemsao/curl-cffi-node.git"
8
+ },
9
+ "main": "dist/index.js",
10
+ "module": "dist/index.mjs",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.mjs"
17
+ },
18
+ "require": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ }
22
+ }
23
+ },
24
+ "napi": {
25
+ "binaryName": "curl-cffi-node",
26
+ "targets": [
27
+ "x86_64-unknown-linux-gnu",
28
+ "aarch64-unknown-linux-gnu",
29
+ "x86_64-apple-darwin",
30
+ "aarch64-apple-darwin",
31
+ "x86_64-pc-windows-msvc"
32
+ ]
33
+ },
34
+ "files": [
35
+ "dist/**",
36
+ "npm/**",
37
+ "*.node"
38
+ ],
39
+ "scripts": {
40
+ "build": "napi build --package curl-cffi-node-native --platform --release --output-dir . && npm run build:ts",
41
+ "build:debug": "napi build --package curl-cffi-node-native --platform --output-dir . && npm run build:ts",
42
+ "build:ts": "tsc -p tsconfig.json && npm run build:esm",
43
+ "build:esm": "cp lib/index.mjs dist/index.mjs",
44
+ "prepublishOnly": "napi prepublish -t npm",
45
+ "test": "vitest run",
46
+ "test:unit": "vitest run __tests__/unit",
47
+ "test:integration": "vitest run --config vitest.integration.config.ts",
48
+ "test:fast": "vitest run && vitest run --config vitest.integration.config.ts",
49
+ "test:watch": "vitest",
50
+ "test:rust": "cargo test --manifest-path native/Cargo.toml",
51
+ "test:all": "npm run test:rust && npm test"
52
+ },
53
+ "keywords": [
54
+ "curl",
55
+ "http",
56
+ "tls",
57
+ "ja3",
58
+ "fingerprint",
59
+ "impersonate",
60
+ "browser",
61
+ "scraping",
62
+ "napi",
63
+ "native"
64
+ ],
65
+ "author": "",
66
+ "license": "MIT",
67
+ "engines": {
68
+ "node": ">=18"
69
+ },
70
+ "devDependencies": {
71
+ "@napi-rs/cli": "^3.0.0",
72
+ "@types/node": "^22.0.0",
73
+ "typescript": "^5.7.0",
74
+ "vitest": "^4.1.4"
75
+ },
76
+ "optionalDependencies": {
77
+ "curl-cffi-node-linux-x64-gnu": "0.1.7",
78
+ "curl-cffi-node-linux-arm64-gnu": "0.1.7",
79
+ "curl-cffi-node-darwin-x64": "0.1.7",
80
+ "curl-cffi-node-darwin-arm64": "0.1.7",
81
+ "curl-cffi-node-win32-x64-msvc": "0.1.7"
82
+ }
83
+ }