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.

Files changed (30) hide show
  1. {grasp_sdk-0.1.2/grasp_sdk.egg-info → grasp_sdk-0.1.4}/PKG-INFO +1 -1
  2. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/__init__.py +15 -3
  3. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/sandbox/chrome-stable.mjs +11 -2
  4. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/sandbox/chromium.mjs +11 -4
  5. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4/grasp_sdk.egg-info}/PKG-INFO +1 -1
  6. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/SOURCES.txt +0 -1
  7. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/pyproject.toml +1 -1
  8. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/setup.py +11 -1
  9. grasp_sdk-0.1.2/grasp_sdk/sandbox/jsconfig.json +0 -22
  10. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/MANIFEST.in +0 -0
  11. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/README.md +0 -0
  12. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/build_and_publish.py +0 -0
  13. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/example_usage.py +0 -0
  14. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/models/__init__.py +0 -0
  15. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/services/__init__.py +0 -0
  16. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/services/browser.py +0 -0
  17. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/services/sandbox.py +0 -0
  18. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/__init__.py +0 -0
  19. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/auth.py +0 -0
  20. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/config.py +0 -0
  21. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk/utils/logger.py +0 -0
  22. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/dependency_links.txt +0 -0
  23. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/entry_points.txt +0 -0
  24. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/not-zip-safe +0 -0
  25. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/requires.txt +0 -0
  26. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/grasp_sdk.egg-info/top_level.txt +0 -0
  27. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/py.typed +0 -0
  28. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/requirements.txt +0 -0
  29. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/setup.cfg +0 -0
  30. {grasp_sdk-0.1.2 → grasp_sdk-0.1.4}/test_install.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: grasp_sdk
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Python SDK for Grasp E2B - Browser automation and sandbox management
5
5
  Home-page: https://github.com/grasp-team/grasp-e2b
6
6
  Author: Grasp Team
@@ -24,7 +24,7 @@ from .models import (
24
24
  SandboxStatus,
25
25
  )
26
26
 
27
- __version__ = "0.1.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': {'ADBLOCK': 'true' if adblock else 'false'}
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(config['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
- logger.info('CDP WebSocket connection established', { sandboxId });
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
- process.exit(0);
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
- logger.info('CDP WebSocket connection established', { sandboxId });
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
- process.exit(0);
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) => {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: grasp_sdk
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Python SDK for Grasp E2B - Browser automation and sandbox management
5
5
  Home-page: https://github.com/grasp-team/grasp-e2b
6
6
  Author: Grasp Team
@@ -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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "grasp_sdk"
7
- version = "0.1.2"
7
+ version = "0.1.4"
8
8
  authors = [
9
9
  {name = "Grasp Team", email = "team@grasp.com"},
10
10
  ]
@@ -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="0.1.1",
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