@ai-ecoverse/slicc-kernel 1.103.4 → 1.106.3

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 (38) hide show
  1. package/README.md +57 -16
  2. package/dist/driver-worker.js +36 -1
  3. package/dist/driver-worker.js.map +2 -2
  4. package/dist/index.js +89 -5
  5. package/dist/index.js.map +2 -2
  6. package/dist/kernel-worker.js +798 -295
  7. package/dist/kernel-worker.js.map +4 -4
  8. package/dist/meta.js.map +2 -2
  9. package/dist/node-driver-worker.js +36 -1
  10. package/dist/node-driver-worker.js.map +2 -2
  11. package/dist/node-process-worker.js +489 -234
  12. package/dist/node-process-worker.js.map +4 -4
  13. package/dist/node.js +846 -315
  14. package/dist/node.js.map +4 -4
  15. package/dist/process-worker.js +426 -171
  16. package/dist/process-worker.js.map +4 -4
  17. package/dist/types/commands.d.ts +6 -1
  18. package/dist/types/fs/command-stat.d.ts +3 -0
  19. package/dist/types/fs/commands.d.ts +7 -1
  20. package/dist/types/fs/engines.d.ts +5 -0
  21. package/dist/types/fs/types.d.ts +1 -0
  22. package/dist/types/kernel/host.d.ts +1 -0
  23. package/dist/types/kernel/net/http-syscalls.d.ts +10 -0
  24. package/dist/types/kernel/net/http1.d.ts +1 -0
  25. package/dist/types/kernel/net/remote-transport.d.ts +18 -0
  26. package/dist/types/kernel/net/transport.d.ts +2 -0
  27. package/dist/types/kernel/process.d.ts +8 -0
  28. package/dist/types/launcher.d.ts +4 -0
  29. package/dist/types/process/js/js-kernel.d.ts +2 -1
  30. package/dist/types/process/process-signals.d.ts +3 -0
  31. package/dist/types/process/wasi/wasi-cred.d.ts +11 -0
  32. package/dist/types/process/wasi/wasi-files.d.ts +1 -0
  33. package/dist/types/process/wasi/wasi-host.d.ts +9 -0
  34. package/dist/types/process/wasi/wasi-sigmask.d.ts +7 -1
  35. package/dist/types/process/wasi/wasix-epoll.d.ts +3 -0
  36. package/dist/types/refused-command.d.ts +4 -0
  37. package/dist/types/transport.d.ts +1 -0
  38. package/package.json +12 -12
package/dist/index.js CHANGED
@@ -1030,6 +1030,28 @@ async function* chunks(body, idleMs) {
1030
1030
  await reader.cancel().catch(() => void 0);
1031
1031
  }
1032
1032
  }
