agent-js icon indicating copy to clipboard operation
agent-js copied to clipboard

Serialising responses and state management

Open infu opened this issue 3 years ago • 1 comments

Is your feature request related to a problem? Please describe. Currently Agent responses include Bigint, Principal (class) and typed arrays (Uint8array) I believe thats made to increase performance. But these can't be stored in state. One of the rules in state management libraries: "Do Not Put Non-Serializable Values in State" So a developer would have to convert every response before storing it in state and then convert it back when making requests with values coming from state.

I am using this to transform my responses and store them.

export const SerializableIC = (x) => {
  if (x === undefined || x === null) return x;
  if (typeof x === "bigint") return x.toString();
  if (ArrayBuffer.isView(x) || x instanceof ArrayBuffer)
    return [...x].map((y) => SerializableIC(y));

  if (Array.isArray(x)) {
    return x.map((y) => SerializableIC(y));
  }

  if (typeof x === "object") {
    if ("toText" in x) return x.toText();

    return Object.fromEntries(
      Object.keys(x).map((k) => {
        return [k, SerializableIC(x[k])];
      })
    );
  }
  return x;
};

Describe the solution you'd like While it's beneficial to have optimal performance when dealing with large files, I would like to opt out of it and be able to store responses and later use them in other requests without having to transform them two times.

This probably means a new createAgent option, which makes all BigInt become text. all Principals become text and uint8arrays become arrays. And then later accepts these in requests.

infu avatar Nov 18 '22 20:11 infu

+1, actually ran into this yesterday as well. I'm a bit swamped with responsibilities right now but will let you know if I find a solution, since I also need this feature for an internal project.

rvanasa avatar Nov 19 '22 17:11 rvanasa