@poe-platform/safe-js 0.1.134 → 0.1.136

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.
@@ -27,7 +27,7 @@ import {
27
27
  validateMigrationSemantics,
28
28
  validateSnapshotData,
29
29
  validateSnapshotMigration
30
- } from "./chunk-L74RZHUW.js";
30
+ } from "./chunk-XO7B4P27.js";
31
31
 
32
32
  // packages/safe-js/src/migrate.ts
33
33
  import { createHash } from "node:crypto";
@@ -8249,4 +8249,4 @@ export {
8249
8249
  parseMcpConfig,
8250
8250
  makeMcpModule
8251
8251
  };
8252
- //# sourceMappingURL=chunk-2I6B4TFA.js.map
8252
+ //# sourceMappingURL=chunk-T55F5CLZ.js.map
@@ -7163,16 +7163,24 @@ function registerIntrinsicPrototype(budget, prototype, constructor) {
7163
7163
  let roots = intrinsicPrototypeRoots.get(budget);
7164
7164
  if (roots === void 0) intrinsicPrototypeRoots.set(budget, roots = /* @__PURE__ */ new Set());
7165
7165
  roots.add(prototype);
7166
- const records = [prototype, materializeFunctionProperties(constructor)].map((value) => ({
7167
- value,
7168
- descriptors: new Map(Object.entries(Object.getOwnPropertyDescriptors(value)))
7166
+ const records = [prototype, constructor].map((target) => ({
7167
+ target,
7168
+ value: isGuestClosure(target) ? materializeFunctionProperties(target) : target,
7169
+ prototype: getSandboxPrototype(target),
7170
+ explicit: hasExplicitSandboxPrototype(target)
7171
+ })).map((record2) => ({
7172
+ ...record2,
7173
+ descriptors: new Map(Object.entries(Object.getOwnPropertyDescriptors(record2.value)))
7169
7174
  }));
7170
7175
  const unchanged = (before, after) => before !== void 0 && after !== void 0 && Object.is(before.value, after.value) && before.writable === after.writable && before.configurable === after.configurable && before.enumerable === after.enumerable;
7171
- intrinsicConstructors.set(constructor, () => records.every(({ value, descriptors }) => {
7176
+ intrinsicConstructors.set(constructor, () => records.every(({ target, value, descriptors, prototype: parent, explicit }) => {
7172
7177
  const current = Object.getOwnPropertyDescriptors(value);
7173
- return Object.keys(current).length === descriptors.size && Object.keys(current).every((key) => unchanged(descriptors.get(key), current[key]));
7178
+ return getSandboxPrototype(target) === parent && hasExplicitSandboxPrototype(target) === explicit && Object.keys(current).length === descriptors.size && Object.keys(current).every((key) => unchanged(descriptors.get(key), current[key]));
7174
7179
  }));
7175
- budget.setRetainedValues(prototype, () => records.flatMap(({ value, descriptors }) => Object.entries(Object.getOwnPropertyDescriptors(value)).flatMap(([key, descriptor]) => unchanged(descriptors.get(key), descriptor) ? [] : [key, descriptor.value])));
7180
+ budget.setRetainedValues(prototype, () => records.flatMap(({ target, value, descriptors, prototype: parent }) => [
7181
+ ...getSandboxPrototype(target) === parent ? [] : [getSandboxPrototype(target)],
7182
+ ...Object.entries(Object.getOwnPropertyDescriptors(value)).flatMap(([key, descriptor]) => unchanged(descriptors.get(key), descriptor) ? [] : [key, descriptor.value])
7183
+ ]));
7176
7184
  }
7177
7185
  function releaseObjectPrototype(budget) {
7178
7186
  for (const prototype of intrinsicPrototypeRoots.get(budget) ?? []) budget.setRetainedValues(prototype, void 0);
@@ -7186,7 +7194,7 @@ function getSandboxPrototype(value, budget) {
7186
7194
  const prototype = getBoxedPrototype(boxedValue(value), budget);
7187
7195
  if (prototype !== void 0 && prototype !== value) return prototype;
7188
7196
  }
7189
- return budget !== void 0 && isPrototypeRecord(value) ? intrinsicPrototypes.get(budget) ?? null : null;
7197
+ return budget !== void 0 && !isSandboxClosure(value) && isPrototypeRecord(value) ? intrinsicPrototypes.get(budget) ?? null : null;
7190
7198
  }
7191
7199
  function hasExplicitSandboxPrototype(value) {
7192
7200
  return prototypes.has(value);
@@ -7196,14 +7204,16 @@ function getSandboxDataProperty(value, key, budget) {
7196
7204
  let depth = 0;
7197
7205
  while (typeof current === "object" && current !== null) {
7198
7206
  if (isGuestHostObject(current)) return getHostObjectMember(current, String(key));
7199
- if (isGuestClosure(current)) return getGuestFunctionProperty(current, String(key));
7200
- if (isSandboxClosure(current)) {
7207
+ if (isGuestClosure(current)) {
7208
+ const entry = getGuestFunctionProperty(current, String(key));
7209
+ if (entry !== void 0 || Object.hasOwn(current.properties ?? {}, String(key))) return entry;
7210
+ } else if (isSandboxClosure(current)) {
7201
7211
  const properties = current.properties;
7202
7212
  return properties !== void 0 && Object.hasOwn(properties, String(key)) ? properties[String(key)] : void 0;
7203
7213
  }
7204
7214
  if (isSandboxMap(current) || isSandboxSet(current) || isSandboxPromise(current) || isSandboxRegex(current) || isSandboxGenerator(current))
7205
7215
  return void 0;
7206
- if (Object.hasOwn(current, String(key))) return current[String(key)];
7216
+ if (!isSandboxClosure(current) && Object.hasOwn(current, String(key))) return current[String(key)];
7207
7217
  current = getSandboxPrototype(current, budget);
7208
7218
  if (current !== null) {
7209
7219
  budget?.visitNode();
@@ -7218,7 +7228,7 @@ function setSandboxPrototype(value, prototype, budget) {
7218
7228
  }
7219
7229
  if (!isPrototypeRecord(value) || prototype !== null && !isPrototypeRecord(prototype)) {
7220
7230
  throw new TypeError(
7221
- "Prototype links require ordinary sandbox objects; callable and exotic prototype chains are not supported."
7231
+ "Prototype links require ordinary sandbox objects or guest functions."
7222
7232
  );
7223
7233
  }
7224
7234
  if (prototypes.has(value) && getSandboxPrototype(value, budget) === prototype) return;
@@ -7234,6 +7244,7 @@ function setSandboxPrototype(value, prototype, budget) {
7234
7244
  prototypes.set(value, prototype);
7235
7245
  }
7236
7246
  function isPrototypeRecord(value) {
7247
+ if (isGuestClosure(value)) return true;
7237
7248
  if (isGuestHostObject(value)) return false;
7238
7249
  if (isSandboxClosure(value) || isSandboxGenerator(value) || isSandboxMap(value) || isSandboxPromise(value) || isSandboxRegex(value) || isSandboxSet(value))
7239
7250
  return false;
@@ -25030,18 +25041,27 @@ function toIntegerOrInfinity(value) {
25030
25041
  // packages/safe-js/src/interp/methods/function.ts
25031
25042
  var functionMethodNames = /* @__PURE__ */ new Set(["apply", "bind", "call", "toString"]);
25032
25043
  function getFunctionMember(target, property, options) {
25033
- if (isGuestClosure(target)) {
25034
- const value = getGuestFunctionProperty(target, String(property));
25035
- if (value !== void 0 || Object.hasOwn(target.properties ?? {}, String(property))) return value;
25036
- if (!isFunctionMethodName(property)) return void 0;
25037
- }
25038
- const properties = target.properties;
25039
- if (properties !== void 0 && Object.hasOwn(properties, String(property))) {
25040
- return properties[String(property)];
25041
- }
25042
- if (property === "length") {
25043
- return target.length;
25044
+ let current = target;
25045
+ let depth = 0;
25046
+ while (current !== null) {
25047
+ if (isGuestClosure(current)) {
25048
+ const value = getGuestFunctionProperty(current, String(property));
25049
+ if (value !== void 0 || Object.hasOwn(current.properties ?? {}, String(property))) return value;
25050
+ } else if (isSandboxClosure(current)) {
25051
+ if (current.properties !== void 0 && Object.hasOwn(current.properties, String(property)))
25052
+ return current.properties[String(property)];
25053
+ if (property === "length") return current.length;
25054
+ } else if (Object.hasOwn(current, String(property))) {
25055
+ return current[String(property)];
25056
+ }
25057
+ if (isSandboxClosure(current) && !hasExplicitSandboxPrototype(current)) break;
25058
+ current = getSandboxPrototype(current, options.budget);
25059
+ if (current !== null) {
25060
+ options.budget?.visitNode();
25061
+ assertSandboxDataDepth(++depth);
25062
+ }
25044
25063
  }
25064
+ if (current === null) return void 0;
25045
25065
  if (property === "toString" && runResources.getStore()?.functionSourceText === false) return void 0;
25046
25066
  if (!isFunctionMethodName(property)) {
25047
25067
  return void 0;
@@ -25067,7 +25087,7 @@ function callFunctionMethod(target, methodName, args, options, stack) {
25067
25087
  const thisValue = args[0];
25068
25088
  if (methodName === "bind") {
25069
25089
  const boundArgs = args.slice(1);
25070
- return createSandboxClosure({
25090
+ const bound = createSandboxClosure({
25071
25091
  guest: true,
25072
25092
  sandbox: true,
25073
25093
  name: `bound ${target.name ?? ""}`,
@@ -25085,6 +25105,9 @@ function callFunctionMethod(target, methodName, args, options, stack) {
25085
25105
  )
25086
25106
  }
25087
25107
  });
25108
+ if (hasExplicitSandboxPrototype(target))
25109
+ setSandboxPrototype(bound, getSandboxPrototype(target, options.budget), options.budget);
25110
+ return bound;
25088
25111
  }
25089
25112
  if (methodName === "call") {
25090
25113
  return options.callClosure(target, args.slice(1), stack, thisValue);
@@ -28935,7 +28958,7 @@ function hasSandboxProperty(value, key, context) {
28935
28958
  while (typeof current === "object" && current !== null) {
28936
28959
  if (isGuestHostObject(current)) return hasHostObjectMember(current, key);
28937
28960
  if (hasOwnSandboxProperty(current, key, false)) return true;
28938
- if (Array.isArray(current) || !isPlainSandboxObject(current) || isSandboxDate(current) || isFloat32Array(current) || isSandboxGenerator(current) || isSandboxCollectionIterator(current)) {
28961
+ if (!(isGuestClosure(current) && hasExplicitSandboxPrototype(current)) && (Array.isArray(current) || !isPlainSandboxObject(current) || isSandboxDate(current) || isFloat32Array(current) || isSandboxGenerator(current) || isSandboxCollectionIterator(current))) {
28939
28962
  return getPropertyValue(current, key, context) !== void 0;
28940
28963
  }
28941
28964
  current = getSandboxPrototype(current, context.budget);
@@ -30905,7 +30928,13 @@ function createConsoleJsonGlobals(options) {
30905
30928
  JSON: {
30906
30929
  parse: createSandboxClosure({
30907
30930
  sandbox: true,
30908
- call: async ([text]) => parseJson(text, options.budget),
30931
+ call: async ([text], context) => {
30932
+ const converted = sandboxString(text, options.budget, context);
30933
+ return copyJsonToSandbox(
30934
+ JSON.parse(converted instanceof Promise ? await converted : converted),
30935
+ options.budget
30936
+ );
30937
+ },
30909
30938
  name: "parse"
30910
30939
  }),
30911
30940
  stringify: createSandboxClosure({
@@ -30971,10 +31000,6 @@ function createConsoleJsonGlobals(options) {
30971
31000
  )
30972
31001
  };
30973
31002
  }
30974
- function parseJson(input, budget) {
30975
- const text = budget.allocateString(toJsonParseText(input));
30976
- return copyJsonToSandbox(JSON.parse(text), budget);
30977
- }
30978
31003
  async function stringifyJson(value, replacer, indent, budget, context) {
30979
31004
  if (replacer !== void 0 && replacer !== null && !isSandboxClosure(replacer)) {
30980
31005
  throw new TypeError(
@@ -31000,15 +31025,6 @@ async function stringifyJson(value, replacer, indent, budget, context) {
31000
31025
  }
31001
31026
  return budget.allocateString(output);
31002
31027
  }
31003
- function toJsonParseText(input) {
31004
- if (Array.isArray(input)) {
31005
- return input.map((entry) => entry === null || entry === void 0 ? "" : toJsonParseText(entry)).join(",");
31006
- }
31007
- if (typeof input === "object" && input !== null) {
31008
- return "[object Object]";
31009
- }
31010
- return String(input);
31011
- }
31012
31028
  async function stringifyProperty(key, holder, state, indent = "") {
31013
31029
  let value = getOwnDataValue(holder, key);
31014
31030
  if (isSandboxDate(value)) {
@@ -33999,4 +34015,4 @@ export {
33999
34015
  FileSnapshotBackend,
34000
34016
  run
34001
34017
  };
34002
- //# sourceMappingURL=chunk-L74RZHUW.js.map
34018
+ //# sourceMappingURL=chunk-XO7B4P27.js.map