igorkamyshev / farfetched

The advanced data fetching tool for web applications
https://ff.effector.dev
MIT License
190 stars 34 forks source link

Custom error serialization #492

Open spotsccc opened 3 months ago

spotsccc commented 3 months ago

Hi! I'd like to use custom serialization for $error store in query and mutation.

My use case:

I have a project that uses nextjs and farfetched, sometimes a NetworkError can happen on the server side, this type of error has a non-serializable property "cause". In this situation I can't to serialize queries running on the server. Now the only one solution is to set serialize property to 'ignore', but it will disable serialization for all stores. That's not what i want.

My suggestion:

I think that it would be nice to separate serialization for $error and $data. As i understood, now serialization property works like this:

  1. If serialization equals to 'ignore', it will disable all serialization
  2. If serialization equals to {write: ..., read...}, this rules will be used only for $data store, and will have no effect for all other stores

And I suggest changing this behavior to this: type Serialize<Data | Initial> = Serialize<Data | Initial> | {error?: Serialize<Data | Initial>, data?: Serialize<Data | Initial>} | undefined;

  1. If serialization equals to 'ignore' or {write: ..., read...}, it will works like before
  2. If serialization equals to {error: ..., data: ... }, it will apply different serialization rules for $error and $data

Hope my suggestion helps!

zerobias commented 3 months ago

error.cause is almost always are non-serialable, so we probably could just add default serialization to $error store:

$error = createStore(null, {
  serialize: {
    read: error => error,
    write: ({cause, ...error}) => error,
  }
})