@nimbus-sh/worker 0.1.5 → 0.1.6
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/README.md +37 -0
- package/dist/_shared/crypto.d.ts +15 -0
- package/dist/_shared/crypto.d.ts.map +1 -0
- package/dist/_shared/crypto.js +122 -0
- package/dist/facets/manager.d.ts +24 -0
- package/dist/facets/manager.d.ts.map +1 -1
- package/dist/facets/manager.js +279 -70
- package/dist/facets/process.d.ts +11 -2
- package/dist/facets/process.d.ts.map +1 -1
- package/dist/facets/process.js +187 -21
- package/dist/facets/vite-dev-server.d.ts +2 -0
- package/dist/facets/vite-dev-server.d.ts.map +1 -1
- package/dist/facets/vite-dev-server.js +39 -12
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/loaders/child-process/spawn-facet.d.ts +1 -3
- package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -1
- package/dist/loaders/child-process/spawn-facet.js +1 -12
- package/dist/loaders/child-process/spawn-pool.d.ts +1 -1
- package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -1
- package/dist/loaders/child-process/spawn-pool.js +1 -6
- package/dist/npm/installer.d.ts.map +1 -1
- package/dist/npm/installer.js +47 -27
- package/dist/npm/pre-bundle-facet.d.ts.map +1 -1
- package/dist/npm/pre-bundle-facet.js +2 -1
- package/dist/npm/resolve-one-facet.d.ts.map +1 -1
- package/dist/npm/resolve-one-facet.js +41 -13
- package/dist/npm/resolver.d.ts.map +1 -1
- package/dist/npm/resolver.js +70 -35
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +45 -21
- package/dist/router/remote-api.d.ts.map +1 -1
- package/dist/router/remote-api.js +29 -8
- package/dist/runtime/barrel-synthesizer.d.ts +7 -0
- package/dist/runtime/barrel-synthesizer.d.ts.map +1 -1
- package/dist/runtime/barrel-synthesizer.js +11 -0
- package/dist/runtime/clang-runner.d.ts.map +1 -1
- package/dist/runtime/clang-runner.js +1 -8
- package/dist/runtime/esbuild-service.d.ts +12 -5
- package/dist/runtime/esbuild-service.d.ts.map +1 -1
- package/dist/runtime/esbuild-service.js +28 -14
- package/dist/runtime/node-runner.d.ts +2 -0
- package/dist/runtime/node-runner.d.ts.map +1 -1
- package/dist/runtime/node-shims.d.ts +4 -2
- package/dist/runtime/node-shims.d.ts.map +1 -1
- package/dist/runtime/node-shims.js +404 -55
- package/dist/runtime/os-contracts.d.ts +128 -0
- package/dist/runtime/os-contracts.d.ts.map +1 -0
- package/dist/runtime/os-contracts.js +1 -0
- package/dist/runtime/package-manager.d.ts.map +1 -1
- package/dist/runtime/package-manager.js +32 -7
- package/dist/runtime/port-registry.d.ts +5 -0
- package/dist/runtime/port-registry.d.ts.map +1 -1
- package/dist/runtime/port-registry.js +22 -1
- package/dist/runtime/pyodide-runtime-assets.d.ts +19 -0
- package/dist/runtime/pyodide-runtime-assets.d.ts.map +1 -0
- package/dist/runtime/pyodide-runtime-assets.js +44 -0
- package/dist/runtime/python-repl.d.ts +3 -1
- package/dist/runtime/python-repl.d.ts.map +1 -1
- package/dist/runtime/python-repl.js +11 -29
- package/dist/runtime/python-runner.d.ts +8 -9
- package/dist/runtime/python-runner.d.ts.map +1 -1
- package/dist/runtime/python-runner.js +897 -61
- package/dist/runtime/python-socket-shim.d.ts +11 -0
- package/dist/runtime/python-socket-shim.d.ts.map +1 -0
- package/dist/runtime/python-socket-shim.js +526 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -1
- package/dist/runtime/require-resolver.js +2 -11
- package/dist/runtime/ruby-gems.d.ts +25 -0
- package/dist/runtime/ruby-gems.d.ts.map +1 -0
- package/dist/runtime/ruby-gems.js +582 -0
- package/dist/runtime/ruby-runner.d.ts +2 -4
- package/dist/runtime/ruby-runner.d.ts.map +1 -1
- package/dist/runtime/ruby-runner.js +335 -34
- package/dist/runtime/runtime-catalog.d.ts +16 -4
- package/dist/runtime/runtime-catalog.d.ts.map +1 -1
- package/dist/runtime/runtime-catalog.js +21 -10
- package/dist/runtime/runtime-registry.d.ts +3 -0
- package/dist/runtime/runtime-registry.d.ts.map +1 -1
- package/dist/runtime/runtime-registry.js +4 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +43 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.js +224 -0
- package/dist/runtime/static-server.d.ts +3 -0
- package/dist/runtime/static-server.d.ts.map +1 -0
- package/dist/runtime/static-server.js +121 -0
- package/dist/runtime/vfs-snapshot.d.ts +57 -0
- package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
- package/dist/runtime/vfs-snapshot.js +141 -0
- package/dist/runtime/virtual-socket-kernel.d.ts +16 -0
- package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
- package/dist/runtime/virtual-socket-kernel.js +360 -0
- package/dist/runtime/wasi-instance.d.ts +6 -3
- package/dist/runtime/wasi-instance.d.ts.map +1 -1
- package/dist/runtime/wasm-runner.d.ts +1 -25
- package/dist/runtime/wasm-runner.d.ts.map +1 -1
- package/dist/runtime/wasm-runner.js +1 -160
- package/dist/session/agent.d.ts +43 -0
- package/dist/session/agent.d.ts.map +1 -0
- package/dist/session/agent.js +1252 -0
- package/dist/session/init.d.ts.map +1 -1
- package/dist/session/init.js +15 -16
- package/dist/session/nimbus-session.d.ts +13 -2
- package/dist/session/nimbus-session.d.ts.map +1 -1
- package/dist/session/nimbus-session.js +55 -7
- package/dist/session/programmatic.d.ts +10 -0
- package/dist/session/programmatic.d.ts.map +1 -1
- package/dist/session/programmatic.js +121 -0
- package/dist/session/routes.d.ts.map +1 -1
- package/dist/session/routes.js +19 -1
- package/dist/session/rpc.d.ts +11 -0
- package/dist/session/rpc.d.ts.map +1 -1
- package/dist/session/rpc.js +56 -43
- package/dist/session/supervisor-rpc.d.ts +15 -0
- package/dist/session/supervisor-rpc.d.ts.map +1 -1
- package/dist/session/supervisor-rpc.js +32 -0
- package/dist/session/ws.d.ts +4 -3
- package/dist/session/ws.d.ts.map +1 -1
- package/dist/session/ws.js +11 -1
- package/dist/shell/unix-commands.js +12 -16
- package/dist/vfs/path.d.ts +8 -4
- package/dist/vfs/path.d.ts.map +1 -1
- package/dist/vfs/path.js +16 -4
- package/dist/vfs/sqlite-vfs.d.ts +2 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
- package/dist/vfs/sqlite-vfs.js +11 -0
- package/dist/vfs/symlink-registry.d.ts +7 -1
- package/dist/vfs/symlink-registry.d.ts.map +1 -1
- package/dist/vfs/symlink-registry.js +16 -11
- package/package.json +4 -1
- package/public/index.html +240 -0
- package/public/s/index.html +1172 -146
- package/runtime-contracts/pyodide-workerd-adapter.json +18 -0
- package/scripts/bundle-runtime.mjs +99 -24
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python socket/select/selectors compatibility layer for Pyodide.
|
|
3
|
+
*
|
|
4
|
+
* This module is installed into sys.modules before user code runs. It
|
|
5
|
+
* backs the Python stdlib socket APIs with Nimbus virtual sockets, so
|
|
6
|
+
* socketserver/http.server/Werkzeug can run through ordinary Python
|
|
7
|
+
* networking calls. It intentionally exposes Python's normal module
|
|
8
|
+
* names instead of framework-specific entrypoints.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PYTHON_SOCKET_SHIM: string;
|
|
11
|
+
//# sourceMappingURL=python-socket-shim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-socket-shim.d.ts","sourceRoot":"","sources":["../../src/runtime/python-socket-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,kBAAkB,QAogB9B,CAAC"}
|
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python socket/select/selectors compatibility layer for Pyodide.
|
|
3
|
+
*
|
|
4
|
+
* This module is installed into sys.modules before user code runs. It
|
|
5
|
+
* backs the Python stdlib socket APIs with Nimbus virtual sockets, so
|
|
6
|
+
* socketserver/http.server/Werkzeug can run through ordinary Python
|
|
7
|
+
* networking calls. It intentionally exposes Python's normal module
|
|
8
|
+
* names instead of framework-specific entrypoints.
|
|
9
|
+
*/
|
|
10
|
+
export const PYTHON_SOCKET_SHIM = String.raw `
|
|
11
|
+
import io
|
|
12
|
+
import sys
|
|
13
|
+
import time
|
|
14
|
+
import types
|
|
15
|
+
from pyodide.ffi import run_sync, to_js
|
|
16
|
+
from nimbus_sockets import accept_now as _nimbus_accept_now
|
|
17
|
+
from nimbus_sockets import close as _nimbus_close
|
|
18
|
+
from nimbus_sockets import close_listener as _nimbus_close_listener
|
|
19
|
+
from nimbus_sockets import listen as _nimbus_listen
|
|
20
|
+
from nimbus_sockets import pending as _nimbus_pending
|
|
21
|
+
from nimbus_sockets import recv as _nimbus_recv
|
|
22
|
+
from nimbus_sockets import send as _nimbus_send
|
|
23
|
+
from nimbus_sockets import sleep as _nimbus_sleep
|
|
24
|
+
|
|
25
|
+
AF_UNSPEC = 0
|
|
26
|
+
AF_INET = 2
|
|
27
|
+
AF_INET6 = 10
|
|
28
|
+
AF_UNIX = 1
|
|
29
|
+
SOCK_STREAM = 1
|
|
30
|
+
SOCK_DGRAM = 2
|
|
31
|
+
SOCK_RAW = 3
|
|
32
|
+
SOCK_CLOEXEC = 524288
|
|
33
|
+
SOCK_NONBLOCK = 2048
|
|
34
|
+
SOL_SOCKET = 1
|
|
35
|
+
SO_REUSEADDR = 2
|
|
36
|
+
SO_REUSEPORT = 15
|
|
37
|
+
SO_TYPE = 3
|
|
38
|
+
SO_ERROR = 4
|
|
39
|
+
IPPROTO_TCP = 6
|
|
40
|
+
IPPROTO_IPV6 = 41
|
|
41
|
+
TCP_NODELAY = 1
|
|
42
|
+
IPV6_V6ONLY = 26
|
|
43
|
+
SHUT_RD = 0
|
|
44
|
+
SHUT_WR = 1
|
|
45
|
+
SHUT_RDWR = 2
|
|
46
|
+
AI_PASSIVE = 1
|
|
47
|
+
AI_CANONNAME = 2
|
|
48
|
+
AI_NUMERICHOST = 4
|
|
49
|
+
AI_NUMERICSERV = 1024
|
|
50
|
+
AI_ADDRCONFIG = 32
|
|
51
|
+
AI_V4MAPPED = 8
|
|
52
|
+
MSG_PEEK = 2
|
|
53
|
+
SOMAXCONN = 128
|
|
54
|
+
EAI_NONAME = -2
|
|
55
|
+
has_ipv6 = True
|
|
56
|
+
|
|
57
|
+
error = OSError
|
|
58
|
+
timeout = TimeoutError
|
|
59
|
+
gaierror = OSError
|
|
60
|
+
herror = OSError
|
|
61
|
+
|
|
62
|
+
_GLOBAL_DEFAULT_TIMEOUT = object()
|
|
63
|
+
_default_timeout = None
|
|
64
|
+
|
|
65
|
+
_next_fd = 100
|
|
66
|
+
_fd_map = {}
|
|
67
|
+
|
|
68
|
+
def _alloc_fd(sock):
|
|
69
|
+
global _next_fd
|
|
70
|
+
fd = _next_fd
|
|
71
|
+
_next_fd += 1
|
|
72
|
+
_fd_map[fd] = sock
|
|
73
|
+
return fd
|
|
74
|
+
|
|
75
|
+
def _coerce_bytes(data):
|
|
76
|
+
if data is None:
|
|
77
|
+
return b""
|
|
78
|
+
if isinstance(data, bytes):
|
|
79
|
+
return data
|
|
80
|
+
if isinstance(data, bytearray):
|
|
81
|
+
return bytes(data)
|
|
82
|
+
if isinstance(data, memoryview):
|
|
83
|
+
return data.tobytes()
|
|
84
|
+
if isinstance(data, str):
|
|
85
|
+
return data.encode()
|
|
86
|
+
return bytes(data)
|
|
87
|
+
|
|
88
|
+
def _bytes_from_js(value):
|
|
89
|
+
try:
|
|
90
|
+
value = value.to_py()
|
|
91
|
+
except AttributeError:
|
|
92
|
+
pass
|
|
93
|
+
return bytes(value)
|
|
94
|
+
|
|
95
|
+
def _port_from_address(address):
|
|
96
|
+
if isinstance(address, tuple) and len(address) >= 2:
|
|
97
|
+
return int(address[1])
|
|
98
|
+
return int(address)
|
|
99
|
+
|
|
100
|
+
def _cooperative_sleep(seconds):
|
|
101
|
+
if seconds is None:
|
|
102
|
+
seconds = 0.01
|
|
103
|
+
seconds = max(0.0, float(seconds))
|
|
104
|
+
if seconds == 0:
|
|
105
|
+
return None
|
|
106
|
+
run_sync(_nimbus_sleep(int(seconds * 1000)))
|
|
107
|
+
|
|
108
|
+
def gethostname():
|
|
109
|
+
return "nimbus"
|
|
110
|
+
|
|
111
|
+
def getfqdn(name=""):
|
|
112
|
+
return name or gethostname()
|
|
113
|
+
|
|
114
|
+
def gethostbyname(name):
|
|
115
|
+
return "127.0.0.1"
|
|
116
|
+
|
|
117
|
+
def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
|
|
118
|
+
family = family or AF_INET
|
|
119
|
+
type = type or SOCK_STREAM
|
|
120
|
+
proto = proto or 0
|
|
121
|
+
return [(family, type, proto, "", (host or "127.0.0.1", int(port)))]
|
|
122
|
+
|
|
123
|
+
def getnameinfo(sockaddr, flags=0):
|
|
124
|
+
return (str(sockaddr[0]), str(sockaddr[1]))
|
|
125
|
+
|
|
126
|
+
def getdefaulttimeout():
|
|
127
|
+
return _default_timeout
|
|
128
|
+
|
|
129
|
+
def setdefaulttimeout(value):
|
|
130
|
+
global _default_timeout
|
|
131
|
+
_default_timeout = value
|
|
132
|
+
|
|
133
|
+
def create_connection(address, timeout=None, source_address=None):
|
|
134
|
+
raise OSError("Nimbus Python virtual sockets currently support loopback server sockets only")
|
|
135
|
+
|
|
136
|
+
class socket:
|
|
137
|
+
family = AF_INET
|
|
138
|
+
type = SOCK_STREAM
|
|
139
|
+
proto = 0
|
|
140
|
+
|
|
141
|
+
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None, _conn_id=None, _address=None):
|
|
142
|
+
self.family = family
|
|
143
|
+
self.type = type
|
|
144
|
+
self.proto = proto
|
|
145
|
+
self.timeout = _default_timeout
|
|
146
|
+
self.blocking = self.timeout != 0
|
|
147
|
+
self._closed = False
|
|
148
|
+
self._listener = False
|
|
149
|
+
self._port = None
|
|
150
|
+
self._conn_id = _conn_id
|
|
151
|
+
self._address = _address or ("127.0.0.1", 0)
|
|
152
|
+
self._fd = int(fileno) if fileno is not None else _alloc_fd(self)
|
|
153
|
+
self._inheritable = False
|
|
154
|
+
|
|
155
|
+
def bind(self, address):
|
|
156
|
+
self._port = _port_from_address(address)
|
|
157
|
+
self._address = (address[0] if isinstance(address, tuple) and address else "0.0.0.0", self._port)
|
|
158
|
+
|
|
159
|
+
def listen(self, backlog=128):
|
|
160
|
+
if self._port is None:
|
|
161
|
+
self._port = 0
|
|
162
|
+
self._port = int(_nimbus_listen(self._port))
|
|
163
|
+
self._listener = True
|
|
164
|
+
self._address = ("0.0.0.0", self._port)
|
|
165
|
+
|
|
166
|
+
def accept(self):
|
|
167
|
+
if not self._listener or self._port is None:
|
|
168
|
+
raise OSError("socket is not listening")
|
|
169
|
+
deadline = None if self.timeout is None else time.monotonic() + max(0.0, float(self.timeout))
|
|
170
|
+
conn_id = None
|
|
171
|
+
host = "127.0.0.1"
|
|
172
|
+
port = 0
|
|
173
|
+
while conn_id is None:
|
|
174
|
+
item = _nimbus_accept_now(self._port)
|
|
175
|
+
try:
|
|
176
|
+
conn_id = int(item.id)
|
|
177
|
+
host = str(item.host)
|
|
178
|
+
port = int(item.port)
|
|
179
|
+
except Exception:
|
|
180
|
+
conn_id = None
|
|
181
|
+
if conn_id is not None:
|
|
182
|
+
break
|
|
183
|
+
if self.timeout == 0 or not self.blocking:
|
|
184
|
+
raise BlockingIOError("operation would block")
|
|
185
|
+
if deadline is not None:
|
|
186
|
+
remaining = deadline - time.monotonic()
|
|
187
|
+
if remaining <= 0:
|
|
188
|
+
raise timeout("timed out")
|
|
189
|
+
_cooperative_sleep(min(0.01, remaining))
|
|
190
|
+
else:
|
|
191
|
+
_cooperative_sleep(0.01)
|
|
192
|
+
return (socket(self.family, self.type, self.proto, _conn_id=conn_id, _address=(host, port)), (host, port))
|
|
193
|
+
|
|
194
|
+
def connect(self, address):
|
|
195
|
+
if self.type == SOCK_DGRAM:
|
|
196
|
+
self._address = address if isinstance(address, tuple) else (str(address), 0)
|
|
197
|
+
return None
|
|
198
|
+
raise OSError("Nimbus Python virtual sockets currently support loopback server sockets only")
|
|
199
|
+
|
|
200
|
+
def fileno(self):
|
|
201
|
+
return self._fd
|
|
202
|
+
|
|
203
|
+
def set_inheritable(self, inheritable):
|
|
204
|
+
self._inheritable = bool(inheritable)
|
|
205
|
+
|
|
206
|
+
def get_inheritable(self):
|
|
207
|
+
return self._inheritable
|
|
208
|
+
|
|
209
|
+
def settimeout(self, value):
|
|
210
|
+
self.timeout = value
|
|
211
|
+
self.blocking = value is None or value != 0
|
|
212
|
+
|
|
213
|
+
def gettimeout(self):
|
|
214
|
+
return self.timeout
|
|
215
|
+
|
|
216
|
+
def setblocking(self, flag):
|
|
217
|
+
self.blocking = bool(flag)
|
|
218
|
+
self.timeout = None if flag else 0
|
|
219
|
+
|
|
220
|
+
def getblocking(self):
|
|
221
|
+
return self.blocking
|
|
222
|
+
|
|
223
|
+
def setsockopt(self, level, optname, value):
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
def getsockopt(self, level, optname, buflen=None):
|
|
227
|
+
return 0
|
|
228
|
+
|
|
229
|
+
def getsockname(self):
|
|
230
|
+
return self._address
|
|
231
|
+
|
|
232
|
+
def getpeername(self):
|
|
233
|
+
return self._address
|
|
234
|
+
|
|
235
|
+
def recv(self, bufsize, flags=0):
|
|
236
|
+
if self._conn_id is None:
|
|
237
|
+
return b""
|
|
238
|
+
return _bytes_from_js(_nimbus_recv(self._conn_id, int(bufsize)))
|
|
239
|
+
|
|
240
|
+
def recv_into(self, buffer, nbytes=0, flags=0):
|
|
241
|
+
data = self.recv(nbytes or len(buffer), flags)
|
|
242
|
+
n = min(len(buffer), len(data))
|
|
243
|
+
buffer[:n] = data[:n]
|
|
244
|
+
return n
|
|
245
|
+
|
|
246
|
+
def send(self, data, flags=0):
|
|
247
|
+
if self._conn_id is None:
|
|
248
|
+
raise OSError("socket is not connected")
|
|
249
|
+
payload = _coerce_bytes(data)
|
|
250
|
+
return int(_nimbus_send(self._conn_id, to_js(payload)))
|
|
251
|
+
|
|
252
|
+
def sendall(self, data, flags=0):
|
|
253
|
+
self.send(data, flags)
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
def shutdown(self, how):
|
|
257
|
+
return None
|
|
258
|
+
|
|
259
|
+
def close(self):
|
|
260
|
+
if self._closed:
|
|
261
|
+
return None
|
|
262
|
+
self._closed = True
|
|
263
|
+
_fd_map.pop(self._fd, None)
|
|
264
|
+
if self._listener and self._port is not None:
|
|
265
|
+
_nimbus_close_listener(self._port)
|
|
266
|
+
if self._conn_id is not None:
|
|
267
|
+
_nimbus_close(self._conn_id)
|
|
268
|
+
return None
|
|
269
|
+
|
|
270
|
+
def detach(self):
|
|
271
|
+
fd = self._fd
|
|
272
|
+
_fd_map.pop(fd, None)
|
|
273
|
+
self._closed = True
|
|
274
|
+
return fd
|
|
275
|
+
|
|
276
|
+
def makefile(self, mode="r", buffering=None, encoding=None, errors=None, newline=None):
|
|
277
|
+
raw = _SocketRawIO(self)
|
|
278
|
+
if "b" in mode:
|
|
279
|
+
if "w" in mode:
|
|
280
|
+
return io.BufferedWriter(raw) if buffering and buffering > 0 else raw
|
|
281
|
+
return io.BufferedReader(raw)
|
|
282
|
+
buffer = io.BufferedRWPair(raw, raw) if "+" in mode else io.BufferedReader(raw)
|
|
283
|
+
return io.TextIOWrapper(buffer, encoding=encoding or "utf-8", errors=errors, newline=newline)
|
|
284
|
+
|
|
285
|
+
def __enter__(self):
|
|
286
|
+
return self
|
|
287
|
+
|
|
288
|
+
def __exit__(self, exc_type, exc, tb):
|
|
289
|
+
self.close()
|
|
290
|
+
|
|
291
|
+
class _SocketRawIO(io.RawIOBase):
|
|
292
|
+
def __init__(self, sock):
|
|
293
|
+
super().__init__()
|
|
294
|
+
self.sock = sock
|
|
295
|
+
|
|
296
|
+
def readable(self):
|
|
297
|
+
return True
|
|
298
|
+
|
|
299
|
+
def writable(self):
|
|
300
|
+
return True
|
|
301
|
+
|
|
302
|
+
def readinto(self, b):
|
|
303
|
+
data = self.sock.recv(len(b))
|
|
304
|
+
if not data:
|
|
305
|
+
return 0
|
|
306
|
+
n = min(len(b), len(data))
|
|
307
|
+
b[:n] = data[:n]
|
|
308
|
+
return n
|
|
309
|
+
|
|
310
|
+
def write(self, b):
|
|
311
|
+
self.sock.sendall(bytes(b))
|
|
312
|
+
return len(b)
|
|
313
|
+
|
|
314
|
+
def close(self):
|
|
315
|
+
try:
|
|
316
|
+
self.sock.close()
|
|
317
|
+
finally:
|
|
318
|
+
super().close()
|
|
319
|
+
|
|
320
|
+
def fromfd(fd, family, type, proto=0):
|
|
321
|
+
sock = _fd_map.get(int(fd))
|
|
322
|
+
if sock is None:
|
|
323
|
+
raise OSError("bad file descriptor")
|
|
324
|
+
return sock
|
|
325
|
+
|
|
326
|
+
def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0):
|
|
327
|
+
raise OSError("socketpair is not supported by Nimbus virtual sockets")
|
|
328
|
+
|
|
329
|
+
SocketType = socket
|
|
330
|
+
AddressFamily = int
|
|
331
|
+
SocketKind = int
|
|
332
|
+
|
|
333
|
+
def _select_once(rlist, wlist):
|
|
334
|
+
read_fds = []
|
|
335
|
+
ready = []
|
|
336
|
+
for item in rlist:
|
|
337
|
+
fd = item if isinstance(item, int) else item.fileno()
|
|
338
|
+
sock = _fd_map.get(int(fd))
|
|
339
|
+
if sock is not None and sock._conn_id is not None:
|
|
340
|
+
ready.append(item)
|
|
341
|
+
elif sock is not None and sock._listener and sock._port is not None:
|
|
342
|
+
if int(_nimbus_pending(sock._port)) > 0:
|
|
343
|
+
ready.append(item)
|
|
344
|
+
else:
|
|
345
|
+
read_fds.append((item, sock._port))
|
|
346
|
+
return ready
|
|
347
|
+
|
|
348
|
+
def _select(rlist, wlist, xlist, timeout_value=None):
|
|
349
|
+
deadline = None if timeout_value is None else time.monotonic() + max(0.0, float(timeout_value))
|
|
350
|
+
while True:
|
|
351
|
+
ready = _select_once(rlist, wlist)
|
|
352
|
+
if ready or timeout_value == 0:
|
|
353
|
+
return (ready, list(wlist), [])
|
|
354
|
+
if deadline is not None:
|
|
355
|
+
remaining = deadline - time.monotonic()
|
|
356
|
+
if remaining <= 0:
|
|
357
|
+
return ([], list(wlist), [])
|
|
358
|
+
_cooperative_sleep(min(0.01, remaining))
|
|
359
|
+
else:
|
|
360
|
+
_cooperative_sleep(0.01)
|
|
361
|
+
|
|
362
|
+
_select_mod = types.ModuleType("select")
|
|
363
|
+
_select_mod.select = _select
|
|
364
|
+
_select_mod.error = OSError
|
|
365
|
+
_select_mod.POLLIN = 1
|
|
366
|
+
_select_mod.POLLOUT = 4
|
|
367
|
+
_select_mod.POLLERR = 8
|
|
368
|
+
_select_mod.POLLHUP = 16
|
|
369
|
+
_select_mod.POLLNVAL = 32
|
|
370
|
+
sys.modules["select"] = _select_mod
|
|
371
|
+
|
|
372
|
+
EVENT_READ = 1
|
|
373
|
+
EVENT_WRITE = 2
|
|
374
|
+
|
|
375
|
+
class _NimbusSelector:
|
|
376
|
+
def __init__(self):
|
|
377
|
+
self._registry = {}
|
|
378
|
+
|
|
379
|
+
def register(self, fileobj, events, data=None):
|
|
380
|
+
fd = fileobj if isinstance(fileobj, int) else fileobj.fileno()
|
|
381
|
+
key = types.SimpleNamespace(fileobj=fileobj, fd=int(fd), events=events, data=data)
|
|
382
|
+
self._registry[int(fd)] = key
|
|
383
|
+
return key
|
|
384
|
+
|
|
385
|
+
def unregister(self, fileobj):
|
|
386
|
+
fd = fileobj if isinstance(fileobj, int) else fileobj.fileno()
|
|
387
|
+
return self._registry.pop(int(fd))
|
|
388
|
+
|
|
389
|
+
def modify(self, fileobj, events, data=None):
|
|
390
|
+
self.unregister(fileobj)
|
|
391
|
+
return self.register(fileobj, events, data)
|
|
392
|
+
|
|
393
|
+
def get_key(self, fileobj):
|
|
394
|
+
fd = fileobj if isinstance(fileobj, int) else fileobj.fileno()
|
|
395
|
+
return self._registry[int(fd)]
|
|
396
|
+
|
|
397
|
+
def get_map(self):
|
|
398
|
+
return dict(self._registry)
|
|
399
|
+
|
|
400
|
+
def select(self, timeout=None):
|
|
401
|
+
read_items = [k.fileobj for k in self._registry.values() if k.events & EVENT_READ]
|
|
402
|
+
write_items = [k.fileobj for k in self._registry.values() if k.events & EVENT_WRITE]
|
|
403
|
+
ready_read, ready_write, _ = _select(read_items, write_items, [], timeout)
|
|
404
|
+
ready = {}
|
|
405
|
+
for item in ready_read:
|
|
406
|
+
fd = item if isinstance(item, int) else item.fileno()
|
|
407
|
+
key = self._registry.get(int(fd))
|
|
408
|
+
if key is not None:
|
|
409
|
+
ready[key.fd] = [key, ready.get(key.fd, [key, 0])[1] | EVENT_READ]
|
|
410
|
+
for item in ready_write:
|
|
411
|
+
fd = item if isinstance(item, int) else item.fileno()
|
|
412
|
+
key = self._registry.get(int(fd))
|
|
413
|
+
if key is not None:
|
|
414
|
+
ready[key.fd] = [key, ready.get(key.fd, [key, 0])[1] | EVENT_WRITE]
|
|
415
|
+
return [(key, events) for key, events in ready.values()]
|
|
416
|
+
|
|
417
|
+
def close(self):
|
|
418
|
+
self._registry.clear()
|
|
419
|
+
|
|
420
|
+
def __enter__(self):
|
|
421
|
+
return self
|
|
422
|
+
|
|
423
|
+
def __exit__(self, exc_type, exc, tb):
|
|
424
|
+
self.close()
|
|
425
|
+
|
|
426
|
+
_selectors_mod = types.ModuleType("selectors")
|
|
427
|
+
_selectors_mod.EVENT_READ = EVENT_READ
|
|
428
|
+
_selectors_mod.EVENT_WRITE = EVENT_WRITE
|
|
429
|
+
_selectors_mod.DefaultSelector = _NimbusSelector
|
|
430
|
+
_selectors_mod.SelectSelector = _NimbusSelector
|
|
431
|
+
_selectors_mod.PollSelector = _NimbusSelector
|
|
432
|
+
_selectors_mod.BaseSelector = _NimbusSelector
|
|
433
|
+
sys.modules["selectors"] = _selectors_mod
|
|
434
|
+
if "socketserver" in sys.modules:
|
|
435
|
+
try:
|
|
436
|
+
sys.modules["socketserver"]._ServerSelector = _NimbusSelector
|
|
437
|
+
except Exception:
|
|
438
|
+
pass
|
|
439
|
+
|
|
440
|
+
_nimbus_socketserver_servers = {}
|
|
441
|
+
|
|
442
|
+
def _nimbus_patch_socketserver():
|
|
443
|
+
try:
|
|
444
|
+
import socketserver as _socketserver
|
|
445
|
+
except Exception:
|
|
446
|
+
return
|
|
447
|
+
try:
|
|
448
|
+
_socketserver.socket = sys.modules["socket"]
|
|
449
|
+
except Exception:
|
|
450
|
+
pass
|
|
451
|
+
try:
|
|
452
|
+
_socketserver._ServerSelector = _NimbusSelector
|
|
453
|
+
except Exception:
|
|
454
|
+
pass
|
|
455
|
+
if getattr(_socketserver.BaseServer.serve_forever, "_nimbus_virtual_socket", False):
|
|
456
|
+
return
|
|
457
|
+
|
|
458
|
+
_orig_server_close = _socketserver.BaseServer.server_close
|
|
459
|
+
|
|
460
|
+
def _serve_forever(self, poll_interval=0.5):
|
|
461
|
+
sock = getattr(self, "socket", None)
|
|
462
|
+
if sock is not None:
|
|
463
|
+
try:
|
|
464
|
+
port = int(sock.getsockname()[1])
|
|
465
|
+
_nimbus_socketserver_servers[port] = self
|
|
466
|
+
except Exception:
|
|
467
|
+
pass
|
|
468
|
+
shut_down = getattr(self, "_BaseServer__is_shut_down", None)
|
|
469
|
+
if shut_down is not None:
|
|
470
|
+
shut_down.set()
|
|
471
|
+
return None
|
|
472
|
+
|
|
473
|
+
def _server_close(self):
|
|
474
|
+
sock = getattr(self, "socket", None)
|
|
475
|
+
if sock is not None:
|
|
476
|
+
try:
|
|
477
|
+
_nimbus_socketserver_servers.pop(int(sock.getsockname()[1]), None)
|
|
478
|
+
except Exception:
|
|
479
|
+
pass
|
|
480
|
+
return _orig_server_close(self)
|
|
481
|
+
|
|
482
|
+
_serve_forever._nimbus_virtual_socket = True
|
|
483
|
+
_socketserver.BaseServer.serve_forever = _serve_forever
|
|
484
|
+
_socketserver.BaseServer.server_close = _server_close
|
|
485
|
+
|
|
486
|
+
def _process_request_sync(self, request, client_address):
|
|
487
|
+
try:
|
|
488
|
+
self.finish_request(request, client_address)
|
|
489
|
+
self.shutdown_request(request)
|
|
490
|
+
except Exception:
|
|
491
|
+
self.handle_error(request, client_address)
|
|
492
|
+
self.shutdown_request(request)
|
|
493
|
+
|
|
494
|
+
try:
|
|
495
|
+
_socketserver.ThreadingMixIn.process_request = _process_request_sync
|
|
496
|
+
except Exception:
|
|
497
|
+
pass
|
|
498
|
+
|
|
499
|
+
def _nimbus_handle_socketserver_request(port):
|
|
500
|
+
server = _nimbus_socketserver_servers.get(int(port))
|
|
501
|
+
if server is None:
|
|
502
|
+
return False
|
|
503
|
+
server._handle_request_noblock()
|
|
504
|
+
return True
|
|
505
|
+
|
|
506
|
+
def _nimbus_ensure_socketserver_listener(port):
|
|
507
|
+
server = _nimbus_socketserver_servers.get(int(port))
|
|
508
|
+
if server is None:
|
|
509
|
+
return False
|
|
510
|
+
sock = getattr(server, "socket", None)
|
|
511
|
+
if sock is None:
|
|
512
|
+
return False
|
|
513
|
+
try:
|
|
514
|
+
sock.listen(getattr(server, "request_queue_size", 128))
|
|
515
|
+
return True
|
|
516
|
+
except Exception:
|
|
517
|
+
return False
|
|
518
|
+
|
|
519
|
+
_socket_mod = types.ModuleType("socket")
|
|
520
|
+
for _name, _value in list(globals().items()):
|
|
521
|
+
if _name.startswith("_") and _name not in ("_GLOBAL_DEFAULT_TIMEOUT",):
|
|
522
|
+
continue
|
|
523
|
+
setattr(_socket_mod, _name, _value)
|
|
524
|
+
sys.modules["socket"] = _socket_mod
|
|
525
|
+
_nimbus_patch_socketserver()
|
|
526
|
+
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"require-resolver.d.ts","sourceRoot":"","sources":["../../src/runtime/require-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"require-resolver.d.ts","sourceRoot":"","sources":["../../src/runtime/require-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AA6atD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,CAmOhB"}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* de-quarantines it as the primary content-bundle source.
|
|
28
28
|
*/
|
|
29
29
|
import { resolvePackageEntry as sharedResolvePackageEntry, resolveExports as sharedResolveExports, DEFAULT_CJS_CONDITIONS, } from '../_shared/exports-resolver.js';
|
|
30
|
+
import { normalizeVfsPath } from '../vfs/path.js';
|
|
30
31
|
import { stripCommentsForImports } from './comment-strip.js';
|
|
31
32
|
// Match literal-string require/require.resolve with single, double, or
|
|
32
33
|
// template-literal-no-interp specifier. The plain-string variant is by
|
|
@@ -80,17 +81,7 @@ const IMPORT_RE = /(?:^|[\n;}])\s*(?:import|export)(?:[\s{][\w*${}\s,]*?\s*from)
|
|
|
80
81
|
const MAX_FILES = 4000;
|
|
81
82
|
const MAX_BYTES = 24 * 1024 * 1024; // 24 MiB raw — facet-manager re-caps on JSON-encoded size.
|
|
82
83
|
function strip(p) { return p.replace(/^\/+/, ''); }
|
|
83
|
-
|
|
84
|
-
const segments = p.split('/');
|
|
85
|
-
const out = [];
|
|
86
|
-
for (const seg of segments) {
|
|
87
|
-
if (seg === '..' && out.length > 0)
|
|
88
|
-
out.pop();
|
|
89
|
-
else if (seg !== '.' && seg !== '')
|
|
90
|
-
out.push(seg);
|
|
91
|
-
}
|
|
92
|
-
return out.join('/');
|
|
93
|
-
}
|
|
84
|
+
const normalizePath = normalizeVfsPath;
|
|
94
85
|
/**
|
|
95
86
|
* Extension-list probe; mirrors node-shims.ts:__resolveFile so prefetch
|
|
96
87
|
* picks the same on-disk file the runtime require will pick.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SqliteVFS } from '../vfs/sqlite-vfs.js';
|
|
2
|
+
export interface RubyGemRequest {
|
|
3
|
+
name: string;
|
|
4
|
+
requirements: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface RubyGemInstallReport {
|
|
7
|
+
installed: string[];
|
|
8
|
+
alreadyInstalled: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function defaultGemHome(): string;
|
|
11
|
+
export declare function installedGemLibRoots(vfs: SqliteVFS, gemHome?: string): string[];
|
|
12
|
+
export declare function installRubyGems(vfs: SqliteVFS, requests: RubyGemRequest[], opts?: {
|
|
13
|
+
gemHome?: string;
|
|
14
|
+
includeDependencies?: boolean;
|
|
15
|
+
}): Promise<RubyGemInstallReport>;
|
|
16
|
+
export declare function installRubyBundle(vfs: SqliteVFS, cwd: string, opts?: {
|
|
17
|
+
gemHome?: string;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
requests: RubyGemRequest[];
|
|
20
|
+
report: RubyGemInstallReport;
|
|
21
|
+
lockfilePath: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function parseGemfile(text: string): RubyGemRequest[];
|
|
24
|
+
export declare function parseRubyGemRequirements(input: string | undefined): string[];
|
|
25
|
+
//# sourceMappingURL=ruby-gems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruby-gems.d.ts","sourceRoot":"","sources":["../../src/runtime/ruby-gems.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAOtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AA2BD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,SAAmB,GAAG,MAAM,EAAE,CAUzF;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,cAAc,EAAE,EAC1B,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CAoB/B;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,OAAO,CAAC;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAkC7F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAS3D;AA+WD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAM5E"}
|