@pluv/react 4.0.1 → 4.0.2

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.
@@ -1,18 +1,18 @@
1
-
2
- > @pluv/react@4.0.1 build /home/runner/work/pluv/pluv/packages/react
3
- > tsdown
4
-
5
- ℹ tsdown v0.20.0-beta.4 powered by rolldown v1.0.0-beta.60
1
+ $ tsdown
2
+ ℹ tsdown v0.22.2 powered by rolldown v1.1.0
6
3
  ℹ config file: /home/runner/work/pluv/pluv/packages/react/tsdown.config.ts
7
4
  ℹ entry: src/index.ts
8
5
  ℹ target: esnext
9
6
  ℹ tsconfig: tsconfig.json
10
7
  ℹ Build start
11
- ℹ dist/index.mjs 13.72 kB │ gzip: 3.20 kB
12
- [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugin `rolldown-plugin-dts:generate`. See https://rolldown.rs/options/checks#plugintimings for more details.
13
8
 
14
- ℹ dist/index.mjs.map 35.93 kB │ gzip: 7.89 kB
15
- ℹ dist/index.d.mts.map  3.93 kB │ gzip: 1.05 kB
9
+  WARN  `external` is deprecated. Use `deps.neverBundle` instead.
10
+
11
+ ℹ dist/index.mjs 13.68 kB │ gzip: 3.19 kB
12
+ ℹ dist/index.mjs.map 36.29 kB │ gzip: 7.88 kB
13
+ [PLUGIN_TIMINGS] Your build spent significant time in plugin `rolldown-plugin-dts:generate`. See https://rolldown.rs/options/checks#plugintimings for more details.
14
+ ℹ dist/index.d.mts.map  3.93 kB │ gzip: 1.06 kB
16
15
  ℹ dist/index.d.mts  6.17 kB │ gzip: 1.56 kB
17
- ℹ 4 files, total: 59.75 kB
18
- ✔ Build complete in 3832ms
16
+ ℹ 4 files, total: 60.08 kB
17
+
18
+ ✔ Build complete in 3753ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @pluv/react
2
2
 
3
+ ## 4.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - e1913b3: Upgraded internal dependencies
8
+ - Updated dependencies [e1913b3]
9
+ - @pluv/client@4.0.2
10
+ - @pluv/types@4.0.2
11
+ - @pluv/crdt@4.0.2
12
+
3
13
  ## 4.0.1
4
14
 
5
15
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/createBundle.tsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/createBundle.tsx"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -2,7 +2,6 @@ import { MockedRoom } from "@pluv/client";
2
2
  import fastDeepEqual from "fast-deep-equal";
3
3
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
-
6
5
  //#region src/internal/hooks/useAsyncQueue.ts
7
6
  /**
8
7
  * @description This is to handle race conditions, so that our async operations that can
@@ -17,7 +16,6 @@ const useAsyncQueue = () => {
17
16
  }, []);
18
17
  return useMemo(() => ({ push }), [push]);
19
18
  };
20
-
21
19
  //#endregion
22
20
  //#region src/internal/hooks/useDeepAsyncMemo.ts
23
21
  const useDeepAsyncMemo = (factory, isEqual = fastDeepEqual) => {
@@ -77,7 +75,6 @@ const useDeepAsyncMemo = (factory, isEqual = fastDeepEqual) => {
77
75
  }, [isEqual]);
78
76
  return state;
79
77
  };
80
-
81
78
  //#endregion
82
79
  //#region src/internal/hooks/useNoSsr.ts
83
80
  const useNoSsr = () => {
@@ -87,7 +84,6 @@ const useNoSsr = () => {
87
84
  return didMount ? typeof value !== "function" ? value : value() : fallback;
88
85
  }, [didMount]);
89
86
  };
90
-
91
87
  //#endregion
92
88
  //#region src/internal/hooks/useRerender.ts
93
89
  const useRerender = () => {
@@ -96,21 +92,17 @@ const useRerender = () => {
96
92
  setCount((oldCount) => (oldCount + 1) % Number.MAX_SAFE_INTEGER);
97
93
  }, []);
98
94
  };
99
-
100
95
  //#endregion
101
96
  //#region src/internal/utils/identity.ts
102
97
  const identity = (x) => x;
103
-
104
98
  //#endregion
105
99
  //#region src/internal/utils/shallowArrayEqual.ts
106
100
  const shallowArrayEqual = (a, b) => {
107
101
  return a.length === b.length && a.every((item, i) => item === b[i]);
108
102
  };
109
-
110
103
  //#endregion
111
104
  //#region src/internal/utils/shallowEqual.ts
112
105
  const shallowEqual = (a, b) => a === b;
113
-
114
106
  //#endregion
115
107
  //#region src/internal/hooks/useSyncExternalStoreWithSelector.ts
116
108
  const useSyncExternalStoreWithSelector = (subscribe, getClientSnapshot, getServerSnapshot, selector, isEqual) => {
@@ -143,7 +135,6 @@ const useSyncExternalStoreWithSelector = (subscribe, getClientSnapshot, getServe
143
135
  const result = useSyncExternalStore(subscribe, _getClientSnapshot, _getServerSnapshot);
144
136
  return typeof window !== "undefined" ? noSsr(result, _getServerSnapshot?.()) : result;
145
137
  };
146
-
147
138
  //#endregion
148
139
  //#region src/createBundle.tsx
149
140
  const createBundle = (client, options = {}) => {
@@ -275,8 +266,8 @@ const createBundle = (client, options = {}) => {
275
266
  };
276
267
  const useBroadcast = () => {
277
268
  const room = useRoom();
278
- const broadcast = useCallback((event$1, data) => {
279
- room.broadcast(event$1, data);
269
+ const broadcast = useCallback((event, data) => {
270
+ room.broadcast(event, data);
280
271
  }, [room]);
281
272
  return useMemo(() => {
282
273
  return new Proxy(broadcast, { get(fn, prop) {
@@ -298,11 +289,11 @@ const createBundle = (client, options = {}) => {
298
289
  const getSnapshot = useCallback(() => room.canUndo(), [room]);
299
290
  return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, identity);
300
291
  };
301
- const useConnection = (selector = identity, options$1) => {
292
+ const useConnection = (selector = identity, options) => {
302
293
  const room = useRoom();
303
294
  const subscribe = useCallback((onStoreChange) => room.subscribe.connection(onStoreChange), [room]);
304
295
  const getSnapshot = room.getConnection;
305
- return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => selector(snapshot), [selector]), options$1?.isEqual ?? fastDeepEqual);
296
+ return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => selector(snapshot), [selector]), options?.isEqual ?? fastDeepEqual);
306
297
  };
307
298
  const useDoc = () => {
308
299
  const room = useRoom();
@@ -329,33 +320,33 @@ const createBundle = (client, options = {}) => {
329
320
  };
330
321
  return { useEvent: useProxyEvent };
331
322
  } });
332
- const useMyPresence = (selector = identity, options$1) => {
323
+ const useMyPresence = (selector = identity, options) => {
333
324
  const room = useRoom();
334
325
  const subscribe = useCallback((onStoreChange) => room.subscribe.myPresence(onStoreChange), [room]);
335
326
  const getSnapshot = room.getMyPresence;
336
- return [useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => selector(snapshot), [selector]), options$1?.isEqual ?? fastDeepEqual), room.updateMyPresence];
327
+ return [useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => selector(snapshot), [selector]), options?.isEqual ?? fastDeepEqual), room.updateMyPresence];
337
328
  };
338
- const useMyself = (selector = identity, options$1) => {
329
+ const useMyself = (selector = identity, options) => {
339
330
  const room = useRoom();
340
331
  const subscribe = useCallback((onStoreChange) => room.subscribe.myself(onStoreChange), [room]);
341
332
  const getSnapshot = room.getMyself;
342
333
  return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => {
343
334
  return !snapshot ? null : selector(snapshot);
344
- }, [selector]), options$1?.isEqual ?? fastDeepEqual);
335
+ }, [selector]), options?.isEqual ?? fastDeepEqual);
345
336
  };
346
- const useOther = (connectionId, selector = identity, options$1) => {
337
+ const useOther = (connectionId, selector = identity, options) => {
347
338
  const room = useRoom();
348
339
  const subscribe = useCallback((onStoreChange) => room.subscribe.other(connectionId, onStoreChange), [room, connectionId]);
349
340
  const getSnapshot = useCallback(() => room.getOther(connectionId), [room, connectionId]);
350
341
  return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => {
351
342
  return !snapshot ? null : selector(snapshot);
352
- }, [selector]), options$1?.isEqual ?? fastDeepEqual);
343
+ }, [selector]), options?.isEqual ?? fastDeepEqual);
353
344
  };
354
- const useOthers = (selector = identity, options$1) => {
345
+ const useOthers = (selector = identity, options) => {
355
346
  const room = useRoom();
356
347
  const subscribe = useCallback((onStoreChange) => room.subscribe.others(onStoreChange), [room]);
357
348
  const getSnapshot = room.getOthers;
358
- return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, selector, options$1?.isEqual ?? ((a, b) => {
349
+ return useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, selector, options?.isEqual ?? ((a, b) => {
359
350
  /**
360
351
  * !HACK
361
352
  * @description Assume the return type will always be an array when this occurs
@@ -371,7 +362,7 @@ const createBundle = (client, options = {}) => {
371
362
  const useRedo = () => {
372
363
  return useRoom().redo;
373
364
  };
374
- const useStorage = (key, selector = identity, options$1) => {
365
+ const useStorage = (key, selector = identity, options) => {
375
366
  const room = useRoom();
376
367
  const rerender = useRerender();
377
368
  useEffect(() => {
@@ -388,7 +379,7 @@ const createBundle = (client, options = {}) => {
388
379
  }, [key, room]);
389
380
  return [useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, useCallback((snapshot) => {
390
381
  return snapshot === null ? null : selector(snapshot);
391
- }, [selector]), options$1?.isEqual ?? fastDeepEqual), room.getStorage(key) ?? null];
382
+ }, [selector]), options?.isEqual ?? fastDeepEqual), room.getStorage(key) ?? null];
392
383
  };
393
384
  const useTransact = () => {
394
385
  return useRoom().transact;
@@ -419,7 +410,7 @@ const createBundle = (client, options = {}) => {
419
410
  useUndo
420
411
  };
421
412
  };
422
-
423
413
  //#endregion
424
414
  export { createBundle };
415
+
425
416
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["event","options"],"sources":["../src/internal/hooks/useAsyncQueue.ts","../src/internal/hooks/useDeepAsyncMemo.ts","../src/internal/hooks/useNoSsr.ts","../src/internal/hooks/useRerender.ts","../src/internal/utils/identity.ts","../src/internal/utils/shallowArrayEqual.ts","../src/internal/utils/shallowEqual.ts","../src/internal/hooks/useSyncExternalStoreWithSelector.ts","../src/createBundle.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @description This is to handle race conditions, so that our async operations that can\n * happen between re-renders will happen sequentially.\n * @date April 13, 2025\n */\nexport const useAsyncQueue = () => {\n const queueRef = useRef<Promise<void>>(Promise.resolve(undefined));\n\n const push = useCallback(async (promise: Promise<any>) => {\n queueRef.current = queueRef.current.then(async () => await promise);\n\n return await queueRef.current;\n }, []);\n\n return useMemo(() => ({ push }), [push]);\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport fastDeepEqual from \"fast-deep-equal\";\n\nexport type UseDeepAsyncMemoResult<T extends unknown> =\n | {\n error: null;\n isInitialized: true;\n isLoading: false;\n value: T;\n }\n | {\n error: null;\n isInitialized: boolean;\n value: undefined;\n isLoading: true;\n }\n | {\n error: Error;\n isInitialized: boolean;\n value: undefined;\n isLoading: false;\n };\n\nexport const useDeepAsyncMemo = <T>(\n factory: () => Promise<T>,\n isEqual: (a: T, b: T) => boolean = fastDeepEqual,\n): UseDeepAsyncMemoResult<T> => {\n // Store the current async state (loading, value, error, etc.)\n const [state, setState] = useState<UseDeepAsyncMemoResult<T>>({\n isInitialized: false,\n isLoading: true,\n value: undefined,\n error: null,\n });\n\n // Keep track of the last resolved value to compare with new ones\n const lastValueRef = useRef<T | undefined>(undefined);\n const hasValueRef = useRef(false); // Tracks whether we've ever resolved a value\n\n // Tracks the current in-flight promise to guard against race conditions\n const inflightRef = useRef<Promise<T> | null>(null);\n\n // Used to prevent state updates after the component unmounts\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n isMountedRef.current = true;\n\n // Trigger the async factory\n const promise = factory();\n inflightRef.current = promise;\n\n // Set loading state\n setState((prev) => {\n return {\n ...prev,\n isLoading: true,\n error: null,\n } as UseDeepAsyncMemoResult<T>;\n });\n\n promise\n .then((result) => {\n // Ignore if component unmounted or if this promise is stale\n if (!isMountedRef.current || inflightRef.current !== promise) return;\n\n // Skip update if value hasn't changed\n const isSame = hasValueRef.current && isEqual(lastValueRef.current as T, result);\n if (isSame) {\n setState((prev) => {\n return {\n ...prev,\n isInitialized: true,\n isLoading: false,\n } as UseDeepAsyncMemoResult<T>;\n });\n return;\n }\n\n // Save the new value\n lastValueRef.current = result;\n hasValueRef.current = true;\n\n setState({\n isInitialized: true,\n isLoading: false,\n value: result,\n error: null,\n });\n })\n .catch((err) => {\n // Ignore if component unmounted or if this promise is stale\n if (!isMountedRef.current || inflightRef.current !== promise) return;\n\n setState({\n isInitialized: hasValueRef.current,\n isLoading: false,\n value: undefined,\n error: err instanceof Error ? err : new Error(\"Unknown error\"),\n });\n });\n\n // Cleanup: prevent state updates after unmount\n return () => {\n isMountedRef.current = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n /**\n * !HACK\n * @description We're only going to use the `isEqual` function to determine if this hook\n * should re-run. This is basically our hook's version of a dependency array\n * @date April 13, 2025\n */\n // factory,\n isEqual,\n ]);\n\n return state;\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport type NoSsrFunction = <T = null>(value: T | (() => T), fallback?: T) => T;\n\nexport const useNoSsr = (): NoSsrFunction => {\n const [didMount, setDidMount] = useState<boolean>(false);\n\n // eslint-disable-next-line react-hooks/set-state-in-effect\n useEffect(() => setDidMount(typeof window !== \"undefined\"), []);\n\n const noSsr = useCallback(\n <T = null>(value: T | (() => T), fallback: T = null as T): T => {\n return didMount\n ? typeof value !== \"function\"\n ? value\n : (value as () => T)()\n : fallback;\n },\n [didMount],\n );\n\n return noSsr;\n};\n","import { useCallback, useState } from \"react\";\n\nexport const useRerender = (): (() => void) => {\n const [, setCount] = useState(0);\n\n return useCallback(() => {\n setCount((oldCount) => (oldCount + 1) % Number.MAX_SAFE_INTEGER);\n }, []);\n};\n","export const identity = <T extends unknown>(x: T): T => x;\n","export const shallowArrayEqual = <T extends unknown>(\n a: readonly T[] | T[],\n b: readonly T[] | T[],\n): boolean => {\n return a.length === b.length && a.every((item, i) => item === b[i]);\n};\n","export const shallowEqual = (a: any, b: any): boolean => a === b;\n","import { useRef, useSyncExternalStore } from \"react\";\nimport { shallowEqual } from \"../utils\";\nimport { useNoSsr } from \"./useNoSsr\";\n\nexport const useSyncExternalStoreWithSelector = <TSnapshot, TSelection>(\n subscribe: (onStoreChange: () => void) => () => void,\n getClientSnapshot: () => TSnapshot,\n getServerSnapshot: undefined | null | (() => TSnapshot),\n selector: (snapshot: TSnapshot) => TSelection,\n isEqual?: (a: TSelection, b: TSelection) => boolean,\n): TSelection => {\n const noSsr = useNoSsr();\n const cacheRef = useRef<TSelection | null>(null);\n\n const _getServerSnapshot = getServerSnapshot\n ? () => {\n const data = getServerSnapshot();\n const snapshot = selector(data);\n const compare = isEqual ?? shallowEqual;\n const cached = cacheRef.current;\n\n const isUnchanged = cached === null ? snapshot === null : compare(cached, snapshot);\n\n /**\n * !HACK\n * @description Memoize only the last snapshot so that we can only rerender on changes\n * @date June 22, 2024\n */\n cacheRef.current = isUnchanged ? (cached ?? snapshot) : snapshot;\n\n return cacheRef.current;\n }\n : undefined;\n\n const _getClientSnapshot = () => {\n const data = getClientSnapshot();\n const snapshot = selector(data);\n const compare = isEqual ?? shallowEqual;\n const cached = cacheRef.current;\n\n const isUnchanged = cached === null ? snapshot === null : compare(cached, snapshot);\n\n /**\n * !HACK\n * @description Memoize only the last snapshot so that we can only rerender on changes\n * @date June 22, 2024\n */\n cacheRef.current = isUnchanged ? (cached ?? snapshot) : snapshot;\n\n return cacheRef.current;\n };\n\n const result = useSyncExternalStore(subscribe, _getClientSnapshot, _getServerSnapshot);\n\n // eslint-disable-next-line react-hooks/refs\n return typeof window !== \"undefined\" ? noSsr(result, _getServerSnapshot?.()) : result;\n};\n","import type {\n CreateRoomOptions,\n EnterRoomParams,\n MergeEvents,\n PluvClient,\n PluvRoom,\n PluvRoomAddon,\n PluvRouter,\n PluvRouterEventConfig,\n UserInfo,\n WebSocketConnection,\n} from \"@pluv/client\";\nimport { MockedRoom } from \"@pluv/client\";\nimport type { InferCrdtJson, InferDoc, InferStorage } from \"@pluv/crdt\";\nimport type {\n Id,\n InferIOCrdtKind,\n InferIOInput,\n InferIOOutput,\n IOEventMessage,\n IOLike,\n JsonObject,\n RoomLike,\n UpdateMyPresenceAction,\n} from \"@pluv/types\";\nimport fastDeepEqual from \"fast-deep-equal\";\nimport type { Dispatch } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport {\n identity,\n shallowArrayEqual,\n useAsyncQueue,\n useDeepAsyncMemo,\n useRerender,\n useSyncExternalStoreWithSelector,\n} from \"./internal\";\nimport type {\n BroadcastProxy,\n CreateBundle,\n EventProxy,\n MockedRoomProviderProps,\n PluvProviderProps,\n PluvRoomProviderProps,\n SubscriptionHookOptions,\n} from \"./types\";\n\nexport type CreateBundleOptions<\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject = {},\n TPresence extends Record<string, any> = {},\n TCrdt extends InferIOCrdtKind<TIO> = InferIOCrdtKind<TIO>,\n TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {},\n> = {\n addons?: readonly PluvRoomAddon<TIO, TMetadata, TPresence, TCrdt>[];\n router?: PluvRouter<TIO, TPresence, InferStorage<TCrdt>, TEvents>;\n};\n\nexport const createBundle = <\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject = {},\n TPresence extends Record<string, any> = {},\n TCrdt extends InferIOCrdtKind<TIO> = InferIOCrdtKind<TIO>,\n TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {},\n>(\n client: PluvClient<TIO, TPresence, TCrdt, TMetadata>,\n options: CreateBundleOptions<TIO, TMetadata, TPresence, TCrdt, TEvents> = {},\n): CreateBundle<TIO, TMetadata, TPresence, TCrdt, TEvents> => {\n /**\n * !HACK\n * @description We'll let the context error out if client is not provided,\n * and let the users deal with it.\n * @date October 27, 2022\n */\n const PluvContext = createContext<PluvClient<TIO, TPresence, TCrdt, TMetadata>>(null as any);\n\n /**\n * !HACK\n * @description We'll let the context error out if the room is not provided,\n * and let the users deal with it.\n * @date November 11, 2022\n */\n const PluvRoomContext = createContext<\n RoomLike<TIO, InferDoc<TCrdt>, TPresence, InferStorage<TCrdt>, TEvents>\n >(null as any);\n\n const MockedRoomContext = createContext<RoomLike<\n TIO,\n InferDoc<TCrdt>,\n TPresence,\n InferStorage<TCrdt>,\n TEvents\n > | null>(null);\n\n const MockedRoomProvider = memo<MockedRoomProviderProps<TIO, TPresence, TCrdt>>((props) => {\n const { children, events, initialPresence, initialStorage, room: _room } = props;\n\n const [room] = useState<MockedRoom<TIO, TPresence, TCrdt, TEvents>>(() => {\n return new MockedRoom<TIO, TPresence, TCrdt, TEvents>(_room, {\n events,\n initialPresence,\n initialStorage:\n typeof initialStorage === \"function\"\n ? (client._defs.initialStorage?.getFactory(initialStorage) as TCrdt)\n : undefined,\n });\n });\n\n return (\n <MockedRoomContext.Provider value={room}>\n <PluvRoomContext.Provider value={room}>{children}</PluvRoomContext.Provider>\n </MockedRoomContext.Provider>\n );\n });\n\n MockedRoomProvider.displayName = \"MockedRoomProvider\";\n\n const PluvRoomProvider = memo<PluvRoomProviderProps<TIO, TMetadata, TPresence, TCrdt>>(\n (props) => {\n const {\n children,\n connect = true,\n debug,\n initialPresence,\n initialStorage,\n metadata,\n onAuthorizationFail,\n room: _room,\n } = props;\n\n const queue = useAsyncQueue();\n const rerender = useRerender();\n const mockedRoom = useContext(MockedRoomContext);\n\n const createRoom = useCallback((): PluvRoom<\n TIO,\n TMetadata,\n TPresence,\n TCrdt,\n TEvents\n > => {\n return client.createRoom(_room, {\n addons: options.addons,\n debug,\n initialPresence,\n initialStorage:\n typeof initialStorage === \"function\"\n ? client._defs.initialStorage?.getFactory(initialStorage)\n : undefined,\n metadata,\n onAuthorizationFail,\n router: options.router,\n } as CreateRoomOptions<TIO, TPresence, TCrdt, TMetadata, TEvents>);\n }, [_room, debug, initialPresence, initialStorage, metadata, onAuthorizationFail]);\n\n const [room, setRoom] = useState(() => createRoom());\n\n useEffect(() => {\n if (room.id === _room) return;\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setRoom(createRoom());\n }, [_room, createRoom, room]);\n\n const resolvedMeta = useDeepAsyncMemo(async () => {\n const resolved = await Promise.resolve(\n typeof metadata === \"function\" ? metadata() : metadata,\n );\n\n return !!room.metadata ? room.metadata.parse(resolved) : resolved;\n });\n\n useEffect(() => {\n const unsubscribe = room.subscribe.connection(() => {\n rerender();\n });\n\n return () => {\n unsubscribe();\n };\n }, [rerender, room]);\n\n useEffect(() => {\n const leaveRoom = async (): Promise<void> => {\n await queue.push(\n client.leave(room).catch((error) => {\n console.error(error);\n }),\n );\n };\n\n if (!connect) {\n leaveRoom();\n return;\n }\n\n if (!resolvedMeta.isInitialized) {\n leaveRoom();\n return;\n }\n\n const resolved = resolvedMeta.value as TMetadata;\n\n queue.push(\n client\n .enter(room, ...([{ metadata: resolved }] as EnterRoomParams<TMetadata>))\n .catch(async (error) => {\n console.error(error);\n await leaveRoom();\n }),\n );\n\n return () => {\n leaveRoom();\n };\n }, [connect, queue, resolvedMeta.isInitialized, resolvedMeta.value, room]);\n\n return (\n <PluvRoomContext.Provider value={mockedRoom ?? room}>\n {children}\n </PluvRoomContext.Provider>\n );\n },\n );\n\n PluvRoomProvider.displayName = \"PluvRoomProvider\";\n\n const PluvProvider = memo<PluvProviderProps>((props) => {\n const { children } = props;\n\n return <PluvContext.Provider value={client}>{children}</PluvContext.Provider>;\n });\n\n PluvProvider.displayName = \"PluvProvider\";\n\n const useClient = (): PluvClient<TIO, TPresence, TCrdt, TMetadata> => useContext(PluvContext);\n\n const useRoom = () => {\n const room = useContext(PluvRoomContext);\n\n if (!room)\n throw new Error(\n \"Room could not be found. Component must be wrapped with PluvRoomProvider\",\n );\n\n return room;\n };\n\n const useBroadcast = (): BroadcastProxy<MergeEvents<TEvents, TIO>> => {\n const room = useRoom();\n\n const broadcast = useCallback(\n <TEvent extends keyof InferIOInput<MergeEvents<TEvents, TIO>>>(\n event: TEvent,\n data: Id<InferIOInput<MergeEvents<TEvents, TIO>>[TEvent]>,\n ) => {\n room.broadcast(event, data);\n },\n [room],\n );\n\n return useMemo((): BroadcastProxy<MergeEvents<TEvents, TIO>> => {\n return new Proxy(broadcast, {\n get(fn, prop) {\n return (\n data: Id<\n InferIOInput<MergeEvents<TEvents, TIO>>[keyof InferIOInput<\n MergeEvents<TEvents, TIO>\n >]\n >,\n ): void => {\n return fn(prop as keyof InferIOInput<MergeEvents<TEvents, TIO>>, data);\n };\n },\n }) as BroadcastProxy<MergeEvents<TEvents, TIO>>;\n }, [broadcast]);\n };\n\n const useCanRedo = (): boolean => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storage(onStoreChange),\n [room],\n );\n\n const getSnapshot = useCallback((): boolean => room.canRedo(), [room]);\n\n const canRedo = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n identity,\n );\n\n return canRedo;\n };\n\n const useCanUndo = (): boolean => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storage(onStoreChange),\n [room],\n );\n\n const getSnapshot = useCallback((): boolean => room.canUndo(), [room]);\n\n const canUndo = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n identity,\n );\n\n return canUndo;\n };\n\n const useConnection = <T extends unknown = WebSocketConnection>(\n selector = identity as (connection: WebSocketConnection) => T,\n options?: SubscriptionHookOptions<Id<T>>,\n ): Id<T> => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.connection(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getConnection;\n\n const _selector = useCallback(\n (snapshot: WebSocketConnection) => selector(snapshot) as Id<T>,\n [selector],\n );\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n };\n\n const useDoc = () => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storageLoaded(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getDoc;\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n };\n\n const useEvent = <TType extends keyof InferIOOutput<MergeEvents<TEvents, TIO>>>(\n type: TType,\n callback: (data: Id<IOEventMessage<MergeEvents<TEvents, TIO>, TType>>) => void,\n ): void => {\n const room = useRoom();\n\n useEffect(() => {\n const unsubscribe = room.subscribe.event(type, callback);\n\n return () => {\n unsubscribe();\n };\n }, [callback, room, type]);\n };\n\n const event = new Proxy(\n {},\n {\n get(_, prop) {\n const useProxyEvent = (\n callback: (\n data: Id<\n IOEventMessage<\n MergeEvents<TEvents, TIO>,\n keyof InferIOOutput<MergeEvents<TEvents, TIO>>\n >\n >,\n ) => void,\n ): void => {\n return useEvent(\n prop as keyof InferIOOutput<MergeEvents<TEvents, TIO>>,\n callback,\n );\n };\n\n return { useEvent: useProxyEvent };\n },\n },\n ) as EventProxy<MergeEvents<TEvents, TIO>>;\n\n const useMyPresence = <T extends unknown = TPresence>(\n selector = identity as (myPresence: TPresence) => T,\n options?: SubscriptionHookOptions<Id<T> | null>,\n ): [Id<T>, Dispatch<UpdateMyPresenceAction<TPresence>>] => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.myPresence(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getMyPresence;\n\n const _selector = useCallback(\n (snapshot: TPresence) => selector(snapshot) as Id<T>,\n [selector],\n );\n\n const myPresence = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n\n return [myPresence, room.updateMyPresence];\n };\n\n const useMyself = <T extends unknown = UserInfo<TIO, TPresence>>(\n selector = identity as (myself: Id<UserInfo<TIO, TPresence>>) => T,\n options?: SubscriptionHookOptions<Id<T> | null>,\n ): Id<T> | null => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.myself(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getMyself;\n\n const _selector = useCallback(\n (snapshot: Id<UserInfo<TIO, TPresence>> | null) => {\n return !snapshot ? null : (selector(snapshot) as Id<T>);\n },\n [selector],\n );\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n };\n\n const useOther = <T extends unknown = UserInfo<TIO, TPresence>>(\n connectionId: string,\n selector = identity as (other: UserInfo<TIO, TPresence>) => T,\n options?: SubscriptionHookOptions<T | null>,\n ): T | null => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.other(connectionId, onStoreChange),\n [room, connectionId],\n );\n\n const getSnapshot = useCallback(() => room.getOther(connectionId), [room, connectionId]);\n\n const _selector = useCallback(\n (snapshot: Id<UserInfo<TIO, TPresence>> | null) => {\n return !snapshot ? null : (selector(snapshot) as T);\n },\n [selector],\n );\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n };\n\n const useOthers = <T extends unknown = readonly UserInfo<TIO, TPresence>[]>(\n selector = identity as (other: readonly Id<UserInfo<TIO, TPresence>>[]) => T,\n options?: SubscriptionHookOptions<T>,\n ): T => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.others(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getOthers;\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n selector as (other: readonly Id<UserInfo<TIO, TPresence>>[]) => T,\n options?.isEqual ??\n ((a, b) => {\n /**\n * !HACK\n * @description Assume the return type will always be an array when this occurs\n * and do a shallow comparison instead like how standard React dependency\n * arrays work. This is for performance's sake and may lead to bugs if the\n * selector doesn't always return an array\n * @date June 22, 2024\n */\n if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) {\n return shallowArrayEqual(a, b);\n }\n\n return fastDeepEqual(a, b);\n }),\n );\n };\n\n const useRedo = () => {\n const room = useRoom();\n\n return room.redo;\n };\n\n const useStorage = <\n TKey extends keyof InferStorage<TCrdt>,\n TData extends unknown = InferCrdtJson<InferStorage<TCrdt>[TKey]>,\n >(\n key: TKey,\n selector = identity as (data: InferCrdtJson<InferStorage<TCrdt>[TKey]>) => TData,\n options?: SubscriptionHookOptions<TData | null>,\n ): [data: TData | null, sharedType: InferStorage<TCrdt>[TKey] | null] => {\n const room = useRoom();\n const rerender = useRerender();\n\n useEffect(() => {\n const unsubscribe = room.subscribe.storageLoaded(() => {\n rerender();\n });\n\n return () => {\n unsubscribe();\n };\n }, [rerender, room]);\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storage(key, onStoreChange),\n [key, room],\n );\n\n const getSnapshot = useCallback((): InferCrdtJson<InferStorage<TCrdt>[TKey]> | null => {\n return room.getStorageJson(key);\n }, [key, room]);\n\n const _selector = useCallback(\n (snapshot: InferCrdtJson<InferStorage<TCrdt>[TKey]> | null) => {\n return snapshot === null ? null : selector(snapshot);\n },\n [selector],\n );\n\n const data = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n\n const sharedType = room.getStorage(key) ?? null;\n\n return [data, sharedType];\n };\n\n const useTransact = () => {\n const room = useRoom();\n\n return room.transact;\n };\n\n const useUndo = () => {\n const room = useRoom();\n\n return room.undo;\n };\n\n return {\n // components\n MockedRoomProvider,\n PluvProvider,\n PluvRoomProvider,\n\n // proxies\n event,\n\n // hooks\n useBroadcast,\n useCanRedo,\n useCanUndo,\n useClient,\n useConnection,\n useDoc,\n useEvent,\n useMyPresence,\n useMyself,\n useOther,\n useOthers,\n useRedo,\n useRoom,\n useStorage,\n useTransact,\n useUndo,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/internal/hooks/useAsyncQueue.ts","../src/internal/hooks/useDeepAsyncMemo.ts","../src/internal/hooks/useNoSsr.ts","../src/internal/hooks/useRerender.ts","../src/internal/utils/identity.ts","../src/internal/utils/shallowArrayEqual.ts","../src/internal/utils/shallowEqual.ts","../src/internal/hooks/useSyncExternalStoreWithSelector.ts","../src/createBundle.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @description This is to handle race conditions, so that our async operations that can\n * happen between re-renders will happen sequentially.\n * @date April 13, 2025\n */\nexport const useAsyncQueue = () => {\n const queueRef = useRef<Promise<void>>(Promise.resolve(undefined));\n\n const push = useCallback(async (promise: Promise<any>) => {\n queueRef.current = queueRef.current.then(async () => await promise);\n\n return await queueRef.current;\n }, []);\n\n return useMemo(() => ({ push }), [push]);\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport fastDeepEqual from \"fast-deep-equal\";\n\nexport type UseDeepAsyncMemoResult<T extends unknown> =\n | {\n error: null;\n isInitialized: true;\n isLoading: false;\n value: T;\n }\n | {\n error: null;\n isInitialized: boolean;\n value: undefined;\n isLoading: true;\n }\n | {\n error: Error;\n isInitialized: boolean;\n value: undefined;\n isLoading: false;\n };\n\nexport const useDeepAsyncMemo = <T>(\n factory: () => Promise<T>,\n isEqual: (a: T, b: T) => boolean = fastDeepEqual,\n): UseDeepAsyncMemoResult<T> => {\n // Store the current async state (loading, value, error, etc.)\n const [state, setState] = useState<UseDeepAsyncMemoResult<T>>({\n isInitialized: false,\n isLoading: true,\n value: undefined,\n error: null,\n });\n\n // Keep track of the last resolved value to compare with new ones\n const lastValueRef = useRef<T | undefined>(undefined);\n const hasValueRef = useRef(false); // Tracks whether we've ever resolved a value\n\n // Tracks the current in-flight promise to guard against race conditions\n const inflightRef = useRef<Promise<T> | null>(null);\n\n // Used to prevent state updates after the component unmounts\n const isMountedRef = useRef(true);\n\n useEffect(() => {\n isMountedRef.current = true;\n\n // Trigger the async factory\n const promise = factory();\n inflightRef.current = promise;\n\n // Set loading state\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setState((prev) => {\n return {\n ...prev,\n isLoading: true,\n error: null,\n } as UseDeepAsyncMemoResult<T>;\n });\n\n promise\n .then((result) => {\n // Ignore if component unmounted or if this promise is stale\n if (!isMountedRef.current || inflightRef.current !== promise) return;\n\n // Skip update if value hasn't changed\n const isSame = hasValueRef.current && isEqual(lastValueRef.current as T, result);\n if (isSame) {\n setState((prev) => {\n return {\n ...prev,\n isInitialized: true,\n isLoading: false,\n } as UseDeepAsyncMemoResult<T>;\n });\n return;\n }\n\n // Save the new value\n lastValueRef.current = result;\n hasValueRef.current = true;\n\n setState({\n isInitialized: true,\n isLoading: false,\n value: result,\n error: null,\n });\n })\n .catch((err) => {\n // Ignore if component unmounted or if this promise is stale\n if (!isMountedRef.current || inflightRef.current !== promise) return;\n\n setState({\n isInitialized: hasValueRef.current,\n isLoading: false,\n value: undefined,\n error: err instanceof Error ? err : new Error(\"Unknown error\"),\n });\n });\n\n // Cleanup: prevent state updates after unmount\n return () => {\n isMountedRef.current = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n /**\n * !HACK\n * @description We're only going to use the `isEqual` function to determine if this hook\n * should re-run. This is basically our hook's version of a dependency array\n * @date April 13, 2025\n */\n // factory,\n isEqual,\n ]);\n\n return state;\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nexport type NoSsrFunction = <T = null>(value: T | (() => T), fallback?: T) => T;\n\nexport const useNoSsr = (): NoSsrFunction => {\n const [didMount, setDidMount] = useState<boolean>(false);\n\n // eslint-disable-next-line react-hooks/set-state-in-effect\n useEffect(() => setDidMount(typeof window !== \"undefined\"), []);\n\n const noSsr = useCallback(\n <T = null>(value: T | (() => T), fallback: T = null as T): T => {\n return didMount\n ? typeof value !== \"function\"\n ? value\n : (value as () => T)()\n : fallback;\n },\n [didMount],\n );\n\n return noSsr;\n};\n","import { useCallback, useState } from \"react\";\n\nexport const useRerender = (): (() => void) => {\n const [, setCount] = useState(0);\n\n return useCallback(() => {\n setCount((oldCount) => (oldCount + 1) % Number.MAX_SAFE_INTEGER);\n }, []);\n};\n","export const identity = <T extends unknown>(x: T): T => x;\n","export const shallowArrayEqual = <T extends unknown>(\n a: readonly T[] | T[],\n b: readonly T[] | T[],\n): boolean => {\n return a.length === b.length && a.every((item, i) => item === b[i]);\n};\n","export const shallowEqual = (a: any, b: any): boolean => a === b;\n","import { useRef, useSyncExternalStore } from \"react\";\nimport { shallowEqual } from \"../utils\";\nimport { useNoSsr } from \"./useNoSsr\";\n\nexport const useSyncExternalStoreWithSelector = <TSnapshot, TSelection>(\n subscribe: (onStoreChange: () => void) => () => void,\n getClientSnapshot: () => TSnapshot,\n getServerSnapshot: undefined | null | (() => TSnapshot),\n selector: (snapshot: TSnapshot) => TSelection,\n isEqual?: (a: TSelection, b: TSelection) => boolean,\n): TSelection => {\n const noSsr = useNoSsr();\n const cacheRef = useRef<TSelection | null>(null);\n\n const _getServerSnapshot = getServerSnapshot\n ? () => {\n const data = getServerSnapshot();\n const snapshot = selector(data);\n const compare = isEqual ?? shallowEqual;\n const cached = cacheRef.current;\n\n const isUnchanged = cached === null ? snapshot === null : compare(cached, snapshot);\n\n /**\n * !HACK\n * @description Memoize only the last snapshot so that we can only rerender on changes\n * @date June 22, 2024\n */\n cacheRef.current = isUnchanged ? (cached ?? snapshot) : snapshot;\n\n return cacheRef.current;\n }\n : undefined;\n\n const _getClientSnapshot = () => {\n const data = getClientSnapshot();\n const snapshot = selector(data);\n const compare = isEqual ?? shallowEqual;\n const cached = cacheRef.current;\n\n const isUnchanged = cached === null ? snapshot === null : compare(cached, snapshot);\n\n /**\n * !HACK\n * @description Memoize only the last snapshot so that we can only rerender on changes\n * @date June 22, 2024\n */\n cacheRef.current = isUnchanged ? (cached ?? snapshot) : snapshot;\n\n return cacheRef.current;\n };\n\n const result = useSyncExternalStore(subscribe, _getClientSnapshot, _getServerSnapshot);\n\n // eslint-disable-next-line react-hooks/refs\n return typeof window !== \"undefined\" ? noSsr(result, _getServerSnapshot?.()) : result;\n};\n","import type {\n CreateRoomOptions,\n EnterRoomParams,\n MergeEvents,\n PluvClient,\n PluvRoom,\n PluvRoomAddon,\n PluvRouter,\n PluvRouterEventConfig,\n UserInfo,\n WebSocketConnection,\n} from \"@pluv/client\";\nimport { MockedRoom } from \"@pluv/client\";\nimport type { InferCrdtJson, InferDoc, InferStorage } from \"@pluv/crdt\";\nimport type {\n Id,\n InferIOCrdtKind,\n InferIOInput,\n InferIOOutput,\n IOEventMessage,\n IOLike,\n JsonObject,\n RoomLike,\n UpdateMyPresenceAction,\n} from \"@pluv/types\";\nimport fastDeepEqual from \"fast-deep-equal\";\nimport type { Dispatch } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport {\n identity,\n shallowArrayEqual,\n useAsyncQueue,\n useDeepAsyncMemo,\n useRerender,\n useSyncExternalStoreWithSelector,\n} from \"./internal\";\nimport type {\n BroadcastProxy,\n CreateBundle,\n EventProxy,\n MockedRoomProviderProps,\n PluvProviderProps,\n PluvRoomProviderProps,\n SubscriptionHookOptions,\n} from \"./types\";\n\nexport type CreateBundleOptions<\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject = {},\n TPresence extends Record<string, any> = {},\n TCrdt extends InferIOCrdtKind<TIO> = InferIOCrdtKind<TIO>,\n TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {},\n> = {\n addons?: readonly PluvRoomAddon<TIO, TMetadata, TPresence, TCrdt>[];\n router?: PluvRouter<TIO, TPresence, InferStorage<TCrdt>, TEvents>;\n};\n\nexport const createBundle = <\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject = {},\n TPresence extends Record<string, any> = {},\n TCrdt extends InferIOCrdtKind<TIO> = InferIOCrdtKind<TIO>,\n TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {},\n>(\n client: PluvClient<TIO, TPresence, TCrdt, TMetadata>,\n options: CreateBundleOptions<TIO, TMetadata, TPresence, TCrdt, TEvents> = {},\n): CreateBundle<TIO, TMetadata, TPresence, TCrdt, TEvents> => {\n /**\n * !HACK\n * @description We'll let the context error out if client is not provided,\n * and let the users deal with it.\n * @date October 27, 2022\n */\n const PluvContext = createContext<PluvClient<TIO, TPresence, TCrdt, TMetadata>>(null as any);\n\n /**\n * !HACK\n * @description We'll let the context error out if the room is not provided,\n * and let the users deal with it.\n * @date November 11, 2022\n */\n const PluvRoomContext = createContext<\n RoomLike<TIO, InferDoc<TCrdt>, TPresence, InferStorage<TCrdt>, TEvents>\n >(null as any);\n\n const MockedRoomContext = createContext<RoomLike<\n TIO,\n InferDoc<TCrdt>,\n TPresence,\n InferStorage<TCrdt>,\n TEvents\n > | null>(null);\n\n const MockedRoomProvider = memo<MockedRoomProviderProps<TIO, TPresence, TCrdt>>((props) => {\n const { children, events, initialPresence, initialStorage, room: _room } = props;\n\n const [room] = useState<MockedRoom<TIO, TPresence, TCrdt, TEvents>>(() => {\n return new MockedRoom<TIO, TPresence, TCrdt, TEvents>(_room, {\n events,\n initialPresence,\n initialStorage:\n typeof initialStorage === \"function\"\n ? (client._defs.initialStorage?.getFactory(initialStorage) as TCrdt)\n : undefined,\n });\n });\n\n return (\n <MockedRoomContext.Provider value={room}>\n <PluvRoomContext.Provider value={room}>{children}</PluvRoomContext.Provider>\n </MockedRoomContext.Provider>\n );\n });\n\n MockedRoomProvider.displayName = \"MockedRoomProvider\";\n\n const PluvRoomProvider = memo<PluvRoomProviderProps<TIO, TMetadata, TPresence, TCrdt>>(\n (props) => {\n const {\n children,\n connect = true,\n debug,\n initialPresence,\n initialStorage,\n metadata,\n onAuthorizationFail,\n room: _room,\n } = props;\n\n const queue = useAsyncQueue();\n const rerender = useRerender();\n const mockedRoom = useContext(MockedRoomContext);\n\n const createRoom = useCallback((): PluvRoom<\n TIO,\n TMetadata,\n TPresence,\n TCrdt,\n TEvents\n > => {\n return client.createRoom(_room, {\n addons: options.addons,\n debug,\n initialPresence,\n initialStorage:\n typeof initialStorage === \"function\"\n ? client._defs.initialStorage?.getFactory(initialStorage)\n : undefined,\n metadata,\n onAuthorizationFail,\n router: options.router,\n } as CreateRoomOptions<TIO, TPresence, TCrdt, TMetadata, TEvents>);\n }, [_room, debug, initialPresence, initialStorage, metadata, onAuthorizationFail]);\n\n const [room, setRoom] = useState(() => createRoom());\n\n useEffect(() => {\n if (room.id === _room) return;\n\n setRoom(createRoom());\n }, [_room, createRoom, room]);\n\n const resolvedMeta = useDeepAsyncMemo(async () => {\n const resolved = await Promise.resolve(\n typeof metadata === \"function\" ? metadata() : metadata,\n );\n\n return !!room.metadata ? room.metadata.parse(resolved) : resolved;\n });\n\n useEffect(() => {\n const unsubscribe = room.subscribe.connection(() => {\n rerender();\n });\n\n return () => {\n unsubscribe();\n };\n }, [rerender, room]);\n\n useEffect(() => {\n const leaveRoom = async (): Promise<void> => {\n await queue.push(\n client.leave(room).catch((error) => {\n console.error(error);\n }),\n );\n };\n\n if (!connect) {\n leaveRoom();\n return;\n }\n\n if (!resolvedMeta.isInitialized) {\n leaveRoom();\n return;\n }\n\n const resolved = resolvedMeta.value as TMetadata;\n\n queue.push(\n client\n .enter(room, ...([{ metadata: resolved }] as EnterRoomParams<TMetadata>))\n .catch(async (error) => {\n console.error(error);\n await leaveRoom();\n }),\n );\n\n return () => {\n leaveRoom();\n };\n }, [connect, queue, resolvedMeta.isInitialized, resolvedMeta.value, room]);\n\n return (\n <PluvRoomContext.Provider value={mockedRoom ?? room}>\n {children}\n </PluvRoomContext.Provider>\n );\n },\n );\n\n PluvRoomProvider.displayName = \"PluvRoomProvider\";\n\n const PluvProvider = memo<PluvProviderProps>((props) => {\n const { children } = props;\n\n return <PluvContext.Provider value={client}>{children}</PluvContext.Provider>;\n });\n\n PluvProvider.displayName = \"PluvProvider\";\n\n const useClient = (): PluvClient<TIO, TPresence, TCrdt, TMetadata> => useContext(PluvContext);\n\n const useRoom = () => {\n const room = useContext(PluvRoomContext);\n\n if (!room)\n throw new Error(\n \"Room could not be found. Component must be wrapped with PluvRoomProvider\",\n );\n\n return room;\n };\n\n const useBroadcast = (): BroadcastProxy<MergeEvents<TEvents, TIO>> => {\n const room = useRoom();\n\n const broadcast = useCallback(\n <TEvent extends keyof InferIOInput<MergeEvents<TEvents, TIO>>>(\n event: TEvent,\n data: Id<InferIOInput<MergeEvents<TEvents, TIO>>[TEvent]>,\n ) => {\n room.broadcast(event, data);\n },\n [room],\n );\n\n return useMemo((): BroadcastProxy<MergeEvents<TEvents, TIO>> => {\n return new Proxy(broadcast, {\n get(fn, prop) {\n return (\n data: Id<\n InferIOInput<MergeEvents<TEvents, TIO>>[keyof InferIOInput<\n MergeEvents<TEvents, TIO>\n >]\n >,\n ): void => {\n return fn(prop as keyof InferIOInput<MergeEvents<TEvents, TIO>>, data);\n };\n },\n }) as BroadcastProxy<MergeEvents<TEvents, TIO>>;\n }, [broadcast]);\n };\n\n const useCanRedo = (): boolean => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storage(onStoreChange),\n [room],\n );\n\n const getSnapshot = useCallback((): boolean => room.canRedo(), [room]);\n\n const canRedo = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n identity,\n );\n\n return canRedo;\n };\n\n const useCanUndo = (): boolean => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storage(onStoreChange),\n [room],\n );\n\n const getSnapshot = useCallback((): boolean => room.canUndo(), [room]);\n\n const canUndo = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n identity,\n );\n\n return canUndo;\n };\n\n const useConnection = <T extends unknown = WebSocketConnection>(\n selector = identity as (connection: WebSocketConnection) => T,\n options?: SubscriptionHookOptions<Id<T>>,\n ): Id<T> => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.connection(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getConnection;\n\n const _selector = useCallback(\n (snapshot: WebSocketConnection) => selector(snapshot) as Id<T>,\n [selector],\n );\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n };\n\n const useDoc = () => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storageLoaded(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getDoc;\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n };\n\n const useEvent = <TType extends keyof InferIOOutput<MergeEvents<TEvents, TIO>>>(\n type: TType,\n callback: (data: Id<IOEventMessage<MergeEvents<TEvents, TIO>, TType>>) => void,\n ): void => {\n const room = useRoom();\n\n useEffect(() => {\n const unsubscribe = room.subscribe.event(type, callback);\n\n return () => {\n unsubscribe();\n };\n }, [callback, room, type]);\n };\n\n const event = new Proxy(\n {},\n {\n get(_, prop) {\n const useProxyEvent = (\n callback: (\n data: Id<\n IOEventMessage<\n MergeEvents<TEvents, TIO>,\n keyof InferIOOutput<MergeEvents<TEvents, TIO>>\n >\n >,\n ) => void,\n ): void => {\n return useEvent(\n prop as keyof InferIOOutput<MergeEvents<TEvents, TIO>>,\n callback,\n );\n };\n\n return { useEvent: useProxyEvent };\n },\n },\n ) as EventProxy<MergeEvents<TEvents, TIO>>;\n\n const useMyPresence = <T extends unknown = TPresence>(\n selector = identity as (myPresence: TPresence) => T,\n options?: SubscriptionHookOptions<Id<T> | null>,\n ): [Id<T>, Dispatch<UpdateMyPresenceAction<TPresence>>] => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.myPresence(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getMyPresence;\n\n const _selector = useCallback(\n (snapshot: TPresence) => selector(snapshot) as Id<T>,\n [selector],\n );\n\n const myPresence = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n\n return [myPresence, room.updateMyPresence];\n };\n\n const useMyself = <T extends unknown = UserInfo<TIO, TPresence>>(\n selector = identity as (myself: Id<UserInfo<TIO, TPresence>>) => T,\n options?: SubscriptionHookOptions<Id<T> | null>,\n ): Id<T> | null => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.myself(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getMyself;\n\n const _selector = useCallback(\n (snapshot: Id<UserInfo<TIO, TPresence>> | null) => {\n return !snapshot ? null : (selector(snapshot) as Id<T>);\n },\n [selector],\n );\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n };\n\n const useOther = <T extends unknown = UserInfo<TIO, TPresence>>(\n connectionId: string,\n selector = identity as (other: UserInfo<TIO, TPresence>) => T,\n options?: SubscriptionHookOptions<T | null>,\n ): T | null => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.other(connectionId, onStoreChange),\n [room, connectionId],\n );\n\n const getSnapshot = useCallback(() => room.getOther(connectionId), [room, connectionId]);\n\n const _selector = useCallback(\n (snapshot: Id<UserInfo<TIO, TPresence>> | null) => {\n return !snapshot ? null : (selector(snapshot) as T);\n },\n [selector],\n );\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n };\n\n const useOthers = <T extends unknown = readonly UserInfo<TIO, TPresence>[]>(\n selector = identity as (other: readonly Id<UserInfo<TIO, TPresence>>[]) => T,\n options?: SubscriptionHookOptions<T>,\n ): T => {\n const room = useRoom();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.others(onStoreChange),\n [room],\n );\n\n const getSnapshot = room.getOthers;\n\n return useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n selector as (other: readonly Id<UserInfo<TIO, TPresence>>[]) => T,\n options?.isEqual ??\n ((a, b) => {\n /**\n * !HACK\n * @description Assume the return type will always be an array when this occurs\n * and do a shallow comparison instead like how standard React dependency\n * arrays work. This is for performance's sake and may lead to bugs if the\n * selector doesn't always return an array\n * @date June 22, 2024\n */\n if (Array.isArray(a) && Array.isArray(b) && a.length === b.length) {\n return shallowArrayEqual(a, b);\n }\n\n return fastDeepEqual(a, b);\n }),\n );\n };\n\n const useRedo = () => {\n const room = useRoom();\n\n return room.redo;\n };\n\n const useStorage = <\n TKey extends keyof InferStorage<TCrdt>,\n TData extends unknown = InferCrdtJson<InferStorage<TCrdt>[TKey]>,\n >(\n key: TKey,\n selector = identity as (data: InferCrdtJson<InferStorage<TCrdt>[TKey]>) => TData,\n options?: SubscriptionHookOptions<TData | null>,\n ): [data: TData | null, sharedType: InferStorage<TCrdt>[TKey] | null] => {\n const room = useRoom();\n const rerender = useRerender();\n\n useEffect(() => {\n const unsubscribe = room.subscribe.storageLoaded(() => {\n rerender();\n });\n\n return () => {\n unsubscribe();\n };\n }, [rerender, room]);\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => room.subscribe.storage(key, onStoreChange),\n [key, room],\n );\n\n const getSnapshot = useCallback((): InferCrdtJson<InferStorage<TCrdt>[TKey]> | null => {\n return room.getStorageJson(key);\n }, [key, room]);\n\n const _selector = useCallback(\n (snapshot: InferCrdtJson<InferStorage<TCrdt>[TKey]> | null) => {\n return snapshot === null ? null : selector(snapshot);\n },\n [selector],\n );\n\n const data = useSyncExternalStoreWithSelector(\n subscribe,\n getSnapshot,\n getSnapshot,\n _selector,\n options?.isEqual ?? fastDeepEqual,\n );\n\n const sharedType = room.getStorage(key) ?? null;\n\n return [data, sharedType];\n };\n\n const useTransact = () => {\n const room = useRoom();\n\n return room.transact;\n };\n\n const useUndo = () => {\n const room = useRoom();\n\n return room.undo;\n };\n\n return {\n // components\n MockedRoomProvider,\n PluvProvider,\n PluvRoomProvider,\n\n // proxies\n event,\n\n // hooks\n useBroadcast,\n useCanRedo,\n useCanUndo,\n useClient,\n useConnection,\n useDoc,\n useEvent,\n useMyPresence,\n useMyself,\n useOther,\n useOthers,\n useRedo,\n useRoom,\n useStorage,\n useTransact,\n useUndo,\n };\n};\n"],"mappings":";;;;;;;;;;AAOA,MAAa,sBAAsB;CAC/B,MAAM,WAAW,OAAsB,QAAQ,QAAQ,KAAA,CAAS,CAAC;CAEjE,MAAM,OAAO,YAAY,OAAO,YAA0B;EACtD,SAAS,UAAU,SAAS,QAAQ,KAAK,YAAY,MAAM,OAAO;EAElE,OAAO,MAAM,SAAS;CAC1B,GAAG,CAAC,CAAC;CAEL,OAAO,eAAe,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;AAC3C;;;ACMA,MAAa,oBACT,SACA,UAAmC,kBACP;CAE5B,MAAM,CAAC,OAAO,YAAY,SAAoC;EAC1D,eAAe;EACf,WAAW;EACX,OAAO,KAAA;EACP,OAAO;CACX,CAAC;CAGD,MAAM,eAAe,OAAsB,KAAA,CAAS;CACpD,MAAM,cAAc,OAAO,KAAK;CAGhC,MAAM,cAAc,OAA0B,IAAI;CAGlD,MAAM,eAAe,OAAO,IAAI;CAEhC,gBAAgB;EACZ,aAAa,UAAU;EAGvB,MAAM,UAAU,QAAQ;EACxB,YAAY,UAAU;EAItB,UAAU,SAAS;GACf,OAAO;IACH,GAAG;IACH,WAAW;IACX,OAAO;GACX;EACJ,CAAC;EAED,QACK,MAAM,WAAW;GAEd,IAAI,CAAC,aAAa,WAAW,YAAY,YAAY,SAAS;GAI9D,IADe,YAAY,WAAW,QAAQ,aAAa,SAAc,MAAM,GACnE;IACR,UAAU,SAAS;KACf,OAAO;MACH,GAAG;MACH,eAAe;MACf,WAAW;KACf;IACJ,CAAC;IACD;GACJ;GAGA,aAAa,UAAU;GACvB,YAAY,UAAU;GAEtB,SAAS;IACL,eAAe;IACf,WAAW;IACX,OAAO;IACP,OAAO;GACX,CAAC;EACL,CAAC,CAAC,CACD,OAAO,QAAQ;GAEZ,IAAI,CAAC,aAAa,WAAW,YAAY,YAAY,SAAS;GAE9D,SAAS;IACL,eAAe,YAAY;IAC3B,WAAW;IACX,OAAO,KAAA;IACP,OAAO,eAAe,QAAQ,sBAAM,IAAI,MAAM,eAAe;GACjE,CAAC;EACL,CAAC;EAGL,aAAa;GACT,aAAa,UAAU;EAC3B;CAEJ,GAAG,CAQC,OACJ,CAAC;CAED,OAAO;AACX;;;ACpHA,MAAa,iBAAgC;CACzC,MAAM,CAAC,UAAU,eAAe,SAAkB,KAAK;CAGvD,gBAAgB,YAAY,OAAO,WAAW,WAAW,GAAG,CAAC,CAAC;CAa9D,OAXc,aACC,OAAsB,WAAc,SAAiB;EAC5D,OAAO,WACD,OAAO,UAAU,aACb,QACC,MAAkB,IACvB;CACV,GACA,CAAC,QAAQ,CAGF;AACf;;;ACpBA,MAAa,oBAAkC;CAC3C,MAAM,GAAG,YAAY,SAAS,CAAC;CAE/B,OAAO,kBAAkB;EACrB,UAAU,cAAc,WAAW,KAAK,OAAO,gBAAgB;CACnE,GAAG,CAAC,CAAC;AACT;;;ACRA,MAAa,YAA+B,MAAY;;;ACAxD,MAAa,qBACT,GACA,MACU;CACV,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,MAAM,MAAM,SAAS,EAAE,EAAE;AACtE;;;ACLA,MAAa,gBAAgB,GAAQ,MAAoB,MAAM;;;ACI/D,MAAa,oCACT,WACA,mBACA,mBACA,UACA,YACa;CACb,MAAM,QAAQ,SAAS;CACvB,MAAM,WAAW,OAA0B,IAAI;CAE/C,MAAM,qBAAqB,0BACf;EAEF,MAAM,WAAW,SADJ,kBACgB,CAAC;EAC9B,MAAM,UAAU,WAAW;EAC3B,MAAM,SAAS,SAAS;;;;;;EASxB,SAAS,WAPW,WAAW,OAAO,aAAa,OAAO,QAAQ,QAAQ,QAAQ,KAOhD,UAAU,WAAY;EAExD,OAAO,SAAS;CACpB,IACA,KAAA;CAEN,MAAM,2BAA2B;EAE7B,MAAM,WAAW,SADJ,kBACgB,CAAC;EAC9B,MAAM,UAAU,WAAW;EAC3B,MAAM,SAAS,SAAS;;;;;;EASxB,SAAS,WAPW,WAAW,OAAO,aAAa,OAAO,QAAQ,QAAQ,QAAQ,KAOhD,UAAU,WAAY;EAExD,OAAO,SAAS;CACpB;CAEA,MAAM,SAAS,qBAAqB,WAAW,oBAAoB,kBAAkB;CAGrF,OAAO,OAAO,WAAW,cAAc,MAAM,QAAQ,qBAAqB,CAAC,IAAI;AACnF;;;ACUA,MAAa,gBAOT,QACA,UAA0E,CAAC,MACjB;;;;;;;CAO1D,MAAM,cAAc,cAA4D,IAAW;;;;;;;CAQ3F,MAAM,kBAAkB,cAEtB,IAAW;CAEb,MAAM,oBAAoB,cAMhB,IAAI;CAEd,MAAM,qBAAqB,MAAsD,UAAU;EACvF,MAAM,EAAE,UAAU,QAAQ,iBAAiB,gBAAgB,MAAM,UAAU;EAE3E,MAAM,CAAC,QAAQ,eAA2D;GACtE,OAAO,IAAI,WAA2C,OAAO;IACzD;IACA;IACA,gBACI,OAAO,mBAAmB,aACnB,OAAO,MAAM,gBAAgB,WAAW,cAAc,IACvD,KAAA;GACd,CAAC;EACL,CAAC;EAED,OACI,oBAAC,kBAAkB,UAAnB;GAA4B,OAAO;aAC/B,oBAAC,gBAAgB,UAAjB;IAA0B,OAAO;IAAO;GAAmC,CAAA;EACnD,CAAA;CAEpC,CAAC;CAED,mBAAmB,cAAc;CAEjC,MAAM,mBAAmB,MACpB,UAAU;EACP,MAAM,EACF,UACA,UAAU,MACV,OACA,iBACA,gBACA,UACA,qBACA,MAAM,UACN;EAEJ,MAAM,QAAQ,cAAc;EAC5B,MAAM,WAAW,YAAY;EAC7B,MAAM,aAAa,WAAW,iBAAiB;EAE/C,MAAM,aAAa,kBAMd;GACD,OAAO,OAAO,WAAW,OAAO;IAC5B,QAAQ,QAAQ;IAChB;IACA;IACA,gBACI,OAAO,mBAAmB,aACpB,OAAO,MAAM,gBAAgB,WAAW,cAAc,IACtD,KAAA;IACV;IACA;IACA,QAAQ,QAAQ;GACpB,CAAiE;EACrE,GAAG;GAAC;GAAO;GAAO;GAAiB;GAAgB;GAAU;EAAmB,CAAC;EAEjF,MAAM,CAAC,MAAM,WAAW,eAAe,WAAW,CAAC;EAEnD,gBAAgB;GACZ,IAAI,KAAK,OAAO,OAAO;GAEvB,QAAQ,WAAW,CAAC;EACxB,GAAG;GAAC;GAAO;GAAY;EAAI,CAAC;EAE5B,MAAM,eAAe,iBAAiB,YAAY;GAC9C,MAAM,WAAW,MAAM,QAAQ,QAC3B,OAAO,aAAa,aAAa,SAAS,IAAI,QAClD;GAEA,OAAO,CAAC,CAAC,KAAK,WAAW,KAAK,SAAS,MAAM,QAAQ,IAAI;EAC7D,CAAC;EAED,gBAAgB;GACZ,MAAM,cAAc,KAAK,UAAU,iBAAiB;IAChD,SAAS;GACb,CAAC;GAED,aAAa;IACT,YAAY;GAChB;EACJ,GAAG,CAAC,UAAU,IAAI,CAAC;EAEnB,gBAAgB;GACZ,MAAM,YAAY,YAA2B;IACzC,MAAM,MAAM,KACR,OAAO,MAAM,IAAI,CAAC,CAAC,OAAO,UAAU;KAChC,QAAQ,MAAM,KAAK;IACvB,CAAC,CACL;GACJ;GAEA,IAAI,CAAC,SAAS;IACV,UAAU;IACV;GACJ;GAEA,IAAI,CAAC,aAAa,eAAe;IAC7B,UAAU;IACV;GACJ;GAEA,MAAM,WAAW,aAAa;GAE9B,MAAM,KACF,OACK,MAAM,MAAM,GAAI,CAAC,EAAE,UAAU,SAAS,CAAC,CAAgC,CAAC,CACxE,MAAM,OAAO,UAAU;IACpB,QAAQ,MAAM,KAAK;IACnB,MAAM,UAAU;GACpB,CAAC,CACT;GAEA,aAAa;IACT,UAAU;GACd;EACJ,GAAG;GAAC;GAAS;GAAO,aAAa;GAAe,aAAa;GAAO;EAAI,CAAC;EAEzE,OACI,oBAAC,gBAAgB,UAAjB;GAA0B,OAAO,cAAc;GAC1C;EACqB,CAAA;CAElC,CACJ;CAEA,iBAAiB,cAAc;CAE/B,MAAM,eAAe,MAAyB,UAAU;EACpD,MAAM,EAAE,aAAa;EAErB,OAAO,oBAAC,YAAY,UAAb;GAAsB,OAAO;GAAS;EAA+B,CAAA;CAChF,CAAC;CAED,aAAa,cAAc;CAE3B,MAAM,kBAAgE,WAAW,WAAW;CAE5F,MAAM,gBAAgB;EAClB,MAAM,OAAO,WAAW,eAAe;EAEvC,IAAI,CAAC,MACD,MAAM,IAAI,MACN,0EACJ;EAEJ,OAAO;CACX;CAEA,MAAM,qBAAgE;EAClE,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aAEV,OACA,SACC;GACD,KAAK,UAAU,OAAO,IAAI;EAC9B,GACA,CAAC,IAAI,CACT;EAEA,OAAO,cAAyD;GAC5D,OAAO,IAAI,MAAM,WAAW,EACxB,IAAI,IAAI,MAAM;IACV,QACI,SAKO;KACP,OAAO,GAAG,MAAuD,IAAI;IACzE;GACJ,EACJ,CAAC;EACL,GAAG,CAAC,SAAS,CAAC;CAClB;CAEA,MAAM,mBAA4B;EAC9B,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,QAAQ,aAAa,GACnE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,kBAA2B,KAAK,QAAQ,GAAG,CAAC,IAAI,CAAC;EASrE,OAPgB,iCACZ,WACA,aACA,aACA,QAGS;CACjB;CAEA,MAAM,mBAA4B;EAC9B,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,QAAQ,aAAa,GACnE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,kBAA2B,KAAK,QAAQ,GAAG,CAAC,IAAI,CAAC;EASrE,OAPgB,iCACZ,WACA,aACA,aACA,QAGS;CACjB;CAEA,MAAM,iBACF,WAAW,UACX,YACQ;EACR,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,WAAW,aAAa,GACtE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,KAAK;EAOzB,OAAO,iCACH,WACA,aACA,aARc,aACb,aAAkC,SAAS,QAAQ,GACpD,CAAC,QAAQ,CAOD,GACR,SAAS,WAAW,aACxB;CACJ;CAEA,MAAM,eAAe;EACjB,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,cAAc,aAAa,GACzE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,KAAK;EAEzB,OAAO,qBAAqB,WAAW,aAAa,WAAW;CACnE;CAEA,MAAM,YACF,MACA,aACO;EACP,MAAM,OAAO,QAAQ;EAErB,gBAAgB;GACZ,MAAM,cAAc,KAAK,UAAU,MAAM,MAAM,QAAQ;GAEvD,aAAa;IACT,YAAY;GAChB;EACJ,GAAG;GAAC;GAAU;GAAM;EAAI,CAAC;CAC7B;CAEA,MAAM,QAAQ,IAAI,MACd,CAAC,GACD,EACI,IAAI,GAAG,MAAM;EACT,MAAM,iBACF,aAQO;GACP,OAAO,SACH,MACA,QACJ;EACJ;EAEA,OAAO,EAAE,UAAU,cAAc;CACrC,EACJ,CACJ;CAEA,MAAM,iBACF,WAAW,UACX,YACuD;EACvD,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,WAAW,aAAa,GACtE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,KAAK;EAezB,OAAO,CARY,iCACf,WACA,aACA,aARc,aACb,aAAwB,SAAS,QAAQ,GAC1C,CAAC,QAAQ,CAOD,GACR,SAAS,WAAW,aAGP,GAAG,KAAK,gBAAgB;CAC7C;CAEA,MAAM,aACF,WAAW,UACX,YACe;EACf,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,OAAO,aAAa,GAClE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,KAAK;EASzB,OAAO,iCACH,WACA,aACA,aAVc,aACb,aAAkD;GAC/C,OAAO,CAAC,WAAW,OAAQ,SAAS,QAAQ;EAChD,GACA,CAAC,QAAQ,CAOD,GACR,SAAS,WAAW,aACxB;CACJ;CAEA,MAAM,YACF,cACA,WAAW,UACX,YACW;EACX,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,MAAM,cAAc,aAAa,GAC/E,CAAC,MAAM,YAAY,CACvB;EAEA,MAAM,cAAc,kBAAkB,KAAK,SAAS,YAAY,GAAG,CAAC,MAAM,YAAY,CAAC;EASvF,OAAO,iCACH,WACA,aACA,aAVc,aACb,aAAkD;GAC/C,OAAO,CAAC,WAAW,OAAQ,SAAS,QAAQ;EAChD,GACA,CAAC,QAAQ,CAOD,GACR,SAAS,WAAW,aACxB;CACJ;CAEA,MAAM,aACF,WAAW,UACX,YACI;EACJ,MAAM,OAAO,QAAQ;EAErB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,OAAO,aAAa,GAClE,CAAC,IAAI,CACT;EAEA,MAAM,cAAc,KAAK;EAEzB,OAAO,iCACH,WACA,aACA,aACA,UACA,SAAS,aACH,GAAG,MAAM;;;;;;;;;GASP,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QACvD,OAAO,kBAAkB,GAAG,CAAC;GAGjC,OAAO,cAAc,GAAG,CAAC;EAC7B,EACR;CACJ;CAEA,MAAM,gBAAgB;EAGlB,OAFa,QAEH,CAAC,CAAC;CAChB;CAEA,MAAM,cAIF,KACA,WAAW,UACX,YACqE;EACrE,MAAM,OAAO,QAAQ;EACrB,MAAM,WAAW,YAAY;EAE7B,gBAAgB;GACZ,MAAM,cAAc,KAAK,UAAU,oBAAoB;IACnD,SAAS;GACb,CAAC;GAED,aAAa;IACT,YAAY;GAChB;EACJ,GAAG,CAAC,UAAU,IAAI,CAAC;EAEnB,MAAM,YAAY,aACb,kBAA8B,KAAK,UAAU,QAAQ,KAAK,aAAa,GACxE,CAAC,KAAK,IAAI,CACd;EAEA,MAAM,cAAc,kBAAmE;GACnF,OAAO,KAAK,eAAe,GAAG;EAClC,GAAG,CAAC,KAAK,IAAI,CAAC;EAmBd,OAAO,CAVM,iCACT,WACA,aACA,aAVc,aACb,aAA8D;GAC3D,OAAO,aAAa,OAAO,OAAO,SAAS,QAAQ;EACvD,GACA,CAAC,QAAQ,CAOD,GACR,SAAS,WAAW,aAKb,GAFQ,KAAK,WAAW,GAAG,KAAK,IAEnB;CAC5B;CAEA,MAAM,oBAAoB;EAGtB,OAFa,QAEH,CAAC,CAAC;CAChB;CAEA,MAAM,gBAAgB;EAGlB,OAFa,QAEH,CAAC,CAAC;CAChB;CAEA,OAAO;EAEH;EACA;EACA;EAGA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pluv/react",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "@pluv/client React.js bindings",
5
5
  "author": {
6
6
  "email": "david@pluv.io",
@@ -21,22 +21,22 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "fast-deep-equal": "^3.1.3",
24
- "@pluv/client": "^4.0.1",
25
- "@pluv/crdt": "^4.0.1",
26
- "@pluv/types": "^4.0.1"
24
+ "@pluv/client": "^4.0.2",
25
+ "@pluv/crdt": "^4.0.2",
26
+ "@pluv/types": "^4.0.2"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@types/react": "^18.0.0 || ^19.0.0",
30
30
  "react": "^18.0.0 || ^19.0.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/react": "^19.2.9",
34
- "eslint": "^9.39.2",
35
- "react": "^19.2.3",
36
- "tsdown": "0.20.0-beta.4",
33
+ "@types/react": "^19.2.17",
34
+ "eslint": "^10.4.1",
35
+ "react": "^19.2.7",
36
+ "tsdown": "0.22.2",
37
37
  "typescript": "^5.9.3",
38
- "@pluv/tsconfig": "^4.0.1",
39
- "eslint-config-pluv": "^4.0.1"
38
+ "@pluv/tsconfig": "^4.0.2",
39
+ "eslint-config-pluv": "^4.0.2"
40
40
  },
41
41
  "exports": {
42
42
  ".": "./dist/index.mjs",
@@ -165,7 +165,7 @@ export const createBundle = <
165
165
 
166
166
  useEffect(() => {
167
167
  if (room.id === _room) return;
168
- // eslint-disable-next-line react-hooks/set-state-in-effect
168
+
169
169
  setRoom(createRoom());
170
170
  }, [_room, createRoom, room]);
171
171
 
@@ -51,6 +51,7 @@ export const useDeepAsyncMemo = <T>(
51
51
  inflightRef.current = promise;
52
52
 
53
53
  // Set loading state
54
+ // eslint-disable-next-line react-hooks/set-state-in-effect
54
55
  setState((prev) => {
55
56
  return {
56
57
  ...prev,