@ai-ecoverse/slicc-kernel 1.65.1 → 1.66.0

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/dist/index.js CHANGED
@@ -1095,7 +1095,7 @@ var RemoteTransport = class {
1095
1095
  };
1096
1096
 
1097
1097
  // src/client/protocol.ts
1098
- var PROTOCOL = [1, 8];
1098
+ var PROTOCOL = [1, 9];
1099
1099
  function locksOf(scope = globalThis) {
1100
1100
  const locks = scope.navigator?.locks;
1101
1101
  return typeof locks?.request === "function" ? locks : void 0;
@@ -1799,6 +1799,7 @@ function initCall(options, transport) {
1799
1799
  ...options.hostname !== void 0 ? { hostname: options.hostname } : {},
1800
1800
  ...options.users !== void 0 ? { users: options.users } : {},
1801
1801
  ...options.onDenial ? { denials: true } : {},
1802
+ ...options.approve ? { approve: true } : {},
1802
1803
  ...options.processMounts !== void 0 ? {
1803
1804
  processMounts: typeof options.processMounts === "function" ? "ask" : options.processMounts
1804
1805
  } : {}
@@ -1853,6 +1854,38 @@ async function mountPolicy(options, worker, { id, req }) {
1853
1854
  }
1854
1855
  worker.postMessage({ mountAllowed: { id, allowed } });
1855
1856
  }
1857
+ function approver(approve, worker) {
1858
+ const asked = /* @__PURE__ */ new Map();
1859
+ const handlers = {
1860
+ handle(data) {
1861
+ if ("sudoAsk" in data) void handlers.ask(data.sudoAsk);
1862
+ else if ("sudoAbort" in data) handlers.abort(data.sudoAbort);
1863
+ else return false;
1864
+ return true;
1865
+ },
1866
+ async ask(req) {
1867
+ const control = new AbortController();
1868
+ asked.set(req.id, control);
1869
+ let answer = "deny";
1870
+ try {
1871
+ answer = await approve?.(req, { signal: control.signal });
1872
+ } catch {
1873
+ }
1874
+ asked.delete(req.id);
1875
+ if (control.signal.aborted) return;
1876
+ worker.postMessage({ sudoAnswer: { id: req.id, answer } });
1877
+ },
1878
+ abort({ id, reason }) {
1879
+ asked.get(id)?.abort(reason);
1880
+ asked.delete(id);
1881
+ },
1882
+ close() {
1883
+ for (const control of asked.values()) control.abort("withdrawn");
1884
+ asked.clear();
1885
+ }
1886
+ };
1887
+ return handlers;
1888
+ }
1856
1889
  async function createKernel(options = {}) {
1857
1890
  if (!globalThis.crossOriginIsolated) throw new Error(ISOLATION);
1858
1891
  if (options.hostname !== void 0 && !isHostname(options.hostname)) {
@@ -1865,9 +1898,11 @@ async function createKernel(options = {}) {
1865
1898
  let failure3;
1866
1899
  const dials = dialer((req) => call(req));
1867
1900
  const cdp = cdpBridge(options.cdp);
1901
+ const approvals = approver(options.approve, worker);
1868
1902
  const fail = (error) => {
1869
1903
  dials.reset();
1870
1904
  cdp.close();
1905
+ approvals.close();
1871
1906
  failure3 = error;
1872
1907
  bridge?.close();
1873
1908
  uplinks?.close();
@@ -1902,27 +1937,23 @@ async function createKernel(options = {}) {
1902
1937
  source,
1903
1938
  insert: async () => void await call({ op: "insert", target, source, handle: await chosen(handle) })
1904
1939
  });
1905
- worker.addEventListener(
1906
- "message",
1907
- ({
1908
- data
1909
- }) => {
1910
- if ("denial" in data) return void options.onDenial?.(data.denial);
1911
- if ("net" in data) return bridge?.answer(data);
1912
- if ("uplink" in data) return uplinks?.answer(data);
1913
- if ("cdpOpen" in data) return cdp.open(data);
1914
- if ("mountPolicy" in data) return void policy(data.mountPolicy);
1915
- if ("medium" in data) return pendingMedium(data.medium);
1916
- if ("hostfs" in data) return void grantHostfs(data.hostfs);
1917
- const call2 = pending.get(data.id);
1918
- if (!call2) return;
1919
- if (data.fd !== void 0) return call2.output?.(data.fd, data.bytes);
1920
- if (data.started !== void 0) return call2.started?.(data.started);
1921
- pending.delete(data.id);
1922
- if (data.error !== void 0) call2.reject(failed(data.error, data.code));
1923
- else call2.resolve(data.result);
1924
- }
1925
- );
1940
+ worker.addEventListener("message", ({ data }) => {
1941
+ if ("denial" in data) return void options.onDenial?.(data.denial);
1942
+ if (approvals.handle(data)) return;
1943
+ if ("net" in data) return bridge?.answer(data);
1944
+ if ("uplink" in data) return uplinks?.answer(data);
1945
+ if ("cdpOpen" in data) return cdp.open(data);
1946
+ if ("mountPolicy" in data) return void policy(data.mountPolicy);
1947
+ if ("medium" in data) return pendingMedium(data.medium);
1948
+ if ("hostfs" in data) return void grantHostfs(data.hostfs);
1949
+ const call2 = pending.get(data.id);
1950
+ if (!call2) return;
1951
+ if (data.fd !== void 0) return call2.output?.(data.fd, data.bytes);
1952
+ if (data.started !== void 0) return call2.started?.(data.started);
1953
+ pending.delete(data.id);
1954
+ if (data.error !== void 0) call2.reject(failed(data.error, data.code));
1955
+ else call2.resolve(data.result);
1956
+ });
1926
1957
  worker.addEventListener("error", (event) => {
1927
1958
  event.preventDefault();
1928
1959
  fail(new Error(`slicc-kernel worker failed: ${event.message}`));