1033
+ function streamOf(body) {
1034
+ const it = body[Symbol.asyncIterator]();
1035
+ return new ReadableStream(
1036
+ {
1037
+ async pull(controller) {
1038
+ const next = await it.next();
1039
+ if (next.done) controller.close();
1040
+ else controller.enqueue(next.value);
1041
+ },
1042
+ async cancel(reason) {
1043
+ await it.return?.(reason);
1044
+ }
1045
+ },
1046
+ { highWaterMark: 0 }
1047
+ );
1048
+ }
1049
+ function requestBody(request) {
1050
+ if (request.bodyStream) {
1051
+ return { body: streamOf(request.bodyStream), duplex: "half" };
1052
+ }
1053
+ return request.body ? { body: request.body } : {};
1054
+ }
1033
1055
  function fetchTransport(options = {}) {
1034
1056
  const send2 = options.fetch ?? globalThis.fetch.bind(globalThis);
1035
1057
  const Socket = options.webSocket === true ? globalThis.WebSocket : options.webSocket || void 0;
@@ -1041,7 +1063,8 @@ function fetchTransport(options = {}) {
1041
1063
  encodedBodies: false,
1042
1064
  maxRequestBody: options.maxRequestBody ?? MAX_REQUEST_BODY,
1043
1065
  crossOrigin: "cors",
1044
- ...Socket ? { websocket: true } : {}
1066
+ ...Socket ? { websocket: true } : {},
1067
+ ...options.streamingBodies ? { streamingBodies: true } : {}
1045
1068
  },
1046
1069
  ...Socket ? { websocket: (request) => openWebSocket(Socket, request, headers) } : {},
1047
1070
  async fetch(request) {
@@ -1050,7 +1073,7 @@ function fetchTransport(options = {}) {
1050
1073
  response = await send2(request.url, {
1051
1074
  method: request.method,
1052
1075
  headers: joinHeaders(request.headers),
1053
- ...request.body ? { body: request.body } : {},
1076
+ ...requestBody(request),
1054
1077
  signal: request.signal,
1055
1078
  redirect,
1056
1079
  credentials: "omit",
@@ -1087,6 +1110,29 @@ function fetchTransport(options = {}) {
1087
1110
  }
1088
1111
  };
1089
1112
  }
1113
+ function uploadsFor(peer) {
1114
+ const pulls = /* @__PURE__ */ new Map();
1115
+ const of = (nid, signal) => ({
1116
+ async *[Symbol.asyncIterator]() {
1117
+ for (; ; ) {
1118
+ signal.throwIfAborted();
1119
+ const got = await new Promise((resolve, reject) => {
1120
+ const stop = () => reject(signal.reason);
1121
+ signal.addEventListener("abort", stop, { once: true });
1122
+ pulls.set(nid, (call) => {
1123
+ signal.removeEventListener("abort", stop);
1124
+ resolve(call);
1125
+ });
1126
+ peer.postMessage({ net: "body-pull", nid });
1127
+ }).finally(() => pulls.delete(nid));
1128
+ if (got.net === "body-end") return;
1129
+ if (got.net === "body-error") throw new Error(got.message);
1130
+ if (got.net === "body-chunk") yield got.bytes;
1131
+ }
1132
+ }
1133
+ });
1134
+ return { of, answer: (call) => pulls.get(call.nid)?.(call) };
1135
+ }
1090
1136
  function serveTransport(peer, transport, { closeWaitMs = CLOSE_WAIT_MS } = {}) {
1091
1137
  const open = /* @__PURE__ */ new Map();
1092
1138
  const fail = (nid, e) => {
@@ -1100,6 +1146,7 @@ function serveTransport(peer, transport, { closeWaitMs = CLOSE_WAIT_MS } = {}) {
1100
1146
  ...typeof code === "string" ? { code } : {}
1101
1147
  });
1102
1148
  };
1149
+ const uploads = uploadsFor(peer);
1103
1150
  const start = async (call) => {
1104
1151
  const abort = new AbortController();
1105
1152
  const entry = { abort };
@@ -1109,7 +1156,7 @@ function serveTransport(peer, transport, { closeWaitMs = CLOSE_WAIT_MS } = {}) {
1109
1156
  url: call.url,
1110
1157
  method: call.method,
1111
1158
  headers: call.headers,
1112
- ...call.body ? { body: call.body } : {},
1159
+ ...call.streamed ? { bodyStream: uploads.of(call.nid, abort.signal) } : call.body ? { body: call.body } : {},
1113
1160
  signal: abort.signal
1114
1161
  });
1115
1162
  if (!open.has(call.nid)) {
@@ -1247,7 +1294,9 @@ function serveTransport(peer, transport, { closeWaitMs = CLOSE_WAIT_MS } = {}) {
1247
1294
  return {
1248
1295
  answer(call) {
1249
1296
  if (call.net === "fetch") void start(call);
1250
- else if (call.net === "read") void read(call.nid);
1297
+ else if (call.net === "body-chunk" || call.net === "body-end" || call.net === "body-error") {
1298
+ uploads.answer(call);
1299
+ } else if (call.net === "read") void read(call.nid);
1251
1300
  else if (call.net === "ws-open") void openSocket(call);
1252
1301
  else if (call.net === "ws-send") void sendOn(call);
1253
1302
  else if (call.net === "ws-close") {
@@ -1278,12 +1327,17 @@ var RemoteTransport = class {
1278
1327
  waiting = /* @__PURE__ */ new Map();
1279
1328
  nextId = 0;
1280
1329
  sockets = /* @__PURE__ */ new Map();
1330
+ uploads = /* @__PURE__ */ new Map();
1281
1331
  failure;
1282
1332
  constructor(port, traits) {
1283
1333
  this.port = port;
1284
1334
  this.traits = traits;
1285
1335
  }
1286
1336
  receive(reply) {
1337
+ if (reply.net === "body-pull") {
1338
+ void this.pull(reply.nid);
1339
+ return;
1340
+ }
1287
1341
  const socket = this.sockets.get(reply.nid);
1288
1342
  if (socket && this.toSocket(reply, socket)) return;
1289
1343
  const waiter = this.waiting.get(reply.nid);
@@ -1302,8 +1356,35 @@ var RemoteTransport = class {
1302
1356
  } else return false;
1303
1357
  return true;
1304
1358
  }
1359
+ async pull(nid) {
1360
+ const upload = this.uploads.get(nid);
1361
+ if (!upload) {
1362
+ this.port.postMessage({ net: "body-error", nid, message: "the request body is gone" });
1363
+ return;
1364
+ }
1365
+ try {
1366
+ const next = await upload.next();
1367
+ if (next.done) {
1368
+ this.uploads.delete(nid);
1369
+ this.port.postMessage({ net: "body-end", nid });
1370
+ } else this.port.postMessage({ net: "body-chunk", nid, bytes: next.value });
1371
+ } catch (e) {
1372
+ this.uploads.delete(nid);
1373
+ this.port.postMessage({
1374
+ net: "body-error",
1375
+ nid,
1376
+ message: e instanceof Error ? e.message : String(e)
1377
+ });
1378
+ }
1379
+ }
1380
+ dropUpload(nid) {
1381
+ const upload = this.uploads.get(nid);
1382
+ this.uploads.delete(nid);
1383
+ void upload?.return?.().catch(() => void 0);
1384
+ }
1305
1385
  fail(error) {
1306
1386
  this.failure = error;
1387
+ for (const nid of [...this.uploads.keys()]) this.dropUpload(nid);
1307
1388
  for (const waiter of this.waiting.values()) waiter.reject(error);
1308
1389
  this.waiting.clear();
1309
1390
  for (const socket of this.sockets.values())
@@ -1330,14 +1411,17 @@ var RemoteTransport = class {
1330
1411
  let finished = false;
1331
1412
  const abort = () => {
1332
1413
  finished = true;
1414
+ this.dropUpload(nid);
1333
1415
  this.cancel(nid);
1334
1416
  };
1335
1417
  signal.addEventListener("abort", abort, { once: true });
1336
1418
  const finish = () => {
1419
+ this.dropUpload(nid);
1337
1420
  if (finished) return;
1338
1421
  finished = true;
1339
1422
  signal.removeEventListener("abort", abort);
1340
1423
  };
1424
+ if (request.bodyStream) this.uploads.set(nid, request.bodyStream[Symbol.asyncIterator]());
1341
1425
  let head;
1342
1426
  try {
1343
1427
  head = await this.ask({
@@ -1346,7 +1430,7 @@ var RemoteTransport = class {
1346
1430
  url: request.url,
1347
1431
  method: request.method,
1348
1432
  headers: request.headers,
1349
- ...request.body ? { body: request.body } : {}
1433
+ ...request.bodyStream ? { streamed: true } : request.body ? { body: request.body } : {}
1350
1434
  });
1351
1435
  } catch (e) {
1352
1436
  finish();