UNPKG

@yunu-lab/rpc-react

Version:

πŸš€ **React + RPC = ❀️**

1 lines β€’ 54 kB
{"version":3,"file":"index.es","sources":["../src/store/extendStore.ts","../src/providers/RpcStoreProvider.tsx","../src/hooks/useRpc.ts","../src/hooks/createRpcHooks.ts","../src/hooks/useInlineRpcStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n    Store,\n    combineReducers,\n    createSlice,\n    PayloadAction,\n} from \"@reduxjs/toolkit\";\nimport { RpcRepository } from \"@yunu-lab/rpc-ts\";\n\nexport interface ExtendStoreOptions {\n    repository: RpcRepository<any>;\n    store: Store;\n    slices?: Record<string, any>;\n}\n\nexport const extendStore = (options: ExtendStoreOptions) => {\n    const { repository, store, slices = {} } = options;\n\n    const rpcSlice = createSlice({\n        name: \"rpc\",\n        initialState: {} as Record<string, any>,\n        reducers: {\n            setData: (\n                state,\n                action: PayloadAction<{\n                    type: string;\n                    data: any;\n                }>\n            ) => {\n                const { type, data } = action.payload;\n                state[type] = data;\n            },\n        },\n    });\n\n    const newReducer = combineReducers({\n        ...slices,\n        rpc: rpcSlice.reducer,\n    });\n\n    store.replaceReducer(newReducer);\n\n    const unsubscribe = repository.onDataChanged((events) => {\n        events.forEach((event) => {\n            const { type, payload } = event;\n\n            const storageType = repository.getStorageType(String(type));\n\n            if (storageType === \"singleton\") {\n                const nextValue = Array.isArray(payload)\n                    ? payload[0] ?? null\n                    : payload ?? null;\n                store.dispatch(\n                    rpcSlice.actions.setData({\n                        type: String(type),\n                        data: nextValue,\n                    })\n                );\n            } else {\n                const nextArray = Array.isArray(payload)\n                    ? payload\n                    : Object.values(payload || {});\n                store.dispatch(\n                    rpcSlice.actions.setData({\n                        type: String(type),\n                        data: nextArray,\n                    })\n                );\n            }\n        });\n    });\n\n    return {\n        store,\n        repository,\n        unsubscribe,\n    };\n};\n","import React from \"react\";\nimport { RpcRepository } from \"@yunu-lab/rpc-ts\";\nimport { createContext } from \"react\";\n\nconst RpcContext = createContext<{\n    repository: RpcRepository;\n} | null>(null);\n\nexport interface RpcProviderProps {\n    children: React.ReactNode;\n    repository: RpcRepository;\n}\n\nexport const RpcProvider: React.FC<RpcProviderProps> = ({\n    children,\n    repository,\n}) => {\n    return (\n        <RpcContext.Provider value={{ repository }}>\n            {children}\n        </RpcContext.Provider>\n    );\n};\n\nexport { RpcContext }; ","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useContext } from \"react\";\nimport { Rpc, RpcRepository } from \"@yunu-lab/rpc-ts\";\nimport { RpcContext } from \"../providers/RpcStoreProvider\";\n\nexport interface RpcContextType<TTypes extends Record<string, Rpc<any>>> {\n    repository: RpcRepository<TTypes>;\n}\n\nexport const useRpc = <\n    TTypes extends Record<string, Rpc<any>>\n>(): RpcContextType<TTypes> => {\n    const context = useContext(RpcContext);\n\n    if (!context) {\n        throw new Error(\"useRpc must be used within an RpcProvider\");\n    }\n\n    const repository = React.useMemo(\n        () => context.repository as unknown as RpcRepository<TTypes>,\n        [context.repository]\n    );\n\n    return {\n        repository\n    };\n};","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Message, Rpc, StorageType } from \"@yunu-lab/rpc-ts\";\nimport React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { z } from \"zod\";\nimport { useRpc } from \"./useRpc\";\n\ntype InferRpcType<T> = T extends Rpc<infer S> ? z.infer<S> : never;\n\nconst toPascalCase = (s: string): string => {\n\treturn s\n\t\t.split(\"_\")\n\t\t.map(\n\t\t\t(word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t)\n\t\t.join(\"\");\n};\n\ntype ToPascalCase<S extends string> = S extends `${infer First}_${infer Rest}`\n\t? `${Capitalize<First>}${ToPascalCase<Rest>}`\n\t: Capitalize<S>;\n\ninterface RpcState<TTypes extends Record<string, Rpc<any>>> {\n\trpc: {\n\t\t[K in keyof TTypes]?: any;\n\t};\n}\n\ntype RpcHooks<\n\tTTypes extends Record<string, Rpc<any>>,\n\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\tkeyof TTypes,\n\t\tStorageType\n\t>\n> = {\n\t// ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ…ΡƒΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}`]: {\n\t\t(): {\n\t\t\t[P in K as `${P & string}s`]: RpcStorageType[P] extends \"collection\"\n\t\t\t\t? InferRpcType<TTypes[P]>[]\n\t\t\t\t: RpcStorageType[P] extends \"singleton\"\n\t\t\t\t? InferRpcType<TTypes[P]> | null\n\t\t\t\t: InferRpcType<TTypes[P]>[];\n\t\t} & {\n\t\t\t[P in K as `${P &\n\t\t\t\tstring}Map`]: RpcStorageType[P] extends \"collection\"\n\t\t\t\t? Record<string, InferRpcType<TTypes[P]>>\n\t\t\t\t: RpcStorageType[P] extends \"singleton\"\n\t\t\t\t? InferRpcType<TTypes[P]> | null\n\t\t\t\t: Record<string, InferRpcType<TTypes[P]>>;\n\t\t} & {\n\t\t\tfindById: (id: string | number) => InferRpcType<TTypes[K]> | null;\n\t\t\tfindAll: () => InferRpcType<TTypes[K]>[];\n\t\t\tmergeRpc: {\n\t\t\t\t(\n\t\t\t\t\tdata:\n\t\t\t\t\t\t| Record<\n\t\t\t\t\t\t      string,\n\t\t\t\t\t\t      Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t      >\n\t\t\t\t\t\t| InferRpcType<TTypes[K]>[]\n\t\t\t\t\t\t| Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t): InferRpcType<TTypes[K]>[];\n\t\t\t\t<RpcStorageType extends Record<keyof TTypes, StorageType>>(\n\t\t\t\t\tdata: RpcStorageType[K] extends \"collection\"\n\t\t\t\t\t\t?\n\t\t\t\t\t\t      | Record<\n\t\t\t\t\t\t            string,\n\t\t\t\t\t\t            Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t        >\n\t\t\t\t\t\t      | InferRpcType<TTypes[K]>[]\n\t\t\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t\t\t? Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: never\n\t\t\t\t): InferRpcType<TTypes[K]>[];\n\t\t\t};\n\t\t\tclear: () => void;\n\t\t};\n\t\t(id: string | number): InferRpcType<TTypes[K]> | null;\n\t};\n} & {\n\t// Π₯ΡƒΠΊΠΈ для ΠΏΠΎΠ»Π½Ρ‹Ρ… связанных Π΄Π°Π½Π½Ρ‹Ρ…\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}FullRelatedData`]: <\n\t\tTResult = InferRpcType<TTypes[K]>\n\t>(\n\t\tid?: string | number\n\t) => TResult | TResult[] | null;\n} & {\n\t// Π₯ΡƒΠΊΠΈ для ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ с Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}Listener`]: <\n\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\tkeyof TTypes,\n\t\t\tStorageType\n\t\t>\n\t>(\n\t\tcallback: (event: {\n\t\t\ttype: K;\n\t\t\tpayload: RpcStorageType[K] extends \"collection\"\n\t\t\t\t? Array<InferRpcType<TTypes[K]>>\n\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t? InferRpcType<TTypes[K]>\n\t\t\t\t: Array<InferRpcType<TTypes[K]>>;\n\t\t}) => void\n\t) => () => void;\n} & {\n\t// ΠžΠ±Ρ‰ΠΈΠΉ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…\n\tuseDataListener: <\n\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\tkeyof TTypes,\n\t\t\tStorageType\n\t\t>\n\t>(\n\t\tcallback: (\n\t\t\tevents: Array<{\n\t\t\t\ttype: keyof TTypes;\n\t\t\t\tpayload: RpcStorageType[keyof TTypes] extends \"collection\"\n\t\t\t\t\t? Array<InferRpcType<TTypes[keyof TTypes]>>\n\t\t\t\t\t: RpcStorageType[keyof TTypes] extends \"singleton\"\n\t\t\t\t\t? InferRpcType<TTypes[keyof TTypes]>\n\t\t\t\t\t: Array<InferRpcType<TTypes[keyof TTypes]>>;\n\t\t\t}>\n\t\t) => void,\n\t\toptions?: { types?: (keyof TTypes)[] }\n\t) => () => void;\n} & {\n\t// Π₯ΡƒΠΊΠΈ для связанных Π΄Π°Π½Π½Ρ‹Ρ…\n\t[K in keyof TTypes as `use${ToPascalCase<string & K>}Related`]: <\n\t\tTTarget extends keyof TTypes\n\t>(\n\t\tid: string | number,\n\t\ttargetType: TTarget\n\t) => Array<TTypes[TTarget] extends Rpc<infer S> ? z.infer<S> : never>;\n} & {\n\t// Π₯ΡƒΠΊ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний с ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ\n\tuseHandleMessages: () => {\n\t\thandleMessages<\n\t\t\tRpcStorageType extends Record<keyof TTypes, StorageType>\n\t\t>(\n\t\t\tmessages: Array<Message<TTypes>>,\n\t\t\tcallbacks?: {\n\t\t\t\t[K in keyof TTypes]?: (\n\t\t\t\t\tdata: RpcStorageType[K] extends \"collection\"\n\t\t\t\t\t\t?\n\t\t\t\t\t\t      | Record<\n\t\t\t\t\t\t            string,\n\t\t\t\t\t\t            Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t        >\n\t\t\t\t\t\t      | Array<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t\t\t? Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: never\n\t\t\t\t) => void;\n\t\t\t}\n\t\t): void;\n\t};\n};\n\nexport const createRpcHooks = <\n\tTTypes extends Record<string, Rpc<any>>,\n\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\tkeyof TTypes,\n\t\tStorageType\n\t>\n>(\n\ttypeKeys: Array<keyof TTypes>\n): RpcHooks<TTypes, RpcStorageType> => {\n\tconst EMPTY_MAP: Record<string, unknown> = Object.freeze({});\n\n\tconst hooks = {} as RpcHooks<TTypes, RpcStorageType>;\n\n\t// ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ…ΡƒΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°\n\ttypeKeys.forEach((typeName) => {\n\t\tconst hookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}` as keyof RpcHooks<TTypes>;\n\t\tconst typeKey = typeName as keyof TTypes;\n\n\t\tfunction useHook(id?: string | number) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst allData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) => (state.rpc[typeKey] as unknown) ?? EMPTY_MAP\n\t\t\t) as any;\n\n\t\t\tconst storageType = (repository as any).getStorageType?.(\n\t\t\t\tString(typeKey)\n\t\t\t);\n\n\t\t\tconst list = React.useMemo(() => {\n\t\t\t\tif (storageType === \"singleton\") return [] as Array<\n\t\t\t\t\tInferRpcType<TTypes[typeof typeKey]>\n\t\t\t\t>;\n\t\t\t\tif (Array.isArray(allData)) {\n\t\t\t\t\treturn allData as Array<InferRpcType<TTypes[typeof typeKey]>>;\n\t\t\t\t}\n\t\t\t\treturn Object.values(allData || {}) as Array<\n\t\t\t\t\tInferRpcType<TTypes[typeof typeKey]>\n\t\t\t\t>;\n\t\t\t}, [allData, storageType]);\n\n\t\t\tconst findById = React.useCallback(\n\t\t\t\t(id: string | number) => repository.findById(typeKey, id),\n\t\t\t\t[repository]\n\t\t\t);\n\t\t\tconst findAll = React.useCallback(\n\t\t\t\t() => repository.findAll(typeKey),\n\t\t\t\t[repository]\n\t\t\t);\n\t\t\tconst mergeRpc = React.useCallback(\n\t\t\t\t(\n\t\t\t\t\tdata:\n\t\t\t\t\t\t| Record<\n\t\t\t\t\t\t      string,\n\t\t\t\t\t\t      Partial<\n\t\t\t\t\t\t          InferRpcType<TTypes[typeof typeKey]>\n\t\t\t\t\t\t      > | null\n\t\t\t\t\t\t  >\n\t\t\t\t\t\t| InferRpcType<TTypes[typeof typeKey]>[]\n\t\t\t\t\t\t| Partial<InferRpcType<TTypes[typeof typeKey]>>\n\t\t\t\t) => {\n\t\t\t\t\trepository.mergeRpc(typeKey, data);\n\t\t\t\t},\n\t\t\t\t[repository]\n\t\t\t);\n\n\t\t\tconst clear = React.useCallback(() => {\n\t\t\t\trepository.clear(typeKey);\n\t\t\t}, [repository]);\n\n\t\t\tconst dataForKey =\n\t\t\t\tstorageType === \"singleton\"\n\t\t\t\t\t? ((allData ?? null) as InferRpcType<\n\t\t\t\t\t\t\tTTypes[typeof typeKey]\n\t\t\t\t\t  > | null)\n\t\t\t\t\t: list;\n\n\t\t\tconst mapForKey = React.useMemo(() => {\n\t\t\t\tif (storageType === \"singleton\") {\n\t\t\t\t\treturn (allData ?? null) as InferRpcType<\n\t\t\t\t\t\tTTypes[typeof typeKey]\n\t\t\t\t\t> | null;\n\t\t\t\t}\n\t\t\t\tconst record: Record<string, InferRpcType<TTypes[typeof typeKey]>> = {} as any;\n\t\t\t\tfor (const item of list as Array<any>) {\n\t\t\t\t\tif (item && (\"id\" in item)) {\n\t\t\t\t\t\trecord[String((item as any).id)] = item as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn record;\n\t\t\t}, [allData, list, storageType]);\n\n\t\t\tif (id !== undefined) {\n\t\t\t\treturn findById(id);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t[`${String(typeKey)}s`]: dataForKey,\n\t\t\t\t[`${String(typeKey)}Map`]: mapForKey,\n\t\t\t\tfindById,\n\t\t\t\tfindAll,\n\t\t\t\tmergeRpc,\n\t\t\t\tclear,\n\t\t\t} as any;\n\t\t}\n\n\t\t(hooks as any)[hookName] = useHook;\n\n\t\tconst fullRelatedHookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}FullRelatedData` as keyof RpcHooks<TTypes>;\n\n\t\tfunction useFullRelatedHook<\n\t\t\tTResult = InferRpcType<TTypes[typeof typeName]>\n\t\t>(id?: string | number) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst allRpcData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) => state.rpc\n\t\t\t);\n\n\t\t\tconst rpcVersion = React.useMemo(() => {\n\t\t\t\treturn Object.keys(allRpcData).length;\n\t\t\t}, [allRpcData]);\n\n\t\t\tconst fullData = React.useMemo(() => {\n\t\t\t\tvoid rpcVersion;\n\t\t\t\ttry {\n\t\t\t\t\treturn (repository as any).getFullRelatedData(\n\t\t\t\t\t\ttypeName,\n\t\t\t\t\t\tid\n\t\t\t\t\t) as TResult | TResult[] | null;\n\t\t\t\t} catch {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}, [repository, id, rpcVersion]);\n\n\t\t\treturn fullData;\n\t\t}\n\t\t(hooks as any)[fullRelatedHookName] = useFullRelatedHook;\n\t});\n\n\ttypeKeys.forEach((typeName) => {\n\t\tconst listenerHookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}Listener` as keyof RpcHooks<TTypes>;\n\n\t\tfunction useListenerHook<\n\t\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\t\tkeyof TTypes,\n\t\t\t\tStorageType\n\t\t\t>\n\t\t>(\n\t\t\tcallback: (event: {\n\t\t\t\ttype: typeof typeName;\n\t\t\t\tpayload: RpcStorageType[typeof typeName] extends \"collection\"\n\t\t\t\t\t? Array<InferRpcType<TTypes[typeof typeName]>>\n\t\t\t\t\t: RpcStorageType[typeof typeName] extends \"singleton\"\n\t\t\t\t\t? InferRpcType<TTypes[typeof typeName]>\n\t\t\t\t\t: Array<InferRpcType<TTypes[typeof typeName]>>;\n\t\t\t}) => void\n\t\t) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst callbackRef = React.useRef(callback);\n\t\t\tconst listenerIdRef = React.useRef<string | number | null>(null);\n\t\t\tcallbackRef.current = callback;\n\n\t\t\t// ΠšΡΡˆΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΈΠΏ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°\n\t\t\tconst storageType = React.useMemo(() => {\n\t\t\t\treturn (repository as any).getStorageType?.(String(typeName));\n\t\t\t}, [repository]);\n\n\t\t\tconst invoke = React.useCallback(\n\t\t\t\t(\n\t\t\t\t\tevents: Array<{\n\t\t\t\t\t\ttype: typeof typeName;\n\t\t\t\t\t\tpayload: any;\n\t\t\t\t\t}>\n\t\t\t\t) => {\n\t\t\t\t\tif (!events || events.length === 0) return;\n\t\t\t\t\tconst event = events[0];\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tstorageType === \"singleton\" &&\n\t\t\t\t\t\tArray.isArray(event.payload) &&\n\t\t\t\t\t\tevent.payload.length > 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst singletonEvent = {\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\tpayload: event.payload[0],\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcallbackRef.current(singletonEvent as any);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcallbackRef.current(event as any);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[storageType]\n\t\t\t);\n\n\t\t\tReact.useEffect(() => {\n\t\t\t\tif (\n\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tlistenerIdRef.current = (repository as any).onDataChanged(\n\t\t\t\t\tinvoke,\n\t\t\t\t\t{\n\t\t\t\t\t\ttypes: [typeName],\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\treturn () => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t\t) {\n\t\t\t\t\t\t(repository as any).offDataChanged(\n\t\t\t\t\t\t\tlistenerIdRef.current\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}, [repository, invoke]);\n\t\t\t// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Ρ€ΡƒΡ‡Π½ΠΎΠΉ отписки\n\t\t\treturn () => {\n\t\t\t\tif (\n\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\t(hooks as any)[listenerHookName] = useListenerHook;\n\t});\n\n\tfunction useDataListener<\n\t\tRpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n\t\t\tkeyof TTypes,\n\t\t\tStorageType\n\t\t>\n\t>(\n\t\tcallback: (\n\t\t\tevents: Array<{\n\t\t\t\ttype: keyof TTypes;\n\t\t\t\tpayload: RpcStorageType[keyof TTypes] extends \"collection\"\n\t\t\t\t\t? Array<InferRpcType<TTypes[keyof TTypes]>>\n\t\t\t\t\t: RpcStorageType[keyof TTypes] extends \"singleton\"\n\t\t\t\t\t? InferRpcType<TTypes[keyof TTypes]>\n\t\t\t\t\t: Array<InferRpcType<TTypes[keyof TTypes]>>;\n\t\t\t}>\n\t\t) => void,\n\t\toptions?: { types?: (keyof TTypes)[] }\n\t) {\n\t\tconst { repository } = useRpc<TTypes>();\n\t\tconst callbackRef = React.useRef(callback);\n\t\tconst listenerIdRef = React.useRef<string | number | null>(null);\n\t\tcallbackRef.current = callback;\n\n\t\tconst types = (options?.types || typeKeys) as Array<keyof TTypes>;\n\n\t\t// Π‘Ρ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ массив Ρ‚ΠΈΠΏΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ»ΡŽΡ‡-строку\n\t\tconst typesKey = React.useMemo(() => {\n\t\t\tconst sorted = [...types].sort();\n\t\t\treturn sorted.join(\",\");\n\t\t}, [types]);\n\n\t\tconst stableTypes = React.useMemo(() => {\n\t\t\t// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ typesKey для ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ\n\t\t\tvoid typesKey;\n\t\t\treturn options?.types || typeKeys;\n\t\t}, [typesKey, options?.types]);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (\n\t\t\t\tlistenerIdRef.current &&\n\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t) {\n\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\tlistenerIdRef.current = null;\n\t\t\t}\n\n\t\t\tlistenerIdRef.current = (repository as any).onDataChanged(\n\t\t\t\tcallbackRef.current as any,\n\t\t\t\t{\n\t\t\t\t\ttypes: stableTypes,\n\t\t\t\t}\n\t\t\t);\n\t\t\treturn () => {\n\t\t\t\tif (\n\t\t\t\t\tlistenerIdRef.current &&\n\t\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t\t) {\n\t\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\t\tlistenerIdRef.current = null;\n\t\t\t\t}\n\t\t\t};\n\t\t}, [repository, stableTypes]);\n\t\t// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Ρ€ΡƒΡ‡Π½ΠΎΠΉ отписки\n\t\treturn () => {\n\t\t\tif (\n\t\t\t\tlistenerIdRef.current &&\n\t\t\t\ttypeof (repository as any).offDataChanged === \"function\"\n\t\t\t) {\n\t\t\t\t(repository as any).offDataChanged(listenerIdRef.current);\n\t\t\t\tlistenerIdRef.current = null;\n\t\t\t}\n\t\t};\n\t}\n\t(hooks as any).useDataListener = useDataListener;\n\n\ttypeKeys.forEach((typeName) => {\n\t\tconst relatedHookName = `use${toPascalCase(\n\t\t\tString(typeName)\n\t\t)}Related` as keyof RpcHooks<TTypes>;\n\n\t\tfunction useRelatedHook<TTarget extends keyof TTypes>(\n\t\t\tid: string | number,\n\t\t\ttargetType: TTarget\n\t\t) {\n\t\t\tconst { repository } = useRpc<TTypes>();\n\t\t\tconst sourceData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) =>\n\t\t\t\t\t(state.rpc[typeName] as unknown) ?? EMPTY_MAP\n\t\t\t);\n\t\t\tconst targetData = useSelector(\n\t\t\t\t(state: RpcState<TTypes>) =>\n\t\t\t\t\t(state.rpc[targetType] as unknown) ?? EMPTY_MAP\n\t\t\t);\n\n\t\t\t// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ для ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ кэша\n\t\t\tconst dataVersion = React.useMemo(() => {\n\t\t\t\tconst sourceKeys = Object.keys(sourceData as any).length;\n\t\t\t\tconst targetKeys = Object.keys(targetData as any).length;\n\t\t\t\treturn `${sourceKeys}:${targetKeys}`;\n\t\t\t}, [sourceData, targetData]);\n\n\t\t\tconst relatedData = React.useMemo(() => {\n\t\t\t\t// ΠŸΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Π΅ΠΌ пСрСсчСт ΠΊ dataVersion\n\t\t\t\tvoid dataVersion;\n\t\t\t\ttry {\n\t\t\t\t\treturn (repository as any).getRelated(\n\t\t\t\t\t\ttypeName,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttargetType\n\t\t\t\t\t) as Array<\n\t\t\t\t\t\tTTypes[TTarget] extends Rpc<infer S>\n\t\t\t\t\t\t\t? z.infer<S>\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t>;\n\t\t\t\t} catch {\n\t\t\t\t\treturn [] as Array<\n\t\t\t\t\t\tTTypes[TTarget] extends Rpc<infer S>\n\t\t\t\t\t\t\t? z.infer<S>\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t>;\n\t\t\t\t}\n\t\t\t}, [repository, id, targetType, dataVersion]);\n\n\t\t\treturn relatedData;\n\t\t}\n\t\t(hooks as any)[relatedHookName] = useRelatedHook;\n\t});\n\n\t// Π₯ΡƒΠΊ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний с ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ\n\tfunction useHandleMessages() {\n\t\tconst { repository } = useRpc<TTypes>();\n\n\t\tconst handleMessages = (\n\t\t\tmessages: Array<Message<TTypes>>,\n\t\t\tcallbacks?: {\n\t\t\t\t[K in keyof TTypes]?: (\n\t\t\t\t\tdata:\n\t\t\t\t\t\t| InferRpcType<TTypes[K]>[]\n\t\t\t\t\t\t| Record<\n\t\t\t\t\t\t      string,\n\t\t\t\t\t\t      Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t  >\n\t\t\t\t) => void;\n\t\t\t}\n\t\t) => {\n\t\t\trepository.handleMessages(messages, callbacks);\n\t\t};\n\n\t\tconst handleMessagesTyped = <\n\t\t\tRpcStorageType extends Record<keyof TTypes, StorageType>\n\t\t>(\n\t\t\tmessages: Array<Message<TTypes>>,\n\t\t\tcallbacks?: {\n\t\t\t\t[K in keyof TTypes]?: (\n\t\t\t\t\tdata: RpcStorageType[K] extends \"collection\"\n\t\t\t\t\t\t?\n\t\t\t\t\t\t      | Record<\n\t\t\t\t\t\t            string,\n\t\t\t\t\t\t            Partial<InferRpcType<TTypes[K]>> | null\n\t\t\t\t\t\t        >\n\t\t\t\t\t\t      | Array<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: RpcStorageType[K] extends \"singleton\"\n\t\t\t\t\t\t? Partial<InferRpcType<TTypes[K]>>\n\t\t\t\t\t\t: never\n\t\t\t\t) => void;\n\t\t\t}\n\t\t) => {\n\t\t\trepository.handleMessages<RpcStorageType>(messages, callbacks);\n\t\t};\n\n\t\treturn { handleMessages, handleMessagesTyped };\n\t}\n\n\t(hooks as any).useHandleMessages = useHandleMessages;\n\n\treturn hooks;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo } from \"react\";\nimport { Message, Rpc, RpcRepository, StorageType } from \"@yunu-lab/rpc-ts\";\nimport { z } from \"zod\";\n\ntype InferRpcType<T> = T extends Rpc<infer S> ? z.infer<S> : never;\n\ntype ToPascalCase<S extends string> = S extends `${infer First}_${infer Rest}`\n    ? `${Capitalize<First>}${ToPascalCase<Rest>}`\n    : Capitalize<S>;\n\ntype InlineRpcHooks<\n    TTypes extends Record<string, Rpc<any>>,\n    RpcStorageType extends Record<keyof TTypes, StorageType>\n> = {\n    [K in keyof TTypes as `use${ToPascalCase<string & K>}`]: {\n        (): {\n            [P in K as `${P & string}s`]: RpcStorageType[P] extends \"collection\"\n                ? InferRpcType<TTypes[P]>[]\n                : RpcStorageType[P] extends \"singleton\"\n                ? InferRpcType<TTypes[P]> | null\n                : InferRpcType<TTypes[P]>[];\n        } & {\n            [P in K as `${P &\n                string}Map`]: RpcStorageType[P] extends \"collection\"\n                ? Record<string, InferRpcType<TTypes[P]>>\n                : RpcStorageType[P] extends \"singleton\"\n                ? InferRpcType<TTypes[P]> | null\n                : Record<string, InferRpcType<TTypes[P]>>;\n        } & {\n            findById: (id: string | number) => InferRpcType<TTypes[K]> | null;\n            findAll: () => InferRpcType<TTypes[K]>[];\n            mergeRpc: {\n                (\n                    data:\n                        | Record<\n                              string,\n                              Partial<InferRpcType<TTypes[K]>> | null\n                          >\n                        | InferRpcType<TTypes[K]>[]\n                        | Partial<InferRpcType<TTypes[K]>>\n                ): InferRpcType<TTypes[K]>[];\n                <Rst extends Record<keyof TTypes, StorageType>>(\n                    data: Rst[K] extends \"collection\"\n                        ?\n                              | Record<\n                                    string,\n                                    Partial<InferRpcType<TTypes[K]>> | null\n                                >\n                              | InferRpcType<TTypes[K]>[]\n                        : Rst[K] extends \"singleton\"\n                        ? Partial<InferRpcType<TTypes[K]>>\n                        : never\n                ): Rst[K] extends \"collection\"\n                    ? InferRpcType<TTypes[K]>[]\n                    : Rst[K] extends \"singleton\"\n                    ? InferRpcType<TTypes[K]>\n                    : never;\n            };\n            clear: () => void;\n        };\n        (id: string | number): InferRpcType<TTypes[K]> | null;\n    };\n} & {\n    // ΠŸΠ΅Ρ€-Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ\n    [K in keyof TTypes as `use${ToPascalCase<string & K>}Listener`]: <\n        RpcStorageTypeMap extends Record<\n            keyof TTypes,\n            StorageType\n        > = RpcStorageType\n    >(\n        callback: (event: {\n            type: K;\n            payload: RpcStorageTypeMap[K] extends \"collection\"\n                ? Array<InferRpcType<TTypes[K]>>\n                : RpcStorageTypeMap[K] extends \"singleton\"\n                ? InferRpcType<TTypes[K]>\n                : Array<InferRpcType<TTypes[K]>>;\n        }) => void\n    ) => () => void;\n} & {\n    // ΠžΠ±Ρ‰ΠΈΠΉ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ нСскольким Ρ‚ΠΈΠΏΠ°ΠΌ\n    useDataListener: <\n        RpcStorageTypeMap extends Record<\n            keyof TTypes,\n            StorageType\n        > = RpcStorageType\n    >(\n        callback: (\n            events: Array<{\n                type: keyof TTypes;\n                payload: RpcStorageTypeMap[keyof TTypes] extends \"collection\"\n                    ? Array<InferRpcType<TTypes[keyof TTypes]>>\n                    : RpcStorageTypeMap[keyof TTypes] extends \"singleton\"\n                    ? InferRpcType<TTypes[keyof TTypes]>\n                    : Array<InferRpcType<TTypes[keyof TTypes]>>;\n            }>\n        ) => void,\n        options?: { types?: (keyof TTypes)[] }\n    ) => () => void;\n} & {\n    useHandleMessages: () => {\n        handleMessages<\n            RpcStorageType extends Record<keyof TTypes, StorageType>\n        >(\n            messages: Array<Message<TTypes>>,\n            callbacks?: {\n                [K in keyof TTypes]?: (\n                    data: RpcStorageType[K] extends \"collection\"\n                        ?\n                              | Record<\n                                    string,\n                                    Partial<InferRpcType<TTypes[K]>> | null\n                                >\n                              | Array<InferRpcType<TTypes[K]>>\n                        : RpcStorageType[K] extends \"singleton\"\n                        ? Partial<InferRpcType<TTypes[K]>>\n                        : never\n                ) => void;\n            }\n        ): void;\n    };\n};\n\nexport type InlineRpcsConfig<\n    TTypes extends Record<string, Rpc<any>>,\n    RpcStorageType extends Record<keyof TTypes, StorageType>\n> = {\n    [K in keyof TTypes]: {\n        rpc: TTypes[K];\n        storageType: RpcStorageType[K];\n        idField?: string;\n    };\n};\n\ntype RpcState<TTypes extends Record<string, Rpc<any>>> = {\n    [K in keyof TTypes]?: any;\n};\n\nexport function useInlineRpcStore<\n    TTypes extends Record<string, Rpc<any>>,\n    RpcStorageType extends Record<keyof TTypes, StorageType> = Record<\n        keyof TTypes,\n        StorageType\n    >\n>(rpcs: InlineRpcsConfig<TTypes, RpcStorageType>) {\n    const typeNames = React.useMemo(\n        () => Object.keys(rpcs) as Array<keyof TTypes>,\n        [rpcs]\n    );\n\n    const typeNamesKey = React.useMemo(\n        () => Object.keys(rpcs).map(String).sort().join(\"|\"),\n        [rpcs]\n    );\n\n    const repository = React.useMemo(() => {\n        const repo = new RpcRepository<TTypes>();\n        typeNames.forEach((key) => {\n            const { rpc, storageType } = rpcs[key];\n            repo.registerRpc(String(key), rpc, { storageType });\n        });\n        return repo;\n    }, [typeNamesKey]);\n\n    const [rpcState, setRpcState] = React.useState<RpcState<TTypes>>({});\n\n    React.useEffect(() => {\n        const unsubscribe = repository.onDataChanged(\n            (events: Array<{ type: keyof TTypes; payload: any }>) => {\n                console.log(events);\n\n                setRpcState((prev) => {\n                    const next: RpcState<TTypes> = { ...prev };\n                    for (const event of events) {\n                        const type = event.type as keyof TTypes;\n                        const storageType =\n                            (rpcs as any)[type]?.storageType ??\n                            (repository as any).getStorageType?.(String(type));\n                        if (storageType === \"singleton\") {\n                            next[type] = Array.isArray(event.payload)\n                                ? event.payload[0] ?? null\n                                : event.payload ?? null;\n                        } else {\n                            // Store arrays for collections\n                            const nextArray = Array.isArray(event.payload)\n                                ? event.payload\n                                : Object.values(event.payload || {});\n                            next[type] = nextArray;\n                        }\n                    }\n                    return next;\n                });\n            },\n            {\n                types: typeNames as readonly (keyof TTypes)[],\n            }\n        );\n        return () => {\n            repository.offDataChanged(unsubscribe);\n        };\n    }, [repository, typeNamesKey]);\n\n    const useInlineSelector = React.useCallback(\n        <TSelected>(\n            selector: (state: RpcState<TTypes>) => TSelected\n        ): TSelected => {\n            return selector(rpcState);\n        },\n        [rpcState]\n    );\n\n    const hooks = React.useMemo<InlineRpcHooks<TTypes, RpcStorageType>>(() => {\n        const toPascalCase = (s: string): string =>\n            s\n                .split(\"_\")\n                .map(\n                    (word) =>\n                        word.charAt(0).toUpperCase() +\n                        word.slice(1).toLowerCase()\n                )\n                .join(\"\");\n\n        const result: Record<string, any> = {};\n\n        (Object.keys(rpcs) as Array<keyof TTypes>).forEach((typeName) => {\n            const storageType = rpcs[typeName].storageType as StorageType;\n            const hookName = `use${toPascalCase(String(typeName))}`;\n\n            function useTypeHook(id?: string | number) {\n                const allData = useInlineSelector((state) => state[typeName]);\n\n                const findById = React.useCallback(\n                    (itemId: string | number) =>\n                        (repository as any).findById(typeName, itemId),\n                    []\n                );\n                const findAll = React.useCallback(\n                    () => (repository as any).findAll(typeName),\n                    []\n                );\n                const mergeRpc = React.useCallback(\n                    (\n                        data:\n                            | Record<\n                                  string,\n                                  Partial<\n                                      InferRpcType<TTypes[typeof typeName]>\n                                  > | null\n                              >\n                            | Array<InferRpcType<TTypes[typeof typeName]>>\n                            | Partial<InferRpcType<TTypes[typeof typeName]>>\n                    ) => {\n                        // ЕдинствСнный источник обновлСния UI β€” onDataChanged\n                        repository.mergeRpc(typeName, data);\n                    },\n                    []\n                );\n                const clear = React.useCallback(() => {\n                    if (storageType === \"singleton\") {\n                        // Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ локальноС состояниС\n                        setRpcState((prev) => ({ ...prev, [typeName]: null }));\n                    } else {\n                        const ids: Array<string | number> = Array.isArray(\n                            allData\n                        )\n                            ? ((allData as Array<any>)\n                                  .map((item) =>\n                                      item ? (item as any).id : undefined\n                                  )\n                                  .filter((v) => v !== undefined) as Array<\n                                  string | number\n                              >)\n                            : Object.keys((allData as any) || {});\n                        const deletePayload: Record<string | number, null> = {};\n                        for (const id of ids) deletePayload[id] = null;\n                        if (Object.keys(deletePayload).length > 0) {\n                            repository.mergeRpc(typeName, deletePayload);\n                        }\n                        setRpcState((prev) => ({ ...prev, [typeName]: [] }));\n                    }\n                }, [allData]);\n\n                const list = useMemo(\n                    () =>\n                        (Array.isArray(allData)\n                            ? allData\n                            : Object.values(allData || {})) as Array<\n                            InferRpcType<TTypes[typeof typeName]>\n                        >,\n                    [allData]\n                );\n                const collectionMap = useMemo(() => {\n                    const rec: Record<\n                        string | number,\n                        InferRpcType<TTypes[typeof typeName]>\n                    > = {} as any;\n\n                    if (Array.isArray(list)) {\n                        for (const item of list as Array<any>) {\n                            if (\n                                item &&\n                                typeof item === \"object\" &&\n                                !Array.isArray(item) &&\n                                \"id\" in (item as Record<string, unknown>)\n                            ) {\n                                rec[(item as any).id as any] = item as any;\n                            }\n                        }\n                    }\n                    return rec;\n                }, [list]);\n\n                if (id !== undefined) {\n                    return findById(id);\n                }\n\n                if (storageType === \"singleton\") {\n                    const current =\n                        (allData as InferRpcType<TTypes[typeof typeName]>) ||\n                        null;\n                    return {\n                        [`${String(typeName)}s`]: current,\n                        [`${String(typeName)}Map`]: current,\n                        findById,\n                        findAll,\n                        mergeRpc,\n                        clear,\n                    } as any;\n                }\n\n                return {\n                    [`${String(typeName)}s`]: list,\n                    [`${String(typeName)}Map`]: collectionMap,\n                    findById,\n                    findAll,\n                    mergeRpc,\n                    clear,\n                } as any;\n            }\n\n            (result as any)[hookName] = useTypeHook;\n\n            // Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ событий для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°\n            const listenerHookName = `use${toPascalCase(\n                String(typeName)\n            )}Listener`;\n\n            function useListenerHook<\n                RpcStorageTypeMap extends Record<\n                    keyof TTypes,\n                    StorageType\n                > = RpcStorageType\n            >(\n                callback: (event: {\n                    type: typeof typeName;\n                    payload: RpcStorageTypeMap[typeof typeName] extends \"collection\"\n                        ? Array<InferRpcType<TTypes[typeof typeName]>>\n                        : RpcStorageTypeMap[typeof typeName] extends \"singleton\"\n                        ? InferRpcType<TTypes[typeof typeName]>\n                        : Array<InferRpcType<TTypes[typeof typeName]>>;\n                }) => void\n            ) {\n                const callbackRef = React.useRef(callback);\n                callbackRef.current = callback;\n\n                React.useEffect(() => {\n                    const unsub = repository.onDataChanged(\n                        (\n                            events: Array<{\n                                type: keyof TTypes;\n                                payload: any;\n                            }>\n                        ) => {\n                            const filtered = events.filter(\n                                (e) => e.type === typeName\n                            );\n                            if (filtered.length === 0) return;\n                            const event = filtered[0];\n                            const storageType = repository.getStorageType(\n                                String(typeName)\n                            );\n                            if (\n                                storageType === \"singleton\" &&\n                                Array.isArray(event.payload)\n                            ) {\n                                const payload = event.payload[0] ?? null;\n                                // для singleton ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚\n                                if (payload) {\n                                    callbackRef.current({\n                                        type: typeName,\n                                        payload,\n                                    } as any);\n                                }\n                            } else {\n                                callbackRef.current(event as any);\n                            }\n                        },\n                        { types: [typeName] as any }\n                    );\n                    return () => {\n                        repository.offDataChanged(unsub);\n                    };\n                }, []);\n                return () => {};\n            }\n\n            (result as any)[listenerHookName] = useListenerHook;\n        });\n\n        // ΠžΠ±Ρ‰ΠΈΠΉ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ нСскольким Ρ‚ΠΈΠΏΠ°ΠΌ\n        function useDataListener<\n            RpcStorageTypeMap extends Record<\n                keyof TTypes,\n                StorageType\n            > = RpcStorageType\n        >(\n            callback: (\n                events: Array<{\n                    type: keyof TTypes;\n                    payload: RpcStorageTypeMap[keyof TTypes] extends \"collection\"\n                        ? Array<InferRpcType<TTypes[keyof TTypes]>>\n                        : RpcStorageTypeMap[keyof TTypes] extends \"singleton\"\n                        ? InferRpcType<TTypes[keyof TTypes]>\n                        : Array<InferRpcType<TTypes[keyof TTypes]>>;\n                }>\n            ) => void,\n            options?: { types?: (keyof TTypes)[] }\n        ) {\n            const callbackRef = React.useRef(callback);\n            callbackRef.current = callback;\n\n            const types = options?.types ?? (typeNames as (keyof TTypes)[]);\n            const typesKey = React.useMemo(\n                () => [...types].map(String).sort().join(\"|\"),\n                [types]\n            );\n\n            React.useEffect(() => {\n                const unsub = repository.onDataChanged(\n                    (events: any) => callbackRef.current(events),\n                    { types: types as any }\n                );\n                return () => {\n                    repository.offDataChanged(unsub);\n                };\n            }, [typesKey, types]);\n            return () => {};\n        }\n\n        (result as any).useDataListener = useDataListener;\n\n        function useHandleMessages() {\n            const handleMessages = (\n                messages: Array<Message<TTypes>>,\n                callbacks?: {\n                    [K in keyof TTypes]?: (\n                        data:\n                            | InferRpcType<TTypes[K]>[]\n                            | Record<\n                                  string,\n                                  Partial<InferRpcType<TTypes[K]>> | null\n                              >\n                    ) => void;\n                }\n            ) => {\n                repository.handleMessages(messages, callbacks);\n            };\n\n            const handleMessagesTyped = <\n                RpcStorageTypeMap extends Record<keyof TTypes, StorageType>\n            >(\n                messages: Array<Message<TTypes>>,\n                callbacks?: {\n                    [K in keyof TTypes]?: (\n                        data: RpcStorageTypeMap[K] extends \"collection\"\n                            ?\n                                  | Record<\n                                        string,\n                                        Partial<InferRpcType<TTypes[K]>> | null\n                                    >\n                                  | Array<InferRpcType<TTypes[K]>>\n                            : RpcStorageTypeMap[K] extends \"singleton\"\n                            ? Partial<InferRpcType<TTypes[K]>>\n                            : never\n                    ) => void;\n                }\n            ) => {\n                repository.handleMessages<RpcStorageTypeMap>(\n                    messages,\n                    callbacks\n                );\n            };\n\n            return { handleMessages, handleMessagesTyped };\n        }\n\n        (result as any).useHandleMessages = useHandleMessages;\n\n        return result as InlineRpcHooks<TTypes, RpcStorageType>;\n    }, [rpcs, repository, useInlineSelector, typeNames]);\n\n    return { hooks, repository } as const;\n}\n"],"names":["id","toPascalCase","storageType"],"mappings":"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"}