function useRecoilURLSyncTransit()

in packages/recoil-sync/RecoilSync_URLTransit.js [69:122]


function useRecoilURLSyncTransit({
  handlers: handlersProp = [],
  ...options
}: RecoilURLSyncTransitOptions): void {
  if (options.location.part === 'href') {
    throw err('"href" location is not supported for Transit encoding');
  }

  const handlers = useMemo(
    () => [...BUILTIN_HANDLERS, ...handlersProp],
    [handlersProp],
  );

  const writer = useMemo(
    () =>
      transit.writer('json', {
        handlers: transit.map(
          handlers
            .map(handler => [
              handler.class,
              transit.makeWriteHandler({
                tag: () => handler.tag,
                rep: handler.write,
              }),
            ])
            .flat(1),
        ),
      }),
    [handlers],
  );
  const serialize = useCallback(x => writer.write(x), [writer]);

  const reader = useMemo(
    () =>
      transit.reader('json', {
        handlers: handlers.reduce((c, {tag, read}) => {
          c[tag] = read;
          return c;
        }, {}),
        mapBuilder: {
          init: () => ({}),
          add: (ret, key, val) => {
            ret[key] = val;
            return ret;
          },
          finalize: ret => ret,
        },
      }),
    [handlers],
  );
  const deserialize = useCallback(x => reader.read(x), [reader]);

  useRecoilURLSync({...options, serialize, deserialize});
}