grasp-sdk 0.1.2__tar.gz → 0.1.4__tar.gz
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.
Potentially problematic release.
This version of grasp-sdk might be problematic. Click here for more details.
- {grasp_sdk-0.1.2/grasp_sdk.egg-info → grasp_sdk-0.1.4}/PKG-INFO +1 -1
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/__init__.py +15 -3
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/sandbox/chrome-stable.mjs +11 -2
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/sandbox/chromium.mjs +11 -4
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4/grasp_sdk.egg-info}/PKG-INFO +1 -1
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/SOURCES.txt +0 -1
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/pyproject.toml +1 -1
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/setup.py +11 -1
- grasp_sdk-0.1.2/grasp_sdk/sandbox/jsconfig.json +0 -22
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/MANIFEST.in +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/README.md +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/build_and_publish.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/example_usage.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/models/__init__.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/services/__init__.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/services/browser.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/services/sandbox.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/__init__.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/auth.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/config.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/logger.py +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/dependency_links.txt +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/entry_points.txt +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/not-zip-safe +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/requires.txt +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/top_level.txt +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/py.typed +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/requirements.txt +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/setup.cfg +0 -0
- {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/test_install.py +0 -0
|
@@ -24,7 +24,7 @@ from .models import (
|
|
|
24
24
|
SandboxStatus,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
__version__ = "0.1.
|
|
27
|
+
__version__ = "0.1.4"
|
|
28
28
|
__author__ = "Grasp Team"
|
|
29
29
|
__email__ = "team@grasp.dev"
|
|
30
30
|
|
|
@@ -45,21 +45,33 @@ class GraspServer:
|
|
|
45
45
|
browser_type = sandbox_config.pop('type', 'chromium')
|
|
46
46
|
headless = sandbox_config.pop('headless', True)
|
|
47
47
|
adblock = sandbox_config.pop('adblock', False)
|
|
48
|
+
logLevel = sandbox_config.pop('logLevel', '')
|
|
49
|
+
keepAliveMS = sandbox_config.pop('keepAliveMS', 0)
|
|
50
|
+
|
|
51
|
+
# Set default log level
|
|
52
|
+
if not logLevel:
|
|
53
|
+
logLevel = 'debug' if sandbox_config.get('debug', False) else 'info'
|
|
48
54
|
|
|
49
55
|
self.__browser_type = browser_type
|
|
50
56
|
|
|
51
57
|
# Create browser task
|
|
52
58
|
self.__browser_config = {
|
|
53
59
|
'headless': headless,
|
|
54
|
-
'envs': {
|
|
60
|
+
'envs': {
|
|
61
|
+
'ADBLOCK': 'true' if adblock else 'false',
|
|
62
|
+
'KEEP_ALIVE_MS': str(keepAliveMS),
|
|
63
|
+
}
|
|
55
64
|
}
|
|
56
65
|
|
|
57
66
|
config = get_config()
|
|
58
67
|
config['sandbox'].update(sandbox_config)
|
|
59
68
|
self.config = config
|
|
69
|
+
|
|
70
|
+
logger = config['logger']
|
|
71
|
+
logger['level'] = logLevel
|
|
60
72
|
|
|
61
73
|
# Initialize logger first
|
|
62
|
-
init_logger(
|
|
74
|
+
init_logger(logger)
|
|
63
75
|
self.logger = get_logger().child('GraspE2B')
|
|
64
76
|
|
|
65
77
|
self.browser_service: Optional[BrowserService] = None
|
|
@@ -101,6 +101,7 @@ const headless = process.env.HEADLESS !== 'false';
|
|
|
101
101
|
const enableAdblock = process.env.ADBLOCK !== 'false';
|
|
102
102
|
const timeoutMS = process.env.SANBOX_TIMEOUT;
|
|
103
103
|
const workspace = process.env.WORKSPACE;
|
|
104
|
+
const keepAliveMS = Number(process.env.KEEP_ALIVE_MS) || 0;
|
|
104
105
|
const args = [];
|
|
105
106
|
|
|
106
107
|
try {
|
|
@@ -187,10 +188,13 @@ try {
|
|
|
187
188
|
changeOrigin: true
|
|
188
189
|
});
|
|
189
190
|
|
|
191
|
+
let wsId = null;
|
|
192
|
+
|
|
190
193
|
// Log WebSocket messages
|
|
191
194
|
proxy.on('open', () => {
|
|
192
195
|
console.log('🔌 CDP WebSocket connection established');
|
|
193
|
-
|
|
196
|
+
wsId = Date.now();
|
|
197
|
+
logger.info('CDP WebSocket connection established', { sandboxId, wsId });
|
|
194
198
|
Sentry.addBreadcrumb({
|
|
195
199
|
category: 'websocket',
|
|
196
200
|
message: 'CDP connection established',
|
|
@@ -228,7 +232,12 @@ try {
|
|
|
228
232
|
level: 'info',
|
|
229
233
|
data: { sandboxId }
|
|
230
234
|
});
|
|
231
|
-
|
|
235
|
+
const closeId = wsId;
|
|
236
|
+
setTimeout(() => {
|
|
237
|
+
if(wsId === closeId) {
|
|
238
|
+
process.exit(0);
|
|
239
|
+
}
|
|
240
|
+
}, keepAliveMS);
|
|
232
241
|
});
|
|
233
242
|
|
|
234
243
|
const server = http.createServer(async (req, res) => {
|
|
@@ -6,8 +6,6 @@ import http from 'http';
|
|
|
6
6
|
import { Logtail } from '@logtail/node';
|
|
7
7
|
import * as Sentry from "@sentry/node";
|
|
8
8
|
|
|
9
|
-
// console.log(`💬 ${JSON.stringify(process.env)}`)
|
|
10
|
-
|
|
11
9
|
const logtail = new Logtail(process.env.BS_SOURCE_TOKEN, {
|
|
12
10
|
endpoint: `https://${process.env.BS_INGESTING_HOST}`,
|
|
13
11
|
});
|
|
@@ -104,6 +102,7 @@ const headless = process.env.HEADLESS !== 'false';
|
|
|
104
102
|
const enableAdblock = process.env.ADBLOCK !== 'false';
|
|
105
103
|
const timeoutMS = process.env.SANBOX_TIMEOUT;
|
|
106
104
|
const workspace = process.env.WORKSPACE;
|
|
105
|
+
const keepAliveMS = Number(process.env.KEEP_ALIVE_MS) || 0;
|
|
107
106
|
const args = [];
|
|
108
107
|
|
|
109
108
|
try {
|
|
@@ -184,10 +183,13 @@ try {
|
|
|
184
183
|
changeOrigin: true
|
|
185
184
|
});
|
|
186
185
|
|
|
186
|
+
let wsId = null;
|
|
187
|
+
|
|
187
188
|
// 监听 WebSocket 事件
|
|
188
189
|
proxy.on('open', () => {
|
|
189
190
|
console.log('🔌 CDP WebSocket connection established');
|
|
190
|
-
|
|
191
|
+
wsId = Date.now();
|
|
192
|
+
logger.info('CDP WebSocket connection established', { sandboxId, wsId });
|
|
191
193
|
Sentry.addBreadcrumb({
|
|
192
194
|
category: 'websocket',
|
|
193
195
|
message: 'CDP connection established',
|
|
@@ -225,7 +227,12 @@ try {
|
|
|
225
227
|
level: 'info',
|
|
226
228
|
data: { sandboxId }
|
|
227
229
|
});
|
|
228
|
-
|
|
230
|
+
const closeId = wsId;
|
|
231
|
+
setTimeout(() => {
|
|
232
|
+
if(wsId === closeId) {
|
|
233
|
+
process.exit(0);
|
|
234
|
+
}
|
|
235
|
+
}, keepAliveMS);
|
|
229
236
|
});
|
|
230
237
|
|
|
231
238
|
const server = http.createServer(async (req, res) => {
|
|
@@ -32,7 +32,6 @@ grasp_sdk.egg-info/top_level.txt
|
|
|
32
32
|
grasp_sdk/models/__init__.py
|
|
33
33
|
grasp_sdk/sandbox/chrome-stable.mjs
|
|
34
34
|
grasp_sdk/sandbox/chromium.mjs
|
|
35
|
-
grasp_sdk/sandbox/jsconfig.json
|
|
36
35
|
grasp_sdk/services/__init__.py
|
|
37
36
|
grasp_sdk/services/browser.py
|
|
38
37
|
grasp_sdk/services/sandbox.py
|
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
from setuptools import setup, find_packages
|
|
4
4
|
import os
|
|
5
|
+
import re
|
|
5
6
|
|
|
6
7
|
# Read the contents of your README file
|
|
7
8
|
this_directory = os.path.abspath(os.path.dirname(__file__))
|
|
8
9
|
with open(os.path.join(this_directory, 'README.md'), encoding='utf-8') as f:
|
|
9
10
|
long_description = f.read()
|
|
10
11
|
|
|
12
|
+
# Read version from pyproject.toml
|
|
13
|
+
def get_version():
|
|
14
|
+
with open(os.path.join(this_directory, 'pyproject.toml'), 'r', encoding='utf-8') as f:
|
|
15
|
+
content = f.read()
|
|
16
|
+
version_match = re.search(r'version = "([^"]+)"', content)
|
|
17
|
+
if version_match:
|
|
18
|
+
return version_match.group(1)
|
|
19
|
+
raise RuntimeError("Unable to find version string in pyproject.toml")
|
|
20
|
+
|
|
11
21
|
setup(
|
|
12
22
|
name="grasp_sdk",
|
|
13
|
-
version=
|
|
23
|
+
version=get_version(),
|
|
14
24
|
author="Grasp Team",
|
|
15
25
|
author_email="team@grasp.com",
|
|
16
26
|
description="Python SDK for Grasp E2B - Browser automation and sandbox management",
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "node",
|
|
6
|
-
"allowSyntheticDefaultImports": true,
|
|
7
|
-
"esModuleInterop": true,
|
|
8
|
-
"allowJs": true,
|
|
9
|
-
"checkJs": true,
|
|
10
|
-
"strict": false,
|
|
11
|
-
"noEmit": true,
|
|
12
|
-
"skipLibCheck": true,
|
|
13
|
-
"forceConsistentCasingInFileNames": true
|
|
14
|
-
},
|
|
15
|
-
"include": [
|
|
16
|
-
"*.mjs",
|
|
17
|
-
"*.js"
|
|
18
|
-
],
|
|
19
|
-
"exclude": [
|
|
20
|
-
"node_modules"
|
|
21
|
-
]
|
|
22
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|