never-jscore 2.2.0__cp38-abi3-win_amd64.whl
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.
- never_jscore/__init__.py +11 -0
- never_jscore/never_jscore.pyd +0 -0
- never_jscore/never_jscore.pyi +204 -0
- never_jscore/py.typed +2 -0
- never_jscore-2.2.0.dist-info/METADATA +1357 -0
- never_jscore-2.2.0.dist-info/RECORD +7 -0
- never_jscore-2.2.0.dist-info/WHEEL +4 -0
never_jscore/__init__.py
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""
|
|
2
|
+
never_jscore - 基于 Deno Core 的高性能 JavaScript 运行时
|
|
3
|
+
|
|
4
|
+
High-performance Python JavaScript execution engine based on Deno Core (V8)
|
|
5
|
+
with full Promise/async support.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .never_jscore import Context
|
|
9
|
+
|
|
10
|
+
__version__ = "2.0.0"
|
|
11
|
+
__all__ = ["Context"]
|
|
Binary file
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"""
|
|
2
|
+
never_jscore - 基于 Deno Core 的 JavaScript 运行时
|
|
3
|
+
|
|
4
|
+
完整支持 Promise 和 async/await,适合 JS 逆向分析。
|
|
5
|
+
py_mini_racer 风格的实例化 API。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any, List, Union, Optional
|
|
9
|
+
|
|
10
|
+
class Context:
|
|
11
|
+
"""
|
|
12
|
+
JavaScript 执行上下文(支持异步)
|
|
13
|
+
|
|
14
|
+
每个 Context 包含一个独立的 V8 isolate 和 JavaScript 运行时环境。
|
|
15
|
+
默认自动等待 Promise,可以无缝调用异步 JavaScript 函数。
|
|
16
|
+
|
|
17
|
+
⚠️ 重要限制:
|
|
18
|
+
- 创建第二个 Context 后,不能再使用第一个 Context
|
|
19
|
+
- 多个 Context 必须按 LIFO 顺序删除(后创建先删除)
|
|
20
|
+
- 推荐使用单 Context 模式,将所有函数定义在一个 Context 中
|
|
21
|
+
|
|
22
|
+
🆕 扩展功能 (enable_extensions=True 时自动加载):
|
|
23
|
+
- Base64: btoa(), atob()
|
|
24
|
+
- 哈希: md5(), sha1(), sha256(), sha512()
|
|
25
|
+
- HMAC: CryptoUtils.hmacMd5(), hmacSha1(), hmacSha256()
|
|
26
|
+
- URL 编码: encodeURIComponent(), decodeURIComponent(), encodeURI(), decodeURI()
|
|
27
|
+
- Hex: CryptoUtils.hexEncode(), hexDecode()
|
|
28
|
+
- 链式 API: CryptoUtils.createHash(), createHmac()
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
>>> # 基本用法(默认启用扩展)
|
|
32
|
+
>>> ctx = Context()
|
|
33
|
+
>>> ctx.compile("function add(a, b) { return a + b; }")
|
|
34
|
+
>>> result = ctx.call("add", [1, 2])
|
|
35
|
+
>>> print(result)
|
|
36
|
+
3
|
|
37
|
+
|
|
38
|
+
>>> # 使用扩展功能
|
|
39
|
+
>>> ctx = Context()
|
|
40
|
+
>>> result = ctx.evaluate("btoa('hello')")
|
|
41
|
+
>>> print(result)
|
|
42
|
+
aGVsbG8=
|
|
43
|
+
|
|
44
|
+
>>> result = ctx.evaluate("md5('hello')")
|
|
45
|
+
>>> print(result)
|
|
46
|
+
5d41402abc4b2a76b9719d911017c592
|
|
47
|
+
|
|
48
|
+
>>> # 纯净 V8 环境(不加载扩展)
|
|
49
|
+
>>> ctx = Context(enable_extensions=False)
|
|
50
|
+
>>> # 只有 ECMAScript 标准 API
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, enable_extensions: bool = True) -> None:
|
|
54
|
+
"""
|
|
55
|
+
创建一个新的 JavaScript 执行上下文
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
enable_extensions: 是否启用扩展(crypto, encoding 等),默认 True
|
|
59
|
+
- True: 自动加载 btoa/atob/md5/sha256 等函数
|
|
60
|
+
- False: 纯净 V8 环境,只包含 ECMAScript 标准 API
|
|
61
|
+
"""
|
|
62
|
+
...
|
|
63
|
+
|
|
64
|
+
def compile(self, code: str) -> None:
|
|
65
|
+
"""
|
|
66
|
+
编译 JavaScript 代码并加入全局作用域
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
code: JavaScript 代码字符串
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
Exception: 当代码编译失败时
|
|
73
|
+
|
|
74
|
+
Example:
|
|
75
|
+
>>> ctx = Context()
|
|
76
|
+
>>> ctx.compile('''
|
|
77
|
+
... function add(a, b) { return a + b; }
|
|
78
|
+
... function multiply(a, b) { return a * b; }
|
|
79
|
+
... ''')
|
|
80
|
+
>>> ctx.call("add", [1, 2])
|
|
81
|
+
3
|
|
82
|
+
"""
|
|
83
|
+
...
|
|
84
|
+
|
|
85
|
+
def eval(
|
|
86
|
+
self,
|
|
87
|
+
code: str,
|
|
88
|
+
return_value: bool = False,
|
|
89
|
+
auto_await: Optional[bool] = None
|
|
90
|
+
) -> Any:
|
|
91
|
+
"""
|
|
92
|
+
执行代码并将其加入全局作用域
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
code: JavaScript 代码字符串
|
|
96
|
+
return_value: 是否返回最后一个表达式的值(默认 False)
|
|
97
|
+
auto_await: 是否自动等待 Promise(默认 True)
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
如果 return_value=True,返回最后表达式的值;否则返回 None
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
Exception: 当代码执行失败时
|
|
104
|
+
|
|
105
|
+
Example:
|
|
106
|
+
>>> ctx = Context()
|
|
107
|
+
>>> ctx.eval("var x = 10;") # 添加到全局作用域
|
|
108
|
+
>>> result = ctx.eval("x * 2", return_value=True)
|
|
109
|
+
>>> print(result)
|
|
110
|
+
20
|
|
111
|
+
"""
|
|
112
|
+
...
|
|
113
|
+
|
|
114
|
+
def evaluate(self, code: str, auto_await: Optional[bool] = None) -> Any:
|
|
115
|
+
"""
|
|
116
|
+
执行代码并返回结果(不影响全局作用域)
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
code: JavaScript 代码字符串
|
|
120
|
+
auto_await: 是否自动等待 Promise(默认 True)
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
表达式的值,自动转换为 Python 对象
|
|
124
|
+
|
|
125
|
+
Raises:
|
|
126
|
+
Exception: 当代码执行失败时
|
|
127
|
+
|
|
128
|
+
Example:
|
|
129
|
+
>>> ctx = Context()
|
|
130
|
+
>>> result = ctx.evaluate("1 + 2 + 3")
|
|
131
|
+
>>> print(result)
|
|
132
|
+
6
|
|
133
|
+
|
|
134
|
+
>>> # Promise(自动等待)
|
|
135
|
+
>>> result = ctx.evaluate("Promise.resolve(42)")
|
|
136
|
+
>>> print(result)
|
|
137
|
+
42
|
|
138
|
+
"""
|
|
139
|
+
...
|
|
140
|
+
|
|
141
|
+
def call(
|
|
142
|
+
self,
|
|
143
|
+
name: str,
|
|
144
|
+
args: List[Any] = [],
|
|
145
|
+
auto_await: Optional[bool] = None
|
|
146
|
+
) -> Any:
|
|
147
|
+
"""
|
|
148
|
+
调用 JavaScript 函数(支持 Promise)
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
name: 函数名称
|
|
152
|
+
args: 参数列表
|
|
153
|
+
auto_await: 是否自动等待 Promise(默认 True)
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
函数返回值,自动转换为 Python 对象
|
|
157
|
+
|
|
158
|
+
Raises:
|
|
159
|
+
Exception: 当函数调用失败时
|
|
160
|
+
|
|
161
|
+
Example:
|
|
162
|
+
>>> ctx = Context()
|
|
163
|
+
>>> ctx.compile("async function decrypt(data) { return data.split('').reverse().join(''); }")
|
|
164
|
+
>>> result = ctx.call("decrypt", ["olleh"])
|
|
165
|
+
>>> print(result)
|
|
166
|
+
hello
|
|
167
|
+
"""
|
|
168
|
+
...
|
|
169
|
+
|
|
170
|
+
def gc(self) -> None:
|
|
171
|
+
"""
|
|
172
|
+
请求 V8 垃圾回收
|
|
173
|
+
|
|
174
|
+
注意:这只是向 V8 发送 GC 请求,V8 会根据自己的策略决定是否执行。
|
|
175
|
+
在大多数情况下,V8 的自动 GC 已经足够好,无需手动调用。
|
|
176
|
+
"""
|
|
177
|
+
...
|
|
178
|
+
|
|
179
|
+
def get_stats(self) -> tuple[int]:
|
|
180
|
+
"""
|
|
181
|
+
获取执行统计信息
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
包含执行次数的元组 (exec_count,)
|
|
185
|
+
"""
|
|
186
|
+
...
|
|
187
|
+
|
|
188
|
+
def reset_stats(self) -> None:
|
|
189
|
+
"""
|
|
190
|
+
重置统计信息
|
|
191
|
+
"""
|
|
192
|
+
...
|
|
193
|
+
|
|
194
|
+
# 类型别名
|
|
195
|
+
JSValue = Union[None, bool, int, float, str, List[Any], dict[str, Any]]
|
|
196
|
+
"""JavaScript 值的 Python 类型表示"""
|
|
197
|
+
|
|
198
|
+
__version__: str = "2.0.0"
|
|
199
|
+
"""模块版本号"""
|
|
200
|
+
|
|
201
|
+
__all__ = [
|
|
202
|
+
"Context",
|
|
203
|
+
"JSValue",
|
|
204
|
+
]
|
never_jscore/py.typed
ADDED