@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.
Files changed (135) hide show
  1. package/README.md +37 -0
  2. package/dist/_shared/crypto.d.ts +15 -0
  3. package/dist/_shared/crypto.d.ts.map +1 -0
  4. package/dist/_shared/crypto.js +122 -0
  5. package/dist/facets/manager.d.ts +24 -0
  6. package/dist/facets/manager.d.ts.map +1 -1
  7. package/dist/facets/manager.js +279 -70
  8. package/dist/facets/process.d.ts +11 -2
  9. package/dist/facets/process.d.ts.map +1 -1
  10. package/dist/facets/process.js +187 -21
  11. package/dist/facets/vite-dev-server.d.ts +2 -0
  12. package/dist/facets/vite-dev-server.d.ts.map +1 -1
  13. package/dist/facets/vite-dev-server.js +39 -12
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/loaders/child-process/spawn-facet.d.ts +1 -3
  18. package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -1
  19. package/dist/loaders/child-process/spawn-facet.js +1 -12
  20. package/dist/loaders/child-process/spawn-pool.d.ts +1 -1
  21. package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -1
  22. package/dist/loaders/child-process/spawn-pool.js +1 -6
  23. package/dist/npm/installer.d.ts.map +1 -1
  24. package/dist/npm/installer.js +47 -27
  25. package/dist/npm/pre-bundle-facet.d.ts.map +1 -1
  26. package/dist/npm/pre-bundle-facet.js +2 -1
  27. package/dist/npm/resolve-one-facet.d.ts.map +1 -1
  28. package/dist/npm/resolve-one-facet.js +41 -13
  29. package/dist/npm/resolver.d.ts.map +1 -1
  30. package/dist/npm/resolver.js +70 -35
  31. package/dist/router/index.d.ts.map +1 -1
  32. package/dist/router/index.js +45 -21
  33. package/dist/router/remote-api.d.ts.map +1 -1
  34. package/dist/router/remote-api.js +29 -8
  35. package/dist/runtime/barrel-synthesizer.d.ts +7 -0
  36. package/dist/runtime/barrel-synthesizer.d.ts.map +1 -1
  37. package/dist/runtime/barrel-synthesizer.js +11 -0
  38. package/dist/runtime/clang-runner.d.ts.map +1 -1
  39. package/dist/runtime/clang-runner.js +1 -8
  40. package/dist/runtime/esbuild-service.d.ts +12 -5
  41. package/dist/runtime/esbuild-service.d.ts.map +1 -1
  42. package/dist/runtime/esbuild-service.js +28 -14
  43. package/dist/runtime/node-runner.d.ts +2 -0
  44. package/dist/runtime/node-runner.d.ts.map +1 -1
  45. package/dist/runtime/node-shims.d.ts +4 -2
  46. package/dist/runtime/node-shims.d.ts.map +1 -1
  47. package/dist/runtime/node-shims.js +404 -55
  48. package/dist/runtime/os-contracts.d.ts +128 -0
  49. package/dist/runtime/os-contracts.d.ts.map +1 -0
  50. package/dist/runtime/os-contracts.js +1 -0
  51. package/dist/runtime/package-manager.d.ts.map +1 -1
  52. package/dist/runtime/package-manager.js +32 -7
  53. package/dist/runtime/port-registry.d.ts +5 -0
  54. package/dist/runtime/port-registry.d.ts.map +1 -1
  55. package/dist/runtime/port-registry.js +22 -1
  56. package/dist/runtime/pyodide-runtime-assets.d.ts +19 -0
  57. package/dist/runtime/pyodide-runtime-assets.d.ts.map +1 -0
  58. package/dist/runtime/pyodide-runtime-assets.js +44 -0
  59. package/dist/runtime/python-repl.d.ts +3 -1
  60. package/dist/runtime/python-repl.d.ts.map +1 -1
  61. package/dist/runtime/python-repl.js +11 -29
  62. package/dist/runtime/python-runner.d.ts +8 -9
  63. package/dist/runtime/python-runner.d.ts.map +1 -1
  64. package/dist/runtime/python-runner.js +897 -61
  65. package/dist/runtime/python-socket-shim.d.ts +11 -0
  66. package/dist/runtime/python-socket-shim.d.ts.map +1 -0
  67. package/dist/runtime/python-socket-shim.js +526 -0
  68. package/dist/runtime/require-resolver.d.ts.map +1 -1
  69. package/dist/runtime/require-resolver.js +2 -11
  70. package/dist/runtime/ruby-gems.d.ts +25 -0
  71. package/dist/runtime/ruby-gems.d.ts.map +1 -0
  72. package/dist/runtime/ruby-gems.js +582 -0
  73. package/dist/runtime/ruby-runner.d.ts +2 -4
  74. package/dist/runtime/ruby-runner.d.ts.map +1 -1
  75. package/dist/runtime/ruby-runner.js +335 -34
  76. package/dist/runtime/runtime-catalog.d.ts +16 -4
  77. package/dist/runtime/runtime-catalog.d.ts.map +1 -1
  78. package/dist/runtime/runtime-catalog.js +21 -10
  79. package/dist/runtime/runtime-registry.d.ts +3 -0
  80. package/dist/runtime/runtime-registry.d.ts.map +1 -1
  81. package/dist/runtime/runtime-registry.js +4 -0
  82. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +43 -0
  83. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
  84. package/dist/runtime/sqlite-runtime-fs-bridge.js +224 -0
  85. package/dist/runtime/static-server.d.ts +3 -0
  86. package/dist/runtime/static-server.d.ts.map +1 -0
  87. package/dist/runtime/static-server.js +121 -0
  88. package/dist/runtime/vfs-snapshot.d.ts +57 -0
  89. package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
  90. package/dist/runtime/vfs-snapshot.js +141 -0
  91. package/dist/runtime/virtual-socket-kernel.d.ts +16 -0
  92. package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
  93. package/dist/runtime/virtual-socket-kernel.js +360 -0
  94. package/dist/runtime/wasi-instance.d.ts +6 -3
  95. package/dist/runtime/wasi-instance.d.ts.map +1 -1
  96. package/dist/runtime/wasm-runner.d.ts +1 -25
  97. package/dist/runtime/wasm-runner.d.ts.map +1 -1
  98. package/dist/runtime/wasm-runner.js +1 -160
  99. package/dist/session/agent.d.ts +43 -0
  100. package/dist/session/agent.d.ts.map +1 -0
  101. package/dist/session/agent.js +1252 -0
  102. package/dist/session/init.d.ts.map +1 -1
  103. package/dist/session/init.js +15 -16
  104. package/dist/session/nimbus-session.d.ts +13 -2
  105. package/dist/session/nimbus-session.d.ts.map +1 -1
  106. package/dist/session/nimbus-session.js +55 -7
  107. package/dist/session/programmatic.d.ts +10 -0
  108. package/dist/session/programmatic.d.ts.map +1 -1
  109. package/dist/session/programmatic.js +121 -0
  110. package/dist/session/routes.d.ts.map +1 -1
  111. package/dist/session/routes.js +19 -1
  112. package/dist/session/rpc.d.ts +11 -0
  113. package/dist/session/rpc.d.ts.map +1 -1
  114. package/dist/session/rpc.js +56 -43
  115. package/dist/session/supervisor-rpc.d.ts +15 -0
  116. package/dist/session/supervisor-rpc.d.ts.map +1 -1
  117. package/dist/session/supervisor-rpc.js +32 -0
  118. package/dist/session/ws.d.ts +4 -3
  119. package/dist/session/ws.d.ts.map +1 -1
  120. package/dist/session/ws.js +11 -1
  121. package/dist/shell/unix-commands.js +12 -16
  122. package/dist/vfs/path.d.ts +8 -4
  123. package/dist/vfs/path.d.ts.map +1 -1
  124. package/dist/vfs/path.js +16 -4
  125. package/dist/vfs/sqlite-vfs.d.ts +2 -0
  126. package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
  127. package/dist/vfs/sqlite-vfs.js +11 -0
  128. package/dist/vfs/symlink-registry.d.ts +7 -1
  129. package/dist/vfs/symlink-registry.d.ts.map +1 -1
  130. package/dist/vfs/symlink-registry.js +16 -11
  131. package/package.json +4 -1
  132. package/public/index.html +240 -0
  133. package/public/s/index.html +1172 -146
  134. package/runtime-contracts/pyodide-workerd-adapter.json +18 -0
  135. 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;AAobtD;;;;;;;;;;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"}
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
- function normalizePath(p) {
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"}