@noya-app/noya-multiplayer-react 0.1.47 → 0.1.49
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.
- package/.turbo/turbo-build.log +11 -11
- package/CHANGELOG.md +18 -0
- package/dist/index.bundle.js +8 -8
- package/dist/index.d.mts +20 -4
- package/dist/index.d.ts +20 -4
- package/dist/index.js +113 -46
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +109 -46
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/NoyaStateContext.tsx +133 -47
- package/src/noyaApp.ts +4 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/UserPointersOverlay.tsx","../src/useObservable.ts","../src/hooks.ts","../src/components/ErrorOverlay.tsx","../src/inspector/useStateInspector.tsx","../src/inspector/StateInspector.tsx","../src/inspector/useLocalStorageState.tsx","../src/noyaApp.ts","../src/NoyaStateContext.tsx","../src/WebSocketConnection.ts"],"sourcesContent":["export * from \"@noya-app/state-manager\";\nexport * from \"./components/UserPointersOverlay\";\nexport * from \"./hooks\";\nexport * from \"./inspector/StateInspector\";\nexport * from \"./noyaApp\";\nexport * from \"./NoyaStateContext\";\nexport * from \"./useObservable\";\nexport { WebSocketConnection } from \"./WebSocketConnection\";\nexport type { ConnectionEvent, ConnectionOptions } from \"./WebSocketConnection\";\n","\"use client\";\n\nimport { memoGeneric } from \"@noya-app/react-utils\";\nimport {\n ConnectedUsersManager,\n EphemeralUserDataManager,\n MultiplayerUser,\n} from \"@noya-app/state-manager\";\nimport React, { useEffect, useState } from \"react\";\nimport { useObservable } from \"../useObservable\";\ntype Point = { x: number; y: number };\n\nexport type UserPointerData = { pointer?: Point };\n\nexport type RenderUserPointerProps = {\n userId: string;\n name?: string;\n visible: boolean;\n point: Point;\n};\n\nexport type RenderUserPointer = {\n renderUserPointer: (options: RenderUserPointerProps) => React.ReactNode;\n};\n\ntype InternalUserPointerProps<E extends UserPointerData> = {\n user: MultiplayerUser;\n ephemeralUserDataManager: EphemeralUserDataManager<E>;\n hideAfter?: number;\n} & RenderUserPointer;\n\nfunction shouldShow(hideAfter: number, updatedAt: number) {\n return !!updatedAt && Date.now() - updatedAt < hideAfter;\n}\n\nconst UserPointerInternal = memoGeneric(function UserPointerInternal<\n E extends UserPointerData,\n>({\n user,\n ephemeralUserDataManager,\n hideAfter = 5000,\n renderUserPointer,\n}: InternalUserPointerProps<E>) {\n const metadata = useObservable(ephemeralUserDataManager.metadata$, [\n user.id,\n ] as const);\n const data = useObservable(ephemeralUserDataManager.data$, [\n user.id,\n ] as const);\n\n const [, setForceUpdate] = useState(0);\n\n const updatedAt = metadata?.updatedAt ?? 0;\n const show = shouldShow(hideAfter, updatedAt);\n\n useEffect(() => {\n if (!show) return;\n\n const timeoutId = setTimeout(() => {\n setForceUpdate((prev) => prev + 1);\n }, hideAfter);\n\n return () => clearTimeout(timeoutId);\n }, [hideAfter, show, updatedAt]);\n\n if (!data?.pointer) return null;\n\n return renderUserPointer({\n userId: user.id,\n name: user.name,\n point: data.pointer,\n visible: show,\n });\n});\n\nexport type UserPointersOverlayProps<E extends UserPointerData> = {\n connectedUsersManager: ConnectedUsersManager;\n ephemeralUserDataManager: EphemeralUserDataManager<E>;\n} & RenderUserPointer;\n\nexport const UserPointersOverlay = memoGeneric(function UserPointers<\n E extends UserPointerData,\n>({\n connectedUsersManager,\n ephemeralUserDataManager,\n renderUserPointer,\n}: UserPointersOverlayProps<E>) {\n const currentUserId = useObservable(ephemeralUserDataManager.currentUserId$);\n const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);\n\n return (\n <>\n {connectedUsers.map((user) => {\n if (user.id === currentUserId) return null;\n\n return (\n <UserPointerInternal\n key={user.id}\n user={user}\n ephemeralUserDataManager={\n ephemeralUserDataManager as unknown as EphemeralUserDataManager<UserPointerData>\n }\n renderUserPointer={renderUserPointer}\n />\n );\n })}\n </>\n );\n});\n","import {\n GetAtPath,\n Observable,\n ObservableOptions,\n PathKey,\n} from \"@noya-app/observable\";\nimport { useMemo, useSyncExternalStore } from \"react\";\n\n// Overloads for when observable is definitely defined\nexport function useObservable<T>(observable: Observable<T>): T;\nexport function useObservable<T, A>(\n observable: Observable<T>,\n selector: (value: T) => A,\n options?: Pick<ObservableOptions, \"isEqual\">\n): A;\nexport function useObservable<T, P extends PathKey[] | string>(\n observable: Observable<T>,\n path: P\n): GetAtPath<T, P>;\n\n// Overloads for when observable might be undefined\nexport function useObservable<T>(\n observable: Observable<T> | undefined\n): T | undefined;\nexport function useObservable<T, A>(\n observable: Observable<T> | undefined,\n selector: (value: T) => A,\n options?: Pick<ObservableOptions, \"isEqual\">\n): A | undefined;\nexport function useObservable<T, P extends PathKey[] | string>(\n observable: Observable<T> | undefined,\n path: P\n): GetAtPath<T, P> | undefined;\n\n// Implementation\nexport function useObservable<T, P extends PathKey[]>(\n observable: Observable<T> | undefined,\n pathOrSelector?: P | ((value: T) => any),\n options?: Pick<ObservableOptions, \"isEqual\">\n) {\n const { get, listen } = useMemo(() => {\n if (!observable) {\n return {\n get: () => undefined,\n listen: () => () => {},\n };\n }\n\n if (typeof pathOrSelector === \"function\") {\n const mappedObservable = observable.map(pathOrSelector, {\n isEqual: options?.isEqual,\n });\n return {\n get: mappedObservable.get,\n listen: mappedObservable.subscribe,\n };\n }\n\n const listen = pathOrSelector\n ? (callback: (value: GetAtPath<T, P>) => void) =>\n observable.subscribe(pathOrSelector, callback)\n : observable.subscribe;\n\n const get: () => void = pathOrSelector\n ? () => observable.get(pathOrSelector)\n : observable.get;\n\n return { get, listen };\n }, [observable, pathOrSelector, options?.isEqual]);\n\n return useSyncExternalStore(listen, get, get);\n}\n","\"use client\";\n\nimport { GetAtPath } from \"@noya-app/observable\";\nimport {\n ActionHandler,\n MultiplayerStateManagerOptions,\n NoyaManager,\n StateManager,\n StateManagerOptions,\n stubSync,\n SyncAdapter,\n} from \"@noya-app/state-manager\";\nimport {\n createElement,\n SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { ErrorOverlay } from \"./components/ErrorOverlay\";\nimport { StateInspectorOptions } from \"./inspector/StateInspector\";\nimport { useStateInspector } from \"./inspector/useStateInspector\";\nimport { useObservable } from \"./useObservable\";\n\nexport function useSyncStateManager<S, M>(stateManager: StateManager<S, M>): S;\nexport function useSyncStateManager<S, M, P extends string>(\n stateManager: StateManager<S, M>,\n path: P\n): GetAtPath<S, P>;\nexport function useSyncStateManager<S, M>(\n stateManager: StateManager<S, M>,\n path?: string\n) {\n const getSnapshot = useCallback(\n () =>\n typeof path === \"string\"\n ? stateManager.getState(path)\n : stateManager.getState(),\n [stateManager, path]\n );\n\n return useSyncExternalStore(\n stateManager.addListener,\n getSnapshot,\n getSnapshot\n );\n}\n\nexport function useManagedState<S, M = void>(\n createInitialState: () => S,\n options?: StateManagerOptions<S, M>\n) {\n const [stateManager] = useState(\n () => new StateManager<S, M>(createInitialState(), options)\n );\n\n const state = useSyncStateManager(stateManager);\n\n const setState = useCallback(\n (\n ...args: M extends {}\n ? [metadata: M, action: SetStateAction<S>]\n : [action: SetStateAction<S>]\n ) => {\n const [metadata, action] =\n args.length === 1 ? [undefined, args[0]] : args;\n\n if (metadata === undefined) {\n const performActionNoMetadata = stateManager.performAction as (\n handler: ActionHandler<S>\n ) => void;\n\n if (action instanceof Function) {\n performActionNoMetadata({\n run: action,\n undo: () => state,\n });\n } else {\n performActionNoMetadata({\n run: () => action,\n undo: () => state,\n });\n }\n } else {\n const performActionWithMetadata = stateManager.performAction as (\n metadata: M,\n handler: ActionHandler<S>\n ) => void;\n\n if (action instanceof Function) {\n performActionWithMetadata(metadata, {\n run: action,\n undo: () => state,\n });\n } else {\n performActionWithMetadata(metadata, {\n run: () => action,\n undo: () => state,\n });\n }\n }\n },\n [state, stateManager]\n );\n\n return [state, setState, stateManager] as const;\n}\n\nexport function useManagedHistory<S, M = void>(\n stateManager: StateManager<S, M>\n) {\n return useSyncExternalStore(\n stateManager.historyEmittor.addListener,\n stateManager.getHistorySnapshot,\n stateManager.getHistorySnapshot\n );\n}\n\nexport type UseMultiplayerStateOptions<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n> = MultiplayerStateManagerOptions<S, M> & {\n sync?: SyncAdapter<S, M, E, MenuT>;\n inspector?: boolean | StateInspectorOptions;\n};\n\nconst defaultStubSync = stubSync<unknown, object, object, string>();\n\nexport function useMultiplayerState<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n>(\n initialState: S | (() => S),\n options?: UseMultiplayerStateOptions<S, M, E, MenuT>\n) {\n const {\n sync = defaultStubSync as unknown as SyncAdapter<S, M, E, MenuT>,\n inspector,\n ...rest\n } = options ?? {};\n\n const [noyaManager] = useState(\n () => new NoyaManager<S, M, E, MenuT>(initialState, rest)\n );\n\n const state = useObservable(\n noyaManager.multiplayerStateManager.optimisticState$\n );\n const assets = useObservable(noyaManager.assetManager.assets$);\n\n type ExtrasType = {\n noyaManager: typeof noyaManager;\n taskManager: typeof noyaManager.taskManager;\n connectionEventManager: typeof noyaManager.connectionEventManager;\n connectedUsersManager: typeof noyaManager.connectedUsersManager;\n ephemeralUserDataManager: typeof noyaManager.ephemeralUserDataManager;\n multiplayerStateManager: typeof noyaManager.multiplayerStateManager;\n assetManager: typeof noyaManager.assetManager;\n aiManager: typeof noyaManager.aiManager;\n rpcManager: typeof noyaManager.rpcManager;\n workflowManager: typeof noyaManager.workflowManager;\n secretManager: typeof noyaManager.secretManager;\n menuItemsManager: typeof noyaManager.menuManager;\n createAsset: typeof noyaManager.assetManager.create;\n deleteAsset: typeof noyaManager.assetManager.delete;\n assets: typeof assets;\n };\n\n const extras = useMemo<ExtrasType>(() => {\n return {\n noyaManager,\n taskManager: noyaManager.taskManager,\n connectionEventManager: noyaManager.connectionEventManager,\n connectedUsersManager: noyaManager.connectedUsersManager,\n ephemeralUserDataManager: noyaManager.ephemeralUserDataManager,\n multiplayerStateManager: noyaManager.multiplayerStateManager,\n assetManager: noyaManager.assetManager,\n aiManager: noyaManager.aiManager,\n rpcManager: noyaManager.rpcManager,\n workflowManager: noyaManager.workflowManager,\n secretManager: noyaManager.secretManager,\n menuItemsManager: noyaManager.menuManager,\n createAsset: noyaManager.assetManager.create,\n deleteAsset: noyaManager.assetManager.delete,\n assets,\n };\n }, [noyaManager, assets]);\n\n const syncRef = useRef(sync);\n\n useEffect(() => {\n if (syncRef.current) {\n return syncRef.current({ noyaManager });\n }\n }, [noyaManager]);\n\n useErrorOverlay<MenuT>(noyaManager);\n\n useStateInspector<S, M, E, MenuT>({\n noyaManager,\n disabled: !inspector,\n ...(typeof inspector === \"object\" && inspector),\n });\n\n return [state, noyaManager.multiplayerStateManager.setState, extras] as const;\n}\n\nfunction useErrorOverlay<MenuT extends string = string>(\n noyaManager: NoyaManager<any, any, any, MenuT>\n) {\n const unrecoverableError = useObservable(noyaManager.unrecoverableError);\n\n useEffect(() => {\n if (!unrecoverableError) return;\n const el = document.createElement(\"div\");\n el.id = \"noya-multiplayer-react-error-overlay\";\n document.body.appendChild(el);\n const root = createRoot(el);\n root.render(createElement(ErrorOverlay, { error: unrecoverableError }));\n return () => {\n root.unmount();\n el.remove();\n };\n });\n}\n","import { MultiplayerStateManagerError } from \"@noya-app/state-manager\";\nimport * as React from \"react\";\n\nexport const ErrorOverlay = React.memo(function ErrorOverlay({\n error,\n}: {\n error: MultiplayerStateManagerError;\n}) {\n return (\n <div\n style={{\n position: \"fixed\",\n top: \"20px\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n maxWidth: \"80%\",\n width: \"fit-content\",\n padding: \"12px 20px\",\n background: \"white\",\n color: \"black\",\n zIndex: 10000,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n fontFamily:\n \"'__Inter_6b0edc', '__Inter_Fallback_6b0edc', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"19px\",\n }}\n >\n {error.reason === \"schemaMigration\" ? (\n <>\n <p>\n An updated version of Noya is available. Please reload the page to\n continue.\n </p>\n </>\n ) : (\n <>\n <p>\n An error occurred:{\" \"}\n <code\n style={{\n background: \"rgba(255, 0, 0, 0.1)\",\n color: \"rgba(255, 0, 0, 0.5)\",\n padding: \"2px 4px\",\n borderRadius: \"4px\",\n }}\n >\n {error.reason}\n </code>\n . Please reload the page to continue.\n <br />\n <br />\n If this happens repeatedly, please get in touch and the Noya team\n can help.\n </p>\n </>\n )}\n <div\n style={{\n height: \"1px\",\n background: \"rgba(0, 0, 0, 0.1)\",\n margin: \"12px -20px\",\n }}\n />\n <button\n style={{\n background: \"black\",\n color: \"white\",\n padding: \"8px 16px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n fontWeight: 700,\n lineHeight: \"19px\",\n }}\n onClick={() => {\n window.location.reload();\n }}\n >\n Reload\n </button>\n </div>\n );\n});\n","\"use client\";\n\nimport { NoyaManager } from \"@noya-app/state-manager\";\nimport React, { ComponentProps, useLayoutEffect } from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { Root } from \"react-dom/client\";\nimport { StateInspector } from \"./StateInspector\";\n\nfunction createShadowRootElement() {\n const host = document.createElement(\"div\");\n host.id = \"noya-multiplayer-react-inspector-host\";\n const shadowRoot = host.attachShadow({ mode: \"open\" });\n const container = document.createElement(\"div\");\n shadowRoot.appendChild(container);\n return { host, container };\n}\n\nexport function useStateInspector<\n S,\n M extends object,\n E extends object,\n MenuT extends string = string,\n>({\n noyaManager,\n disabled = false,\n colorScheme,\n anchor,\n}: {\n noyaManager: NoyaManager<S, M, E, MenuT>;\n disabled: boolean;\n} & Pick<ComponentProps<typeof StateInspector>, \"colorScheme\" | \"anchor\">) {\n const [root, setRoot] = React.useState<Root | null>(null);\n\n useLayoutEffect(() => {\n if (disabled) return;\n\n const { host, container } = createShadowRootElement();\n const root = createRoot(container);\n\n document.body.appendChild(host);\n\n setRoot(root);\n\n return () => {\n document.body.removeChild(host);\n };\n }, [disabled]);\n\n useLayoutEffect(() => {\n if (!root) return;\n\n root.render(\n <StateInspector\n colorScheme={colorScheme}\n anchor={anchor}\n noyaManager={noyaManager}\n />\n );\n }, [noyaManager, anchor, colorScheme, root]);\n}\n","\"use client\";\n\nimport { memoGeneric } from \"@noya-app/react-utils\";\nimport { ExtendedPathKey, NoyaManager } from \"@noya-app/state-manager\";\nimport React, {\n CSSProperties,\n ComponentPropsWithoutRef,\n FC,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport {\n ObjectInspector,\n ObjectLabel,\n ObjectName,\n ObjectPreview,\n chromeDark,\n chromeLight,\n} from \"react-inspector\";\nimport { useManagedHistory } from \"../hooks\";\nimport { useObservable } from \"../useObservable\";\nimport { useLocalStorageState } from \"./useLocalStorageState\";\n\nconst lightTheme = {\n ...chromeLight,\n BASE_BACKGROUND_COLOR: \"transparent\",\n OBJECT_NAME_COLOR: \"rgba(0,0,0,0.7)\",\n} as any;\n\nconst darkTheme = {\n ...chromeDark,\n BASE_BACKGROUND_COLOR: \"transparent\",\n OBJECT_NAME_COLOR: \"rgba(255,255,255,0.7)\",\n} as any;\n\nconst styles = {\n sectionInner: {\n flex: \"1 1 0\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n },\n} as const;\n\nfunction ToggleButton({\n showInspector,\n setShowInspector,\n theme,\n anchor,\n}: {\n showInspector: boolean;\n setShowInspector: (value: boolean) => void;\n theme: typeof chromeLight;\n anchor: StateInspectorAnchor;\n}) {\n return (\n <span\n role=\"button\"\n style={{\n flex: \"0\",\n appearance: \"none\",\n color: theme.BASE_COLOR,\n border: \"none\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px 0\",\n }}\n onClick={(event) => {\n event.stopPropagation();\n\n setShowInspector(!showInspector);\n }}\n >\n <span style={{ width: \"12px\", height: \"12px\" }}>\n {showInspector === (anchor === \"right\") ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"size-6\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m5.25 4.5 7.5 7.5-7.5 7.5m6-15 7.5 7.5-7.5 7.5\"\n />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"size-6\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m18.75 4.5-7.5 7.5 7.5 7.5m-6-15L5.25 12l7.5 7.5\"\n />\n </svg>\n )}\n </span>\n </span>\n );\n}\n\nfunction DisclosureSection({\n open,\n setOpen,\n title,\n right,\n children,\n colorScheme,\n isFirst,\n style,\n}: {\n open: boolean;\n setOpen?: (value: boolean) => void;\n title: React.ReactNode;\n right?: React.ReactNode;\n children: React.ReactNode;\n colorScheme: \"light\" | \"dark\";\n isFirst?: boolean;\n style?: CSSProperties;\n}) {\n const theme = colorScheme === \"light\" ? lightTheme : darkTheme;\n\n const borderColor =\n colorScheme === \"light\" ? \"rgba(0,0,0,0.1)\" : \"rgba(255,255,255,0.1)\";\n\n return (\n <div\n style={{\n flex: open ? \"1 1 0\" : \"0\",\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n >\n <div\n onClick={() => setOpen?.(!open)}\n style={{\n cursor: \"default\",\n fontSize: \"12px\",\n padding: \"4px 10px\",\n display: \"flex\",\n alignItems: \"center\",\n ...(!isFirst && { borderTop: `1px solid ${borderColor}` }),\n ...(open && { borderBottom: `1px solid ${borderColor}` }),\n }}\n >\n {setOpen && (\n <Arrow\n expanded={open}\n style={{\n fontSize: theme.ARROW_FONT_SIZE,\n marginRight: theme.ARROW_MARGIN_RIGHT + 1,\n color: theme.ARROW_COLOR,\n }}\n />\n )}\n <span style={{ flex: \"1 1 0\", userSelect: \"none\" }}>{title}</span>\n {right}\n </div>\n {open && children}\n </div>\n );\n}\n\nfunction InspectorRow({\n children,\n colorScheme,\n selected,\n style,\n variant,\n}: {\n children: React.ReactNode;\n colorScheme: \"light\" | \"dark\";\n selected?: boolean;\n style?: CSSProperties;\n variant?: \"up\" | \"down\";\n}) {\n const solidBorderColor =\n colorScheme === \"light\" ? \"rgb(223 223 223)\" : \"rgb(29 29 29)\";\n\n return (\n <div\n style={{\n borderBottom: `1px solid ${solidBorderColor}`,\n fontSize: \"12px\",\n fontFamily: \"Menlo, monospace\",\n padding: \"2px 12px 1px\",\n display: \"flex\",\n alignItems: \"center\",\n background:\n variant === \"up\"\n ? \"rgba(0,255,0,0.1)\"\n : variant === \"down\"\n ? \"transparent\"\n : selected\n ? \"rgb(59 130 246 / 15%)\"\n : undefined,\n // background:\n // colorScheme === \"light\"\n // ? \"rgba(0,0,0,0.05)\"\n // : \"rgba(255,255,255,0.05)\",\n ...style,\n }}\n >\n <span\n style={{\n fontFamily: \"Menlo, monospace\",\n fontSize: \"11px\",\n borderRadius: 4,\n display: \"inline-block\",\n }}\n >\n {children}\n </span>\n </div>\n );\n}\n\nconst HISTORY_ELEMENT_PREFIX = \"noya-multiplayer-history-\";\n\nexport type StateInspectorAnchor =\n | \"left\"\n | \"right\"\n | \"bottom left\"\n | \"bottom right\";\n\nexport type StateInspectorOptions = {\n colorScheme?: \"light\" | \"dark\";\n anchor?: StateInspectorAnchor;\n};\n\nexport const StateInspector = memoGeneric(function StateInspector<\n S,\n M extends object,\n E extends object,\n MenuT extends string = string,\n>({\n noyaManager,\n colorScheme = \"light\",\n anchor = \"right\",\n unstyled = false,\n ...props\n}: {\n noyaManager: NoyaManager<S, M, E, MenuT>;\n unstyled?: boolean;\n} & StateInspectorOptions &\n ComponentPropsWithoutRef<\"div\">) {\n const {\n multiplayerStateManager,\n assetManager,\n connectedUsersManager,\n secretManager,\n ephemeralUserDataManager,\n connectionEventManager,\n taskManager,\n } = noyaManager;\n\n const [didMount, setDidMount] = React.useState(false);\n const tasks = useObservable(taskManager.tasks$);\n\n useLayoutEffect(() => {\n setDidMount(true);\n }, []);\n\n const eventsContainerRef = React.useRef<HTMLDivElement>(null);\n const historyContainerRef = React.useRef<HTMLDivElement>(null);\n\n const [showInspector, setShowInspector] = useLocalStorageState(\n \"noya-multiplayer-react-show-inspector\",\n true\n );\n const [showEvents, setShowEvents] = useLocalStorageState(\n \"noya-multiplayer-react-show-events\",\n false\n );\n const [showHistory, setShowHistory] = useLocalStorageState(\n \"noya-multiplayer-react-show-history\",\n false\n );\n const [showUsers, setShowUsers] = useLocalStorageState(\n \"noya-multiplayer-react-show-users\",\n true\n );\n const [showData, setShowData] = useLocalStorageState(\n \"noya-multiplayer-react-show-data\",\n true\n );\n const [showTasks, setShowTasks] = useLocalStorageState(\n \"noya-multiplayer-react-show-tasks\",\n false\n );\n const [showEphemeral, setShowEphemeral] = useLocalStorageState(\n \"noya-multiplayer-react-show-ephemeral\",\n false\n );\n const [showAssets, setShowAssets] = useLocalStorageState(\n \"noya-multiplayer-react-show-assets\",\n false\n );\n const [showSecrets, setShowSecrets] = useLocalStorageState(\n \"noya-multiplayer-react-show-secrets\",\n false\n );\n\n const connectionEvents = useObservable(connectionEventManager.events$);\n\n useEffect(() => {\n if (eventsContainerRef.current) {\n eventsContainerRef.current.scrollTop =\n eventsContainerRef.current.scrollHeight;\n }\n }, [connectionEvents]);\n\n const multipeerStateInitialized = useObservable(\n multiplayerStateManager.isInitialized$\n );\n const ephemeral = useObservable(ephemeralUserDataManager.data$);\n const historySnapshot = useManagedHistory(multiplayerStateManager.sm);\n const assets = useObservable(assetManager.assets$);\n const assetsInitialized = useObservable(assetManager.isInitialized$);\n const secrets = useObservable(secretManager.secrets$);\n const secretsInitialized = useObservable(secretManager.isInitialized$);\n const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);\n const userId = useObservable(connectedUsersManager.currentUserId$);\n const state = useObservable(multiplayerStateManager.optimisticState$);\n\n useEffect(() => {\n if (historyContainerRef.current) {\n historyContainerRef.current.scrollTop =\n historyContainerRef.current.scrollHeight;\n }\n }, [historySnapshot]);\n\n // If history index changes, scroll to the new history entry into view\n useEffect(() => {\n if (!historyContainerRef.current) return;\n\n const historyEntry = historyContainerRef.current.querySelector(\n `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`\n );\n\n if (historyEntry) {\n historyEntry.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n }\n }, [historySnapshot.historyIndex]);\n\n const theme = colorScheme === \"light\" ? lightTheme : darkTheme;\n // const borderColor =\n // colorScheme === \"light\" ? \"rgba(0,0,0,0.1)\" : \"rgba(255,255,255,0.1)\";\n const solidBorderColor =\n colorScheme === \"light\" ? \"rgb(223 223 223)\" : \"rgb(29 29 29)\";\n\n const baseStyle: CSSProperties = {\n position: \"fixed\",\n top: 12,\n ...(anchor.includes(\"right\") ? { right: 12 } : { left: 12 }),\n bottom: 12,\n width: 400,\n background:\n colorScheme === \"light\" ? \"rgba(255,255,255,0.95)\" : \"rgba(0,0,0,0.95)\",\n backdropFilter: \"blur(48px)\",\n border: `1px solid ${solidBorderColor}`,\n // outlineOffset: -1,\n borderRadius: 4,\n display: \"flex\",\n flexDirection: \"column\",\n // gap: 12,\n color: theme.BASE_COLOR,\n overflow: \"hidden\",\n zIndex: 9999,\n lineHeight: \"13px\",\n };\n\n if (!didMount) return null;\n\n if (!showInspector) {\n return (\n <div\n {...props}\n style={{\n ...baseStyle,\n padding: \"4px 10px\",\n width: undefined,\n ...(anchor.includes(\"bottom\")\n ? { bottom: 12, top: undefined }\n : { bottom: undefined }),\n }}\n onClick={() => setShowInspector(true)}\n >\n <ToggleButton\n showInspector={showInspector}\n setShowInspector={setShowInspector}\n theme={theme}\n anchor={anchor}\n />\n </div>\n );\n }\n\n return (\n <div\n {...props}\n style={{\n ...(!unstyled && baseStyle),\n ...props.style,\n }}\n >\n <DisclosureSection\n isFirst\n open={showUsers}\n setOpen={setShowUsers}\n title=\"Users\"\n colorScheme={colorScheme}\n style={{\n flex: \"0 0 auto\",\n maxHeight: \"200px\",\n }}\n right={\n <ToggleButton\n showInspector={showInspector}\n setShowInspector={setShowInspector}\n theme={theme}\n anchor={anchor}\n />\n }\n >\n <div style={{ ...styles.sectionInner, flex: \"0 0 auto\" }}>\n {connectedUsers?.map((user) => (\n <InspectorRow\n key={user.id}\n colorScheme={colorScheme}\n variant={user.id === userId ? \"up\" : undefined}\n >\n {user.image && (\n <img\n src={user.image}\n alt={user.name}\n style={{\n width: \"13px\",\n height: \"13px\",\n borderRadius: \"50%\",\n marginRight: \"4px\",\n display: \"inline-block\",\n position: \"relative\",\n background: solidBorderColor,\n verticalAlign: \"middle\",\n }}\n />\n )}\n {user.name} ({ellipsis(user.id.toString(), 8, \"middle\")})\n </InspectorRow>\n ))}\n {!connectedUsers && (\n <div\n style={{\n padding: \"12px\",\n fontSize: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n }}\n >\n <span>No connected users</span>\n </div>\n )}\n </div>\n </DisclosureSection>\n <DisclosureSection\n title={\n <TitleLabel>\n Data\n <ColoredDot\n type={multipeerStateInitialized ? \"success\" : \"error\"}\n />\n </TitleLabel>\n }\n colorScheme={colorScheme}\n setOpen={setShowData}\n open={showData}\n right={\n <span\n style={{\n display: \"flex\",\n gap: \"4px\",\n }}\n >\n <SmallButton\n // disabled={!historySnapshot.canUndo}\n theme={theme}\n onClick={() => {\n noyaManager.forceInit();\n }}\n >\n Reset\n </SmallButton>\n </span>\n }\n >\n <div style={styles.sectionInner}>\n <InspectorRow colorScheme={colorScheme}>\n <ObjectInspector\n name={multiplayerStateManager.schema ? \"state\" : undefined}\n data={state}\n theme={theme}\n />\n </InspectorRow>\n {multiplayerStateManager.schema && (\n <InspectorRow colorScheme={colorScheme}>\n <ObjectInspector\n name=\"schema\"\n data={multiplayerStateManager.schema}\n theme={theme}\n />\n </InspectorRow>\n )}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showHistory}\n setOpen={setShowHistory}\n title=\"History\"\n colorScheme={colorScheme}\n right={\n <span\n style={{\n display: \"flex\",\n gap: \"4px\",\n }}\n >\n <SmallButton\n disabled={!historySnapshot.canUndo}\n theme={theme}\n onClick={() => {\n multiplayerStateManager.undo();\n }}\n >\n <span style={{ width: \"12px\", height: \"12px\" }}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fill=\"currentColor\"\n d=\"M12 5H7V2L1 6l6 4V7h5c2.2 0 4 1.8 4 4s-1.8 4-4 4H7v2h5c3.3 0 6-2.7 6-6s-2.7-6-6-6\"\n />\n </svg>\n </span>\n </SmallButton>\n <SmallButton\n disabled={!historySnapshot.canRedo}\n theme={theme}\n onClick={() => {\n multiplayerStateManager.redo();\n }}\n >\n <span style={{ width: \"12px\", height: \"12px\" }}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fill=\"currentColor\"\n d=\"M8 5h5V2l6 4l-6 4V7H8c-2.2 0-4 1.8-4 4s1.8 4 4 4h5v2H8c-3.3 0-6-2.7-6-6s2.7-6 6-6\"\n />\n </svg>\n </span>\n </SmallButton>\n </span>\n }\n >\n <div ref={historyContainerRef} style={styles.sectionInner}>\n <div\n id={`${HISTORY_ELEMENT_PREFIX}0`}\n style={{\n borderBottom: `1px solid ${solidBorderColor}`,\n fontSize: \"12px\",\n fontFamily: \"Menlo, monospace\",\n padding: \"2px 12px 1px\",\n display: \"flex\",\n alignItems: \"center\",\n background:\n historySnapshot.historyIndex === 0\n ? \"rgb(59 130 246 / 15%)\"\n : undefined,\n }}\n >\n <span\n style={{\n fontFamily: \"Menlo, monospace\",\n fontSize: \"11px\",\n borderRadius: 4,\n display: \"inline-block\",\n }}\n >\n Initial state\n </span>\n </div>\n {historySnapshot.history.map((entry, index) => (\n <div\n id={`${HISTORY_ELEMENT_PREFIX}${index + 1}`}\n key={index}\n style={{\n padding: \"0px 12px 1px\",\n borderBottom: `1px solid ${solidBorderColor}`,\n background:\n index + 1 === historySnapshot.historyIndex\n ? \"rgb(59 130 246 / 15%)\"\n : undefined,\n }}\n >\n {\"name\" in entry.metadata &&\n typeof entry.metadata.name === \"string\" && (\n <pre\n style={{\n fontSize: \"11px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n margin: 0,\n }}\n >\n {entry.metadata.name}\n </pre>\n )}\n {entry.redoPatches?.map((patch, j) => (\n <pre\n key={j}\n style={{\n fontSize: \"11px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n margin: 0,\n }}\n >\n {patch.op === \"add\" && (\n <>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n {\" = \"}\n <ObjectInspector data={patch.value} theme={theme} />\n </>\n )}\n {patch.op === \"replace\" && (\n <>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n {\" = \"}\n <ObjectInspector data={patch.value} theme={theme} />\n </>\n )}\n {patch.op === \"remove\" && (\n <>\n <span style={{ color: theme.OBJECT_VALUE_STRING_COLOR }}>\n delete{\" \"}\n </span>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n </>\n )}\n {patch.op === \"move\" && (\n <>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.from!)}\n </span>\n {\" -> \"}\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n </>\n )}\n </pre>\n ))}\n </div>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showAssets}\n setOpen={setShowAssets}\n title={\n <TitleLabel>\n Assets\n <ColoredDot type={assetsInitialized ? \"success\" : \"error\"} />\n </TitleLabel>\n }\n colorScheme={colorScheme}\n right={\n <span style={{ display: \"flex\", gap: \"10px\" }}>\n <SmallButton\n theme={theme}\n onClick={() => {\n console.info(\n \"[StateInspector] Reloading assets\",\n noyaManager.id\n );\n assetManager.fetch();\n }}\n >\n Reload\n </SmallButton>\n <SmallButton\n theme={theme}\n onClick={() => {\n // get file input\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = () => {\n const file = input.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = () => {\n const buffer = reader.result as ArrayBuffer;\n assetManager.create(new Uint8Array(buffer));\n };\n reader.readAsArrayBuffer(file);\n }\n };\n input.click();\n }}\n >\n Upload\n </SmallButton>\n </span>\n }\n >\n <div style={styles.sectionInner}>\n {assets.map((asset) => (\n <InspectorRow key={asset.id} colorScheme={colorScheme}>\n <ObjectInspector name={asset.id} data={asset} theme={theme} />\n <SmallButton\n theme={theme}\n onClick={() => assetManager.delete(asset.id)}\n >\n Delete\n </SmallButton>\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n title=\"Tasks\"\n colorScheme={colorScheme}\n open={showTasks}\n setOpen={setShowTasks}\n >\n <div style={styles.sectionInner}>\n {tasks?.map((task) => (\n <InspectorRow\n key={task.id}\n colorScheme={colorScheme}\n style={{\n backgroundColor:\n task.status === \"done\"\n ? \"rgba(0,255,0,0.2)\"\n : task.status === \"error\"\n ? \"rgba(255,0,0,0.2)\"\n : undefined,\n }}\n >\n <ObjectInspector\n name={task.name}\n data={task.payload}\n theme={theme}\n />\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n title={\n <TitleLabel>\n Secrets\n <ColoredDot type={secretsInitialized ? \"success\" : \"error\"} />\n </TitleLabel>\n }\n colorScheme={colorScheme}\n open={showSecrets}\n setOpen={setShowSecrets}\n right={\n <SmallButton\n theme={theme}\n onClick={() => {\n const name = prompt(\"Enter secret name\");\n if (!name) return;\n const value = prompt(\"Enter secret value\");\n if (!value) return;\n secretManager.createSecret(name, value);\n }}\n >\n Create\n </SmallButton>\n }\n >\n <div style={styles.sectionInner}>\n {secrets.map((secret) => (\n <InspectorRow key={secret.id} colorScheme={colorScheme}>\n <ObjectInspector data={secret} theme={theme} />\n <SmallButton\n theme={theme}\n onClick={() => secretManager.deleteSecret(secret.name)}\n >\n Delete\n </SmallButton>\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showEphemeral}\n setOpen={setShowEphemeral}\n title=\"Ephemeral User Data\"\n colorScheme={colorScheme}\n >\n <div style={styles.sectionInner}>\n {Object.entries(ephemeral).map(([key, value]) => (\n <InspectorRow key={key} colorScheme={colorScheme}>\n <ObjectInspector\n name={key}\n data={value}\n theme={theme}\n expandLevel={10}\n />\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showEvents}\n setOpen={setShowEvents}\n title=\"Events\"\n colorScheme={colorScheme}\n >\n <div ref={eventsContainerRef} style={styles.sectionInner}>\n {connectionEvents?.map((event, index) =>\n event.type === \"stateChange\" ? (\n <InspectorRow key={index} colorScheme={colorScheme}>\n connection:{\" \"}\n <span style={{ fontStyle: \"italic\" }}>\n {event.state.toLowerCase()}\n </span>\n </InspectorRow>\n ) : (\n <InspectorRow\n key={index}\n colorScheme={colorScheme}\n variant={event.type === \"send\" ? \"up\" : \"down\"}\n style={{\n padding: \"0px 12px 1px\",\n }}\n >\n <ObjectInspector\n data={event.type === \"error\" ? event.error : event.message}\n theme={theme}\n nodeRenderer={({\n depth,\n name,\n data,\n isNonenumerable,\n }: any) => {\n const direction = event.type === \"send\" ? \"up\" : \"down\";\n\n return depth === 0 ? (\n <ObjectRootLabel direction={direction} data={data} />\n ) : (\n <ObjectLabel\n direction={direction}\n name={name}\n data={data}\n isNonenumerable={isNonenumerable}\n />\n );\n }}\n />\n </InspectorRow>\n )\n )}\n {!connectionEvents && (\n <div\n style={{\n padding: \"12px\",\n fontSize: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n }}\n >\n <span>No recorded events</span>\n </div>\n )}\n </div>\n </DisclosureSection>\n </div>\n );\n});\n\ntype MessageDirection = \"up\" | \"down\";\n\nconst ObjectRootLabel: FC<{\n name?: string;\n data: any;\n direction?: MessageDirection;\n}> = ({ name, data, direction }) => {\n if (typeof name === \"string\") {\n return (\n <span>\n <ObjectName name={name} />\n <span>: </span>\n <ObjectPreview data={data} />\n </span>\n );\n }\n if (direction === \"up\" || direction === \"down\") {\n const arrow = direction === \"up\" ? \"↑\" : \"↓\";\n\n return (\n <span>\n <span\n style={{\n background:\n direction === \"up\" ? \"rgba(0,255,0,0.2)\" : \"rgba(255,0,0,0.2)\",\n // color: \"white\",\n width: 12,\n height: 12,\n borderRadius: 2,\n display: \"inline-flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n marginRight: 4,\n lineHeight: \"12px\",\n }}\n >\n {arrow}\n </span>\n <ObjectPreview data={data} />\n </span>\n );\n } else {\n return <ObjectPreview data={data} />;\n }\n};\n\n// Rotates ▶️ or ▼ based on expanded state\nfunction Arrow({\n expanded,\n onClick,\n style,\n}: {\n expanded: boolean;\n onClick?: () => void;\n style?: CSSProperties;\n}) {\n return (\n <span\n role=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-block\",\n textAlign: \"center\",\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n fontFamily: \"Menlo, monospace\",\n ...style,\n }}\n >\n {\"▼\"}\n </span>\n );\n}\n\nfunction pathToString(extendedPath: ExtendedPathKey[]) {\n return extendedPath\n .map((key) =>\n typeof key === \"object\"\n ? `:${ellipsis(key.id.toString(), 8, \"middle\")}`\n : key\n )\n .map((key, index) =>\n index === 0 || (typeof key === \"string\" && key.startsWith(\":\"))\n ? key\n : `.${key}`\n )\n .join(\"\");\n}\n\ntype EllipsisPosition = \"start\" | \"middle\" | \"end\";\n\nfunction ellipsis(\n str: string,\n maxLength: number,\n position: EllipsisPosition = \"end\"\n) {\n if (str.length <= maxLength) return str;\n\n switch (position) {\n case \"start\":\n return `…${str.slice(str.length - maxLength)}`;\n case \"middle\":\n const halfLength = Math.floor(maxLength / 2);\n return `${str.slice(0, halfLength)}…${str.slice(str.length - halfLength)}`;\n case \"end\":\n return `${str.slice(0, maxLength)}…`;\n }\n}\n\nfunction SmallButton({\n children,\n onClick,\n style,\n theme,\n disabled,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n style?: CSSProperties;\n theme: typeof chromeLight;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n style={{\n flex: \"0\",\n appearance: \"none\",\n background: \"none\",\n color: theme.BASE_COLOR,\n opacity: disabled ? 0.25 : 1,\n border: \"none\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0\",\n cursor: \"pointer\",\n ...style,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction ColoredDot({ type }: { type: \"success\" | \"error\" }) {\n return (\n <span\n style={{\n display: \"inline-block\",\n width: 6,\n height: 6,\n background:\n type === \"success\" ? \"rgba(0,200,0,0.8)\" : \"rgba(200,0,0,0.8)\",\n borderRadius: \"50%\",\n verticalAlign: \"middle\",\n }}\n />\n );\n}\n\nfunction TitleLabel({ children }: { children: React.ReactNode }) {\n return (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}>\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nconst localStorage = typeof window !== \"undefined\" ? window.localStorage : null;\n\nexport function useLocalStorageState<S>(\n key: string,\n defaultValue: S\n): [S, (value: S) => void] {\n const [state, setState] = React.useState<S>(() => {\n const value = localStorage?.getItem(key);\n let result = defaultValue;\n if (value) {\n try {\n result = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing localStorage value\", error);\n }\n }\n return result;\n });\n\n const setLocalStorageState = (value: S) => {\n localStorage?.setItem(key, JSON.stringify(value));\n setState(value);\n };\n\n return [state, setLocalStorageState];\n}\n","/* eslint-disable no-restricted-globals */\nimport {\n createOrCastValue,\n findAllDefs,\n isEmbeddedApp,\n localStorageSync,\n parentFrameSync,\n Static,\n stubSync,\n SyncAdapter,\n TSchema,\n TypeGuard,\n webSocketSync,\n} from \"@noya-app/state-manager\";\nimport { useMemo, useState } from \"react\";\nimport { useMultiplayerState, UseMultiplayerStateOptions } from \"./hooks\";\nimport { StateInspectorOptions } from \"./inspector/StateInspector\";\n\nexport type AppViewType = \"editable\" | \"readOnly\" | \"preview\";\n\nexport type AppTheme = \"light\" | \"dark\";\n\nexport type AppData<State> = {\n multiplayerUrl?: string;\n theme: AppTheme;\n viewType: AppViewType;\n initialState: State;\n inspector: boolean | StateInspectorOptions;\n};\n\nexport function createDefaultAppData<State>(\n initialState: State\n): AppData<State> {\n return {\n theme: \"light\",\n viewType: \"editable\",\n initialState,\n inspector: false,\n };\n}\n\nexport type GetAppDataOptions = {\n window?: { location: { hash: string } };\n overrideExistingState?: boolean;\n};\n\nexport function enforceSchema<State>(\n initialState: State,\n schema?: TSchema\n): State {\n return schema\n ? (createOrCastValue({\n schema,\n value: initialState,\n defs: findAllDefs(schema),\n }) as State)\n : initialState;\n}\n\nexport function parseAppDataParameter(\n options?: GetAppDataOptions\n): AppData<unknown> | null {\n const window = options?.window ?? globalThis;\n const location = window.location;\n if (!location) return null;\n const urlHash = (location.hash || \"\").replace(/^#/, \"\");\n const params = new URLSearchParams(urlHash);\n const data = params.get(\"data\");\n if (!data) return null;\n try {\n return JSON.parse(data);\n } catch (e) {\n return null;\n }\n}\n\nexport function getAppData<State>(\n initialState: State | (() => State),\n schema?: TSchema,\n options?: GetAppDataOptions\n): AppData<State> {\n const resolvedInitialState =\n initialState instanceof Function ? initialState() : initialState;\n\n let appData =\n parseAppDataParameter(options) ??\n createDefaultAppData(resolvedInitialState);\n\n if (options?.overrideExistingState) {\n appData.initialState = resolvedInitialState;\n }\n\n appData.initialState = enforceSchema(appData.initialState, schema) as State;\n\n return appData as AppData<State>;\n}\n\nexport type UseNoyaStateOptions<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n> = UseMultiplayerStateOptions<S, M, E, MenuT> & {\n offlineStorageKey?: string;\n};\n\nexport type UseNoyaStateResult<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n> = [\n ReturnType<typeof useMultiplayerState<S, M, E, MenuT>>[0],\n ReturnType<typeof useMultiplayerState<S, M, E, MenuT>>[1],\n ReturnType<typeof useMultiplayerState<S, M, E, MenuT>>[2] & {\n theme: AppTheme;\n viewType: AppViewType;\n },\n];\n\n/**\n * Sync data locally or to a multiplayer server.\n *\n * There are 3 ways to use this hook:\n *\n * 1. Pass an initial state: `useNoyaState(initialState)`\n * 2. Pass an initial state and a schema: `useNoyaState(initialState, { schema })`\n * 3. Pass only a schema, and a conforming initial state is created automatically: `useNoyaState({ schema })`\n */\nexport function useNoyaState<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n O extends UseNoyaStateOptions<S, M, E, MenuT> = UseNoyaStateOptions<\n S,\n M,\n E,\n MenuT\n >,\n>(\n ...args:\n | [\n initialState: O[\"schema\"] extends TSchema\n ? Static<O[\"schema\"]> | (() => Static<O[\"schema\"]>)\n : S | (() => S),\n options?: O,\n ]\n | [options: O & { schema: TSchema }]\n): UseNoyaStateResult<\n O[\"schema\"] extends TSchema ? Static<O[\"schema\"]> : S,\n M,\n E,\n MenuT\n> {\n const [initialState, options] =\n typeof args[0] === \"object\" &&\n args[0] !== null &&\n \"schema\" in args[0] &&\n TypeGuard.IsSchema(args[0].schema)\n ? [null, args[0]]\n : [args[0], args[1]];\n\n // Keep these stable after initial render\n const [\n {\n multiplayerUrl,\n inspector,\n initialState: noyaAppInitialState,\n theme,\n viewType,\n },\n ] = useState(() => {\n return getAppData(initialState, options?.schema, {\n overrideExistingState: options?.overrideExistingState,\n });\n });\n\n const sync = useMemo((): SyncAdapter<S, M, E, MenuT> => {\n return isEmbeddedApp()\n ? parentFrameSync<S, M, E, MenuT>({ debug: options?.debug })\n : multiplayerUrl\n ? webSocketSync<S, M, E, MenuT>(multiplayerUrl)\n : options?.offlineStorageKey\n ? localStorageSync<S, M, E, MenuT>({ key: options.offlineStorageKey })\n : stubSync<S, M, E, MenuT>();\n }, [multiplayerUrl, options?.offlineStorageKey, options?.debug]);\n\n const result = useMultiplayerState(noyaAppInitialState as S, {\n ...options,\n inspector: options?.inspector ?? inspector,\n sync: options?.sync ?? sync,\n });\n\n const [, , extras] = result;\n\n const mergedExtras = useMemo(() => {\n return { ...extras, theme, viewType } as const;\n }, [extras, theme, viewType]);\n\n return [result[0], result[1], mergedExtras] as UseNoyaStateResult<\n O[\"schema\"] extends TSchema ? Static<O[\"schema\"]> : S,\n M,\n E,\n MenuT\n >;\n}\n\n// function typeTest() {\n// const [a, setA] = useNoyaState(7);\n// const [b, setB] = useNoyaState(7, {\n// schema: Type.Number(),\n// });\n// const [c, setC] = useNoyaState({\n// schema: Type.Number(),\n// });\n// }\n","import {\n GetAtPath,\n Observable,\n ObservableOptions,\n PathKey,\n} from \"@noya-app/observable\";\nimport {\n ConnectedUsersManager,\n EphemeralUserDataManager,\n MultiplayerStateManager,\n NoyaManager,\n StateManagerOptions,\n Static,\n TSchema,\n} from \"@noya-app/state-manager\";\nimport React, {\n createContext,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n} from \"react\";\nimport { useNoyaState, UseNoyaStateOptions } from \"./noyaApp\";\nimport { useObservable } from \"./useObservable\";\n\ninterface NoyaStateProviderProps<\n S,\n M extends object,\n E extends object,\n MenuT extends string,\n> extends Omit<\n UseNoyaStateOptions<S, M, E, MenuT>,\n \"schema\" | \"mergeHistoryEntries\"\n > {\n children: React.ReactNode;\n initialState?: S;\n fallback?: React.ReactNode;\n}\n\nconst AnyNoyaStateContext = createContext<\n NoyaManager<any, any, any, any> | undefined\n>(undefined);\n\nfunction useAnyNoyaStateContext() {\n const value = useContext(AnyNoyaStateContext);\n\n if (!value) {\n throw new Error(\n \"useNoyaStateContext must be used within a NoyaStateProvider\"\n );\n }\n\n return value;\n}\n\nexport function useAssets() {\n const { assetManager } = useAnyNoyaStateContext();\n return useObservable(assetManager.assets$);\n}\n\nexport function useAsset(id: string | undefined) {\n const { assetManager } = useAnyNoyaStateContext();\n const observable = useMemo(\n () => assetManager.assets$.map((assets) => assets.find((a) => a.id === id)),\n [assetManager, id]\n );\n return useObservable(observable);\n}\n\nexport function useAssetManager() {\n const { assetManager } = useAnyNoyaStateContext();\n return useMemo(\n () => ({\n create: assetManager.create,\n delete: assetManager.delete,\n }),\n [assetManager]\n );\n}\n\nexport function useAIManager() {\n const { aiManager } = useAnyNoyaStateContext();\n return aiManager;\n}\n\nexport function useSecretManager() {\n const { secretManager } = useAnyNoyaStateContext();\n return secretManager;\n}\n\nexport function useSecrets() {\n const { secretManager } = useAnyNoyaStateContext();\n return useObservable(secretManager.secrets$);\n}\n\nexport function useSecret(name: string) {\n const { secretManager } = useAnyNoyaStateContext();\n\n return useObservable(\n secretManager.secrets$,\n useCallback((secrets) => secrets.find((s) => s.name === name), [name])\n );\n}\n\nexport function useIsInitialized() {\n const {\n multiplayerStateManager: ms,\n secretManager,\n assetManager,\n } = useAnyNoyaStateContext();\n\n const isInitializedObservable = useMemo(\n () =>\n Observable.combine(\n [\n ms.isInitialized$,\n secretManager.isInitialized$,\n assetManager.isInitialized$,\n ],\n (values) => values.every((v) => v)\n ),\n [ms, secretManager, assetManager]\n );\n\n return useObservable(isInitializedObservable);\n}\n\nexport function useWorkflowManager() {\n const { workflowManager } = useAnyNoyaStateContext();\n return workflowManager;\n}\n\nexport const ConnectedUsersContext = createContext<\n ConnectedUsersManager | undefined\n>(undefined);\n\nexport function useConnectedUsersManager() {\n return useContext(ConnectedUsersContext);\n}\n\nexport const AnyEphemeralUserDataManagerContext = createContext<\n EphemeralUserDataManager<object> | undefined\n>(undefined);\n\nexport function useAnyEphemeralUserData() {\n return useContext(AnyEphemeralUserDataManagerContext);\n}\n\nexport function useCurrentUserId() {\n const connectedUsersManager = useConnectedUsersManager();\n return useObservable(connectedUsersManager?.currentUserId$);\n}\n\nexport const FallbackUntilInitialized = ({\n children,\n fallback,\n}: {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}) => {\n const isInitialized = useIsInitialized();\n\n return isInitialized ? children : fallback ?? null;\n};\n\nexport function createNoyaContext<\n Schema extends TSchema,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n>({\n schema,\n mergeHistoryEntries,\n}: {\n schema: Schema;\n mergeHistoryEntries?: StateManagerOptions<\n Static<Schema>,\n M\n >[\"mergeHistoryEntries\"];\n}) {\n type S = Static<Schema>;\n\n const NoyaStateContext = AnyNoyaStateContext as React.Context<\n NoyaManager<S, M, E> | undefined\n >;\n\n const EphemeralUserDataManagerContext =\n AnyEphemeralUserDataManagerContext as React.Context<\n EphemeralUserDataManager<E> | undefined\n >;\n\n function NoyaStateProvider({\n children,\n initialState,\n ...options\n }: NoyaStateProviderProps<S, M, E, MenuT>) {\n const [, , { noyaManager }] = useNoyaState<S, M, E, MenuT>(initialState, {\n ...(options as any),\n schema,\n mergeHistoryEntries,\n });\n\n return (\n <AnyNoyaStateContext.Provider value={noyaManager}>\n <ConnectedUsersContext.Provider\n value={noyaManager.connectedUsersManager}\n >\n <EphemeralUserDataManagerContext.Provider\n value={noyaManager.ephemeralUserDataManager}\n >\n {options.fallback !== undefined ? (\n <FallbackUntilInitialized fallback={options.fallback}>\n {children}\n </FallbackUntilInitialized>\n ) : (\n children\n )}\n </EphemeralUserDataManagerContext.Provider>\n </ConnectedUsersContext.Provider>\n </AnyNoyaStateContext.Provider>\n );\n }\n\n function useValue(): S;\n function useValue<A>(\n selector: (value: S) => A,\n options?: Pick<ObservableOptions, \"isEqual\">\n ): A;\n function useValue<P extends PathKey[] | string>(path: P): GetAtPath<S, P>;\n function useValue(\n path?: PathKey[] | string | ((value: S) => any),\n options?: Pick<ObservableOptions, \"isEqual\">\n ) {\n const { multiplayerStateManager: ms } = useAnyNoyaStateContext();\n\n let actualPath: PathKey[] | string =\n typeof path === \"function\" || !path ? \"\" : path;\n\n const mappedObservable = useMemo(() => {\n if (typeof path === \"function\") {\n return ms.optimisticState$.map(path, { isEqual: options?.isEqual });\n }\n return ms.optimisticState$;\n }, [ms, path, options?.isEqual]);\n\n const value = useObservable(mappedObservable, actualPath);\n\n return value;\n }\n\n function useSetValue(): (\n ...args:\n | [metadata: M, value: SetStateAction<S>]\n | [value: SetStateAction<S>]\n ) => void;\n function useSetValue<P extends PathKey[] | string>(\n path: P\n ): (\n ...args:\n | [metadata: M, value: SetStateAction<GetAtPath<S, P>>]\n | [value: SetStateAction<GetAtPath<S, P>>]\n ) => void;\n function useSetValue<P extends PathKey[] | string>(path?: P) {\n const { multiplayerStateManager: ms } = useAnyNoyaStateContext();\n\n const setValue = useCallback(\n (\n ...args:\n | [metadata: M, value: SetStateAction<GetAtPath<S, P>>]\n | [value: SetStateAction<GetAtPath<S, P>>]\n ): void => {\n const [metadata, value] = args.length === 2 ? args : [{}, args[0]];\n\n ms.setStateAtPath(metadata, (path ?? \"\") as P, value as never);\n },\n [ms, path]\n );\n\n return setValue;\n }\n\n function useValueState(): [\n S,\n (\n ...args:\n | [metadata: M, value: SetStateAction<S>]\n | [value: SetStateAction<S>]\n ) => void,\n ];\n function useValueState<A>(\n selector: (value: S) => A,\n options?: ObservableOptions\n ): [\n A,\n (\n ...args:\n | [metadata: M, value: SetStateAction<S>]\n | [value: SetStateAction<S>]\n ) => void,\n ];\n function useValueState<P extends PathKey[] | string>(\n path?: P\n ): [\n GetAtPath<S, P>,\n (\n ...args:\n | [metadata: M, value: SetStateAction<GetAtPath<S, P>>]\n | [value: SetStateAction<GetAtPath<S, P>>]\n ) => void,\n ];\n function useValueState<P extends PathKey[] | string>(\n ...args: [P?] | [selector: (value: S) => any, options?: ObservableOptions]\n ) {\n const [selector, options, path] =\n args.length >= 1 && typeof args[0] === \"function\"\n ? [args[0], args[1], undefined]\n : [undefined, undefined, args[0] as P | undefined];\n\n const value = useValue((selector ?? path ?? \"\") as any, options);\n const setValue = useSetValue(path ?? \"\");\n return [value, setValue];\n }\n\n function useStateManager() {\n const { multiplayerStateManager: ms } = useAnyNoyaStateContext();\n\n return ms as MultiplayerStateManager<S, M>;\n }\n\n function useEphemeralUserDataManager() {\n const ephemeralUserData = useContext(EphemeralUserDataManagerContext);\n\n if (!ephemeralUserData) {\n throw new Error(\n \"useEphemeralUserData must be used within a NoyaStateProvider\"\n );\n }\n\n return ephemeralUserData;\n }\n\n function useNoyaManager() {\n return useAnyNoyaStateContext() as NoyaManager<S, M, E, MenuT>;\n }\n\n function useLeftMenuItems() {\n const { menuManager } = useNoyaManager();\n return useObservable(menuManager.leftMenuItems$);\n }\n\n function useRightMenuItems() {\n const { menuManager } = useNoyaManager();\n return useObservable(menuManager.rightMenuItems$);\n }\n\n function useHandleMenuItem(callback: (type: MenuT) => void) {\n const { menuManager } = useNoyaManager();\n\n useEffect(() => {\n return menuManager.addListener(callback);\n }, [menuManager, callback]);\n }\n\n function useOnSelectMenuItemCallback(): (type: MenuT) => void {\n const { menuManager } = useNoyaManager();\n\n return useCallback((type: MenuT) => menuManager.emit(type), [menuManager]);\n }\n\n return {\n Context: NoyaStateContext,\n Provider: NoyaStateProvider,\n useValue,\n useSetValue,\n useValueState,\n useStateManager,\n useEphemeralUserDataManager,\n useLeftMenuItems,\n useRightMenuItems,\n useHandleMenuItem,\n useOnSelectMenuItemCallback,\n useNoyaManager,\n };\n}\n","import {\n ClientToServerMessage,\n MultiplayerStateManagerError,\n ReconnectingWebSocket,\n ReconnectingWebSocketState,\n ServerToClientMessage,\n UserActivityDetector,\n} from \"@noya-app/state-manager\";\n\nexport type ConnectionEvent<State> =\n | {\n type: \"stateChange\";\n state: ReconnectingWebSocketState;\n }\n | {\n type: \"send\";\n message: ClientToServerMessage<State>;\n }\n | {\n type: \"receive\";\n message: ServerToClientMessage<State>;\n }\n | {\n type: \"error\";\n error: MultiplayerStateManagerError;\n };\n\nexport type ConnectionOptions<State> = {\n debug?: boolean;\n onConnectionEvent?: (event: ConnectionEvent<State>) => void;\n};\n\nexport class WebSocketConnection<State> {\n private ws: ReconnectingWebSocket;\n private pingCount = 0;\n private pendingPingId?: string;\n private intervalId?: NodeJS.Timer;\n\n constructor(\n private url: URL,\n private options: ConnectionOptions<State> = {}\n ) {\n this.ws = new ReconnectingWebSocket({\n debug: options.debug,\n onopen: this.handleOpen,\n onmessage: this.handleMessage,\n onclose: this.handleClose,\n activityDetector: new UserActivityDetector(),\n });\n }\n\n async connect() {\n this.ws.connect(this.url.toString());\n\n // Start ping interval\n this.intervalId = setInterval(() => {\n if (this.ws.state !== \"OPEN\") return;\n\n // A response to a previous ping hasn't been received, so we'll reset the connection\n if (this.pendingPingId) {\n this.ws.close();\n return;\n }\n\n const pingId = (this.pingCount++).toString();\n\n const message: ClientToServerMessage<State> = {\n type: \"ping\",\n id: pingId,\n };\n\n this.pendingPingId = message.id;\n\n this.options.onConnectionEvent?.({\n type: \"send\",\n message,\n });\n\n this.ws.send(JSON.stringify(message));\n }, 10000);\n }\n\n private handleOpen = () => {\n this.pendingPingId = undefined;\n\n if (this.options.debug) {\n console.info(\"ws connected\");\n }\n\n this.options.onConnectionEvent?.({\n type: \"stateChange\",\n state: \"OPEN\",\n });\n };\n\n private handleMessage = (event: MessageEvent) => {\n if (this.options.debug) {\n console.info(\"ws receiving message \", event.data);\n }\n\n const parsed = JSON.parse(event.data) as ServerToClientMessage<State>;\n\n this.options.onConnectionEvent?.({\n type: \"receive\",\n message: parsed,\n });\n\n if (parsed.type === \"pong\" && parsed.id === this.pendingPingId) {\n this.pendingPingId = undefined;\n }\n };\n\n private handleClose = () => {\n this.pendingPingId = undefined;\n\n if (this.options.debug) {\n console.info(\"ws disconnected\");\n }\n\n this.options.onConnectionEvent?.({\n type: \"stateChange\",\n state: \"CLOSED\",\n });\n };\n\n send(message: ClientToServerMessage<State>) {\n if (this.options.debug) {\n console.info(\"ws sending message\", message);\n }\n\n this.options.onConnectionEvent?.({\n type: \"send\",\n message,\n });\n\n this.ws.send(JSON.stringify(message));\n }\n\n close() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n this.ws.shutdown();\n }\n\n addListener(listener: (state: ReconnectingWebSocketState) => void) {\n return this.ws.addListener(listener);\n }\n\n removeListener(listener: (state: ReconnectingWebSocketState) => void) {\n return this.ws.removeListener(listener);\n }\n}\n"],"mappings":"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","names":["listen","get","UserPointerInternal","createElement","useEffect","useMemo","useState","useSyncExternalStore","createRoot","React","ErrorOverlay","React","useLayoutEffect","memoGeneric","React","useEffect","React","React","memoGeneric","StateInspector","useEffect","React","useLayoutEffect","root","useSyncExternalStore","useState","useMemo","useEffect","createRoot","createElement","stubSync","useMemo","useState","window","useState","useMemo","stubSync","React","useCallback","useEffect","useMemo","useMemo","useCallback","React","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/UserPointersOverlay.tsx","../src/useObservable.ts","../src/hooks.ts","../src/components/ErrorOverlay.tsx","../src/inspector/useStateInspector.tsx","../src/inspector/StateInspector.tsx","../src/inspector/useLocalStorageState.tsx","../src/noyaApp.ts","../src/NoyaStateContext.tsx","../src/WebSocketConnection.ts"],"sourcesContent":["export * from \"@noya-app/state-manager\";\nexport * from \"./components/UserPointersOverlay\";\nexport * from \"./hooks\";\nexport * from \"./inspector/StateInspector\";\nexport * from \"./noyaApp\";\nexport * from \"./NoyaStateContext\";\nexport * from \"./useObservable\";\nexport { WebSocketConnection } from \"./WebSocketConnection\";\nexport type { ConnectionEvent, ConnectionOptions } from \"./WebSocketConnection\";\n","\"use client\";\n\nimport { memoGeneric } from \"@noya-app/react-utils\";\nimport {\n ConnectedUsersManager,\n EphemeralUserDataManager,\n MultiplayerUser,\n} from \"@noya-app/state-manager\";\nimport React, { useEffect, useState } from \"react\";\nimport { useObservable } from \"../useObservable\";\ntype Point = { x: number; y: number };\n\nexport type UserPointerData = { pointer?: Point };\n\nexport type RenderUserPointerProps = {\n userId: string;\n name?: string;\n visible: boolean;\n point: Point;\n};\n\nexport type RenderUserPointer = {\n renderUserPointer: (options: RenderUserPointerProps) => React.ReactNode;\n};\n\ntype InternalUserPointerProps<E extends UserPointerData> = {\n user: MultiplayerUser;\n ephemeralUserDataManager: EphemeralUserDataManager<E>;\n hideAfter?: number;\n} & RenderUserPointer;\n\nfunction shouldShow(hideAfter: number, updatedAt: number) {\n return !!updatedAt && Date.now() - updatedAt < hideAfter;\n}\n\nconst UserPointerInternal = memoGeneric(function UserPointerInternal<\n E extends UserPointerData,\n>({\n user,\n ephemeralUserDataManager,\n hideAfter = 5000,\n renderUserPointer,\n}: InternalUserPointerProps<E>) {\n const metadata = useObservable(ephemeralUserDataManager.metadata$, [\n user.id,\n ] as const);\n const data = useObservable(ephemeralUserDataManager.data$, [\n user.id,\n ] as const);\n\n const [, setForceUpdate] = useState(0);\n\n const updatedAt = metadata?.updatedAt ?? 0;\n const show = shouldShow(hideAfter, updatedAt);\n\n useEffect(() => {\n if (!show) return;\n\n const timeoutId = setTimeout(() => {\n setForceUpdate((prev) => prev + 1);\n }, hideAfter);\n\n return () => clearTimeout(timeoutId);\n }, [hideAfter, show, updatedAt]);\n\n if (!data?.pointer) return null;\n\n return renderUserPointer({\n userId: user.id,\n name: user.name,\n point: data.pointer,\n visible: show,\n });\n});\n\nexport type UserPointersOverlayProps<E extends UserPointerData> = {\n connectedUsersManager: ConnectedUsersManager;\n ephemeralUserDataManager: EphemeralUserDataManager<E>;\n} & RenderUserPointer;\n\nexport const UserPointersOverlay = memoGeneric(function UserPointers<\n E extends UserPointerData,\n>({\n connectedUsersManager,\n ephemeralUserDataManager,\n renderUserPointer,\n}: UserPointersOverlayProps<E>) {\n const currentUserId = useObservable(ephemeralUserDataManager.currentUserId$);\n const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);\n\n return (\n <>\n {connectedUsers.map((user) => {\n if (user.id === currentUserId) return null;\n\n return (\n <UserPointerInternal\n key={user.id}\n user={user}\n ephemeralUserDataManager={\n ephemeralUserDataManager as unknown as EphemeralUserDataManager<UserPointerData>\n }\n renderUserPointer={renderUserPointer}\n />\n );\n })}\n </>\n );\n});\n","import {\n GetAtPath,\n Observable,\n ObservableOptions,\n PathKey,\n} from \"@noya-app/observable\";\nimport { useMemo, useSyncExternalStore } from \"react\";\n\n// Overloads for when observable is definitely defined\nexport function useObservable<T>(observable: Observable<T>): T;\nexport function useObservable<T, A>(\n observable: Observable<T>,\n selector: (value: T) => A,\n options?: Pick<ObservableOptions, \"isEqual\">\n): A;\nexport function useObservable<T, P extends PathKey[] | string>(\n observable: Observable<T>,\n path: P\n): GetAtPath<T, P>;\n\n// Overloads for when observable might be undefined\nexport function useObservable<T>(\n observable: Observable<T> | undefined\n): T | undefined;\nexport function useObservable<T, A>(\n observable: Observable<T> | undefined,\n selector: (value: T) => A,\n options?: Pick<ObservableOptions, \"isEqual\">\n): A | undefined;\nexport function useObservable<T, P extends PathKey[] | string>(\n observable: Observable<T> | undefined,\n path: P\n): GetAtPath<T, P> | undefined;\n\n// Implementation\nexport function useObservable<T, P extends PathKey[]>(\n observable: Observable<T> | undefined,\n pathOrSelector?: P | ((value: T) => any),\n options?: Pick<ObservableOptions, \"isEqual\">\n) {\n const { get, listen } = useMemo(() => {\n if (!observable) {\n return {\n get: () => undefined,\n listen: () => () => {},\n };\n }\n\n if (typeof pathOrSelector === \"function\") {\n const mappedObservable = observable.map(pathOrSelector, {\n isEqual: options?.isEqual,\n });\n return {\n get: mappedObservable.get,\n listen: mappedObservable.subscribe,\n };\n }\n\n const listen = pathOrSelector\n ? (callback: (value: GetAtPath<T, P>) => void) =>\n observable.subscribe(pathOrSelector, callback)\n : observable.subscribe;\n\n const get: () => void = pathOrSelector\n ? () => observable.get(pathOrSelector)\n : observable.get;\n\n return { get, listen };\n }, [observable, pathOrSelector, options?.isEqual]);\n\n return useSyncExternalStore(listen, get, get);\n}\n","\"use client\";\n\nimport { GetAtPath } from \"@noya-app/observable\";\nimport {\n ActionHandler,\n MultiplayerStateManagerOptions,\n NoyaManager,\n StateManager,\n StateManagerOptions,\n stubSync,\n SyncAdapter,\n} from \"@noya-app/state-manager\";\nimport {\n createElement,\n SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { ErrorOverlay } from \"./components/ErrorOverlay\";\nimport { StateInspectorOptions } from \"./inspector/StateInspector\";\nimport { useStateInspector } from \"./inspector/useStateInspector\";\nimport { useObservable } from \"./useObservable\";\n\nexport function useSyncStateManager<S, M>(stateManager: StateManager<S, M>): S;\nexport function useSyncStateManager<S, M, P extends string>(\n stateManager: StateManager<S, M>,\n path: P\n): GetAtPath<S, P>;\nexport function useSyncStateManager<S, M>(\n stateManager: StateManager<S, M>,\n path?: string\n) {\n const getSnapshot = useCallback(\n () =>\n typeof path === \"string\"\n ? stateManager.getState(path)\n : stateManager.getState(),\n [stateManager, path]\n );\n\n return useSyncExternalStore(\n stateManager.addListener,\n getSnapshot,\n getSnapshot\n );\n}\n\nexport function useManagedState<S, M = void>(\n createInitialState: () => S,\n options?: StateManagerOptions<S, M>\n) {\n const [stateManager] = useState(\n () => new StateManager<S, M>(createInitialState(), options)\n );\n\n const state = useSyncStateManager(stateManager);\n\n const setState = useCallback(\n (\n ...args: M extends {}\n ? [metadata: M, action: SetStateAction<S>]\n : [action: SetStateAction<S>]\n ) => {\n const [metadata, action] =\n args.length === 1 ? [undefined, args[0]] : args;\n\n if (metadata === undefined) {\n const performActionNoMetadata = stateManager.performAction as (\n handler: ActionHandler<S>\n ) => void;\n\n if (action instanceof Function) {\n performActionNoMetadata({\n run: action,\n undo: () => state,\n });\n } else {\n performActionNoMetadata({\n run: () => action,\n undo: () => state,\n });\n }\n } else {\n const performActionWithMetadata = stateManager.performAction as (\n metadata: M,\n handler: ActionHandler<S>\n ) => void;\n\n if (action instanceof Function) {\n performActionWithMetadata(metadata, {\n run: action,\n undo: () => state,\n });\n } else {\n performActionWithMetadata(metadata, {\n run: () => action,\n undo: () => state,\n });\n }\n }\n },\n [state, stateManager]\n );\n\n return [state, setState, stateManager] as const;\n}\n\nexport function useManagedHistory<S, M = void>(\n stateManager: StateManager<S, M>\n) {\n return useSyncExternalStore(\n stateManager.historyEmittor.addListener,\n stateManager.getHistorySnapshot,\n stateManager.getHistorySnapshot\n );\n}\n\nexport type UseMultiplayerStateOptions<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n> = MultiplayerStateManagerOptions<S, M> & {\n sync?: SyncAdapter<S, M, E, MenuT>;\n inspector?: boolean | StateInspectorOptions;\n};\n\nconst defaultStubSync = stubSync<unknown, object, object, string>();\n\nexport function useMultiplayerState<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n>(\n initialState: S | (() => S),\n options?: UseMultiplayerStateOptions<S, M, E, MenuT>\n) {\n const {\n sync = defaultStubSync as unknown as SyncAdapter<S, M, E, MenuT>,\n inspector,\n ...rest\n } = options ?? {};\n\n const [noyaManager] = useState(\n () => new NoyaManager<S, M, E, MenuT>(initialState, rest)\n );\n\n const state = useObservable(\n noyaManager.multiplayerStateManager.optimisticState$\n );\n const assets = useObservable(noyaManager.assetManager.assets$);\n\n type ExtrasType = {\n noyaManager: typeof noyaManager;\n taskManager: typeof noyaManager.taskManager;\n connectionEventManager: typeof noyaManager.connectionEventManager;\n connectedUsersManager: typeof noyaManager.connectedUsersManager;\n ephemeralUserDataManager: typeof noyaManager.ephemeralUserDataManager;\n multiplayerStateManager: typeof noyaManager.multiplayerStateManager;\n assetManager: typeof noyaManager.assetManager;\n aiManager: typeof noyaManager.aiManager;\n rpcManager: typeof noyaManager.rpcManager;\n workflowManager: typeof noyaManager.workflowManager;\n secretManager: typeof noyaManager.secretManager;\n menuItemsManager: typeof noyaManager.menuManager;\n createAsset: typeof noyaManager.assetManager.create;\n deleteAsset: typeof noyaManager.assetManager.delete;\n assets: typeof assets;\n };\n\n const extras = useMemo<ExtrasType>(() => {\n return {\n noyaManager,\n taskManager: noyaManager.taskManager,\n connectionEventManager: noyaManager.connectionEventManager,\n connectedUsersManager: noyaManager.connectedUsersManager,\n ephemeralUserDataManager: noyaManager.ephemeralUserDataManager,\n multiplayerStateManager: noyaManager.multiplayerStateManager,\n assetManager: noyaManager.assetManager,\n aiManager: noyaManager.aiManager,\n rpcManager: noyaManager.rpcManager,\n workflowManager: noyaManager.workflowManager,\n secretManager: noyaManager.secretManager,\n menuItemsManager: noyaManager.menuManager,\n createAsset: noyaManager.assetManager.create,\n deleteAsset: noyaManager.assetManager.delete,\n assets,\n };\n }, [noyaManager, assets]);\n\n const syncRef = useRef(sync);\n\n useEffect(() => {\n if (syncRef.current) {\n return syncRef.current({ noyaManager });\n }\n }, [noyaManager]);\n\n useErrorOverlay<MenuT>(noyaManager);\n\n useStateInspector<S, M, E, MenuT>({\n noyaManager,\n disabled: !inspector,\n ...(typeof inspector === \"object\" && inspector),\n });\n\n return [state, noyaManager.multiplayerStateManager.setState, extras] as const;\n}\n\nfunction useErrorOverlay<MenuT extends string = string>(\n noyaManager: NoyaManager<any, any, any, MenuT>\n) {\n const unrecoverableError = useObservable(noyaManager.unrecoverableError);\n\n useEffect(() => {\n if (!unrecoverableError) return;\n const el = document.createElement(\"div\");\n el.id = \"noya-multiplayer-react-error-overlay\";\n document.body.appendChild(el);\n const root = createRoot(el);\n root.render(createElement(ErrorOverlay, { error: unrecoverableError }));\n return () => {\n root.unmount();\n el.remove();\n };\n });\n}\n","import { MultiplayerStateManagerError } from \"@noya-app/state-manager\";\nimport * as React from \"react\";\n\nexport const ErrorOverlay = React.memo(function ErrorOverlay({\n error,\n}: {\n error: MultiplayerStateManagerError;\n}) {\n return (\n <div\n style={{\n position: \"fixed\",\n top: \"20px\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n maxWidth: \"80%\",\n width: \"fit-content\",\n padding: \"12px 20px\",\n background: \"white\",\n color: \"black\",\n zIndex: 10000,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n fontFamily:\n \"'__Inter_6b0edc', '__Inter_Fallback_6b0edc', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"19px\",\n }}\n >\n {error.reason === \"schemaMigration\" ? (\n <>\n <p>\n An updated version of Noya is available. Please reload the page to\n continue.\n </p>\n </>\n ) : (\n <>\n <p>\n An error occurred:{\" \"}\n <code\n style={{\n background: \"rgba(255, 0, 0, 0.1)\",\n color: \"rgba(255, 0, 0, 0.5)\",\n padding: \"2px 4px\",\n borderRadius: \"4px\",\n }}\n >\n {error.reason}\n </code>\n . Please reload the page to continue.\n <br />\n <br />\n If this happens repeatedly, please get in touch and the Noya team\n can help.\n </p>\n </>\n )}\n <div\n style={{\n height: \"1px\",\n background: \"rgba(0, 0, 0, 0.1)\",\n margin: \"12px -20px\",\n }}\n />\n <button\n style={{\n background: \"black\",\n color: \"white\",\n padding: \"8px 16px\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n fontWeight: 700,\n lineHeight: \"19px\",\n }}\n onClick={() => {\n window.location.reload();\n }}\n >\n Reload\n </button>\n </div>\n );\n});\n","\"use client\";\n\nimport { NoyaManager } from \"@noya-app/state-manager\";\nimport React, { ComponentProps, useLayoutEffect } from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { Root } from \"react-dom/client\";\nimport { StateInspector } from \"./StateInspector\";\n\nfunction createShadowRootElement() {\n const host = document.createElement(\"div\");\n host.id = \"noya-multiplayer-react-inspector-host\";\n const shadowRoot = host.attachShadow({ mode: \"open\" });\n const container = document.createElement(\"div\");\n shadowRoot.appendChild(container);\n return { host, container };\n}\n\nexport function useStateInspector<\n S,\n M extends object,\n E extends object,\n MenuT extends string = string,\n>({\n noyaManager,\n disabled = false,\n colorScheme,\n anchor,\n}: {\n noyaManager: NoyaManager<S, M, E, MenuT>;\n disabled: boolean;\n} & Pick<ComponentProps<typeof StateInspector>, \"colorScheme\" | \"anchor\">) {\n const [root, setRoot] = React.useState<Root | null>(null);\n\n useLayoutEffect(() => {\n if (disabled) return;\n\n const { host, container } = createShadowRootElement();\n const root = createRoot(container);\n\n document.body.appendChild(host);\n\n setRoot(root);\n\n return () => {\n document.body.removeChild(host);\n };\n }, [disabled]);\n\n useLayoutEffect(() => {\n if (!root) return;\n\n root.render(\n <StateInspector\n colorScheme={colorScheme}\n anchor={anchor}\n noyaManager={noyaManager}\n />\n );\n }, [noyaManager, anchor, colorScheme, root]);\n}\n","\"use client\";\n\nimport { memoGeneric } from \"@noya-app/react-utils\";\nimport { ExtendedPathKey, NoyaManager } from \"@noya-app/state-manager\";\nimport React, {\n CSSProperties,\n ComponentPropsWithoutRef,\n FC,\n useEffect,\n useLayoutEffect,\n} from \"react\";\nimport {\n ObjectInspector,\n ObjectLabel,\n ObjectName,\n ObjectPreview,\n chromeDark,\n chromeLight,\n} from \"react-inspector\";\nimport { useManagedHistory } from \"../hooks\";\nimport { useObservable } from \"../useObservable\";\nimport { useLocalStorageState } from \"./useLocalStorageState\";\n\nconst lightTheme = {\n ...chromeLight,\n BASE_BACKGROUND_COLOR: \"transparent\",\n OBJECT_NAME_COLOR: \"rgba(0,0,0,0.7)\",\n} as any;\n\nconst darkTheme = {\n ...chromeDark,\n BASE_BACKGROUND_COLOR: \"transparent\",\n OBJECT_NAME_COLOR: \"rgba(255,255,255,0.7)\",\n} as any;\n\nconst styles = {\n sectionInner: {\n flex: \"1 1 0\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n },\n} as const;\n\nfunction ToggleButton({\n showInspector,\n setShowInspector,\n theme,\n anchor,\n}: {\n showInspector: boolean;\n setShowInspector: (value: boolean) => void;\n theme: typeof chromeLight;\n anchor: StateInspectorAnchor;\n}) {\n return (\n <span\n role=\"button\"\n style={{\n flex: \"0\",\n appearance: \"none\",\n color: theme.BASE_COLOR,\n border: \"none\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px 0\",\n }}\n onClick={(event) => {\n event.stopPropagation();\n\n setShowInspector(!showInspector);\n }}\n >\n <span style={{ width: \"12px\", height: \"12px\" }}>\n {showInspector === (anchor === \"right\") ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"size-6\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m5.25 4.5 7.5 7.5-7.5 7.5m6-15 7.5 7.5-7.5 7.5\"\n />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"size-6\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m18.75 4.5-7.5 7.5 7.5 7.5m-6-15L5.25 12l7.5 7.5\"\n />\n </svg>\n )}\n </span>\n </span>\n );\n}\n\nfunction DisclosureSection({\n open,\n setOpen,\n title,\n right,\n children,\n colorScheme,\n isFirst,\n style,\n}: {\n open: boolean;\n setOpen?: (value: boolean) => void;\n title: React.ReactNode;\n right?: React.ReactNode;\n children: React.ReactNode;\n colorScheme: \"light\" | \"dark\";\n isFirst?: boolean;\n style?: CSSProperties;\n}) {\n const theme = colorScheme === \"light\" ? lightTheme : darkTheme;\n\n const borderColor =\n colorScheme === \"light\" ? \"rgba(0,0,0,0.1)\" : \"rgba(255,255,255,0.1)\";\n\n return (\n <div\n style={{\n flex: open ? \"1 1 0\" : \"0\",\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n >\n <div\n onClick={() => setOpen?.(!open)}\n style={{\n cursor: \"default\",\n fontSize: \"12px\",\n padding: \"4px 10px\",\n display: \"flex\",\n alignItems: \"center\",\n ...(!isFirst && { borderTop: `1px solid ${borderColor}` }),\n ...(open && { borderBottom: `1px solid ${borderColor}` }),\n }}\n >\n {setOpen && (\n <Arrow\n expanded={open}\n style={{\n fontSize: theme.ARROW_FONT_SIZE,\n marginRight: theme.ARROW_MARGIN_RIGHT + 1,\n color: theme.ARROW_COLOR,\n }}\n />\n )}\n <span style={{ flex: \"1 1 0\", userSelect: \"none\" }}>{title}</span>\n {right}\n </div>\n {open && children}\n </div>\n );\n}\n\nfunction InspectorRow({\n children,\n colorScheme,\n selected,\n style,\n variant,\n}: {\n children: React.ReactNode;\n colorScheme: \"light\" | \"dark\";\n selected?: boolean;\n style?: CSSProperties;\n variant?: \"up\" | \"down\";\n}) {\n const solidBorderColor =\n colorScheme === \"light\" ? \"rgb(223 223 223)\" : \"rgb(29 29 29)\";\n\n return (\n <div\n style={{\n borderBottom: `1px solid ${solidBorderColor}`,\n fontSize: \"12px\",\n fontFamily: \"Menlo, monospace\",\n padding: \"2px 12px 1px\",\n display: \"flex\",\n alignItems: \"center\",\n background:\n variant === \"up\"\n ? \"rgba(0,255,0,0.1)\"\n : variant === \"down\"\n ? \"transparent\"\n : selected\n ? \"rgb(59 130 246 / 15%)\"\n : undefined,\n // background:\n // colorScheme === \"light\"\n // ? \"rgba(0,0,0,0.05)\"\n // : \"rgba(255,255,255,0.05)\",\n ...style,\n }}\n >\n <span\n style={{\n fontFamily: \"Menlo, monospace\",\n fontSize: \"11px\",\n borderRadius: 4,\n display: \"inline-block\",\n }}\n >\n {children}\n </span>\n </div>\n );\n}\n\nconst HISTORY_ELEMENT_PREFIX = \"noya-multiplayer-history-\";\n\nexport type StateInspectorAnchor =\n | \"left\"\n | \"right\"\n | \"bottom left\"\n | \"bottom right\";\n\nexport type StateInspectorOptions = {\n colorScheme?: \"light\" | \"dark\";\n anchor?: StateInspectorAnchor;\n};\n\nexport const StateInspector = memoGeneric(function StateInspector<\n S,\n M extends object,\n E extends object,\n MenuT extends string = string,\n>({\n noyaManager,\n colorScheme = \"light\",\n anchor = \"right\",\n unstyled = false,\n ...props\n}: {\n noyaManager: NoyaManager<S, M, E, MenuT>;\n unstyled?: boolean;\n} & StateInspectorOptions &\n ComponentPropsWithoutRef<\"div\">) {\n const {\n multiplayerStateManager,\n assetManager,\n connectedUsersManager,\n secretManager,\n ephemeralUserDataManager,\n connectionEventManager,\n taskManager,\n } = noyaManager;\n\n const [didMount, setDidMount] = React.useState(false);\n const tasks = useObservable(taskManager.tasks$);\n\n useLayoutEffect(() => {\n setDidMount(true);\n }, []);\n\n const eventsContainerRef = React.useRef<HTMLDivElement>(null);\n const historyContainerRef = React.useRef<HTMLDivElement>(null);\n\n const [showInspector, setShowInspector] = useLocalStorageState(\n \"noya-multiplayer-react-show-inspector\",\n true\n );\n const [showEvents, setShowEvents] = useLocalStorageState(\n \"noya-multiplayer-react-show-events\",\n false\n );\n const [showHistory, setShowHistory] = useLocalStorageState(\n \"noya-multiplayer-react-show-history\",\n false\n );\n const [showUsers, setShowUsers] = useLocalStorageState(\n \"noya-multiplayer-react-show-users\",\n true\n );\n const [showData, setShowData] = useLocalStorageState(\n \"noya-multiplayer-react-show-data\",\n true\n );\n const [showTasks, setShowTasks] = useLocalStorageState(\n \"noya-multiplayer-react-show-tasks\",\n false\n );\n const [showEphemeral, setShowEphemeral] = useLocalStorageState(\n \"noya-multiplayer-react-show-ephemeral\",\n false\n );\n const [showAssets, setShowAssets] = useLocalStorageState(\n \"noya-multiplayer-react-show-assets\",\n false\n );\n const [showSecrets, setShowSecrets] = useLocalStorageState(\n \"noya-multiplayer-react-show-secrets\",\n false\n );\n\n const connectionEvents = useObservable(connectionEventManager.events$);\n\n useEffect(() => {\n if (eventsContainerRef.current) {\n eventsContainerRef.current.scrollTop =\n eventsContainerRef.current.scrollHeight;\n }\n }, [connectionEvents]);\n\n const multipeerStateInitialized = useObservable(\n multiplayerStateManager.isInitialized$\n );\n const ephemeral = useObservable(ephemeralUserDataManager.data$);\n const historySnapshot = useManagedHistory(multiplayerStateManager.sm);\n const assets = useObservable(assetManager.assets$);\n const assetsInitialized = useObservable(assetManager.isInitialized$);\n const secrets = useObservable(secretManager.secrets$);\n const secretsInitialized = useObservable(secretManager.isInitialized$);\n const connectedUsers = useObservable(connectedUsersManager.connectedUsers$);\n const userId = useObservable(connectedUsersManager.currentUserId$);\n const state = useObservable(multiplayerStateManager.optimisticState$);\n\n useEffect(() => {\n if (historyContainerRef.current) {\n historyContainerRef.current.scrollTop =\n historyContainerRef.current.scrollHeight;\n }\n }, [historySnapshot]);\n\n // If history index changes, scroll to the new history entry into view\n useEffect(() => {\n if (!historyContainerRef.current) return;\n\n const historyEntry = historyContainerRef.current.querySelector(\n `#${HISTORY_ELEMENT_PREFIX}${historySnapshot.historyIndex}`\n );\n\n if (historyEntry) {\n historyEntry.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n });\n }\n }, [historySnapshot.historyIndex]);\n\n const theme = colorScheme === \"light\" ? lightTheme : darkTheme;\n // const borderColor =\n // colorScheme === \"light\" ? \"rgba(0,0,0,0.1)\" : \"rgba(255,255,255,0.1)\";\n const solidBorderColor =\n colorScheme === \"light\" ? \"rgb(223 223 223)\" : \"rgb(29 29 29)\";\n\n const baseStyle: CSSProperties = {\n position: \"fixed\",\n top: 12,\n ...(anchor.includes(\"right\") ? { right: 12 } : { left: 12 }),\n bottom: 12,\n width: 400,\n background:\n colorScheme === \"light\" ? \"rgba(255,255,255,0.95)\" : \"rgba(0,0,0,0.95)\",\n backdropFilter: \"blur(48px)\",\n border: `1px solid ${solidBorderColor}`,\n // outlineOffset: -1,\n borderRadius: 4,\n display: \"flex\",\n flexDirection: \"column\",\n // gap: 12,\n color: theme.BASE_COLOR,\n overflow: \"hidden\",\n zIndex: 9999,\n lineHeight: \"13px\",\n };\n\n if (!didMount) return null;\n\n if (!showInspector) {\n return (\n <div\n {...props}\n style={{\n ...baseStyle,\n padding: \"4px 10px\",\n width: undefined,\n ...(anchor.includes(\"bottom\")\n ? { bottom: 12, top: undefined }\n : { bottom: undefined }),\n }}\n onClick={() => setShowInspector(true)}\n >\n <ToggleButton\n showInspector={showInspector}\n setShowInspector={setShowInspector}\n theme={theme}\n anchor={anchor}\n />\n </div>\n );\n }\n\n return (\n <div\n {...props}\n style={{\n ...(!unstyled && baseStyle),\n ...props.style,\n }}\n >\n <DisclosureSection\n isFirst\n open={showUsers}\n setOpen={setShowUsers}\n title=\"Users\"\n colorScheme={colorScheme}\n style={{\n flex: \"0 0 auto\",\n maxHeight: \"200px\",\n }}\n right={\n <ToggleButton\n showInspector={showInspector}\n setShowInspector={setShowInspector}\n theme={theme}\n anchor={anchor}\n />\n }\n >\n <div style={{ ...styles.sectionInner, flex: \"0 0 auto\" }}>\n {connectedUsers?.map((user) => (\n <InspectorRow\n key={user.id}\n colorScheme={colorScheme}\n variant={user.id === userId ? \"up\" : undefined}\n >\n {user.image && (\n <img\n src={user.image}\n alt={user.name}\n style={{\n width: \"13px\",\n height: \"13px\",\n borderRadius: \"50%\",\n marginRight: \"4px\",\n display: \"inline-block\",\n position: \"relative\",\n background: solidBorderColor,\n verticalAlign: \"middle\",\n }}\n />\n )}\n {user.name} ({ellipsis(user.id.toString(), 8, \"middle\")})\n </InspectorRow>\n ))}\n {!connectedUsers && (\n <div\n style={{\n padding: \"12px\",\n fontSize: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n }}\n >\n <span>No connected users</span>\n </div>\n )}\n </div>\n </DisclosureSection>\n <DisclosureSection\n title={\n <TitleLabel>\n Data\n <ColoredDot\n type={multipeerStateInitialized ? \"success\" : \"error\"}\n />\n </TitleLabel>\n }\n colorScheme={colorScheme}\n setOpen={setShowData}\n open={showData}\n right={\n <span\n style={{\n display: \"flex\",\n gap: \"4px\",\n }}\n >\n <SmallButton\n // disabled={!historySnapshot.canUndo}\n theme={theme}\n onClick={() => {\n noyaManager.forceInit();\n }}\n >\n Reset\n </SmallButton>\n </span>\n }\n >\n <div style={styles.sectionInner}>\n <InspectorRow colorScheme={colorScheme}>\n <ObjectInspector\n name={multiplayerStateManager.schema ? \"state\" : undefined}\n data={state}\n theme={theme}\n />\n </InspectorRow>\n {multiplayerStateManager.schema && (\n <InspectorRow colorScheme={colorScheme}>\n <ObjectInspector\n name=\"schema\"\n data={multiplayerStateManager.schema}\n theme={theme}\n />\n </InspectorRow>\n )}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showHistory}\n setOpen={setShowHistory}\n title=\"History\"\n colorScheme={colorScheme}\n right={\n <span\n style={{\n display: \"flex\",\n gap: \"4px\",\n }}\n >\n <SmallButton\n disabled={!historySnapshot.canUndo}\n theme={theme}\n onClick={() => {\n multiplayerStateManager.undo();\n }}\n >\n <span style={{ width: \"12px\", height: \"12px\" }}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fill=\"currentColor\"\n d=\"M12 5H7V2L1 6l6 4V7h5c2.2 0 4 1.8 4 4s-1.8 4-4 4H7v2h5c3.3 0 6-2.7 6-6s-2.7-6-6-6\"\n />\n </svg>\n </span>\n </SmallButton>\n <SmallButton\n disabled={!historySnapshot.canRedo}\n theme={theme}\n onClick={() => {\n multiplayerStateManager.redo();\n }}\n >\n <span style={{ width: \"12px\", height: \"12px\" }}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fill=\"currentColor\"\n d=\"M8 5h5V2l6 4l-6 4V7H8c-2.2 0-4 1.8-4 4s1.8 4 4 4h5v2H8c-3.3 0-6-2.7-6-6s2.7-6 6-6\"\n />\n </svg>\n </span>\n </SmallButton>\n </span>\n }\n >\n <div ref={historyContainerRef} style={styles.sectionInner}>\n <div\n id={`${HISTORY_ELEMENT_PREFIX}0`}\n style={{\n borderBottom: `1px solid ${solidBorderColor}`,\n fontSize: \"12px\",\n fontFamily: \"Menlo, monospace\",\n padding: \"2px 12px 1px\",\n display: \"flex\",\n alignItems: \"center\",\n background:\n historySnapshot.historyIndex === 0\n ? \"rgb(59 130 246 / 15%)\"\n : undefined,\n }}\n >\n <span\n style={{\n fontFamily: \"Menlo, monospace\",\n fontSize: \"11px\",\n borderRadius: 4,\n display: \"inline-block\",\n }}\n >\n Initial state\n </span>\n </div>\n {historySnapshot.history.map((entry, index) => (\n <div\n id={`${HISTORY_ELEMENT_PREFIX}${index + 1}`}\n key={index}\n style={{\n padding: \"0px 12px 1px\",\n borderBottom: `1px solid ${solidBorderColor}`,\n background:\n index + 1 === historySnapshot.historyIndex\n ? \"rgb(59 130 246 / 15%)\"\n : undefined,\n }}\n >\n {\"name\" in entry.metadata &&\n typeof entry.metadata.name === \"string\" && (\n <pre\n style={{\n fontSize: \"11px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n margin: 0,\n }}\n >\n {entry.metadata.name}\n </pre>\n )}\n {entry.redoPatches?.map((patch, j) => (\n <pre\n key={j}\n style={{\n fontSize: \"11px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n margin: 0,\n }}\n >\n {patch.op === \"add\" && (\n <>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n {\" = \"}\n <ObjectInspector data={patch.value} theme={theme} />\n </>\n )}\n {patch.op === \"replace\" && (\n <>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n {\" = \"}\n <ObjectInspector data={patch.value} theme={theme} />\n </>\n )}\n {patch.op === \"remove\" && (\n <>\n <span style={{ color: theme.OBJECT_VALUE_STRING_COLOR }}>\n delete{\" \"}\n </span>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n </>\n )}\n {patch.op === \"move\" && (\n <>\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.from!)}\n </span>\n {\" -> \"}\n <span style={{ fontStyle: \"italic\" }}>\n {pathToString(patch.path)}\n </span>\n </>\n )}\n </pre>\n ))}\n </div>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showAssets}\n setOpen={setShowAssets}\n title={\n <TitleLabel>\n Assets\n <ColoredDot type={assetsInitialized ? \"success\" : \"error\"} />\n </TitleLabel>\n }\n colorScheme={colorScheme}\n right={\n <span style={{ display: \"flex\", gap: \"10px\" }}>\n <SmallButton\n theme={theme}\n onClick={() => {\n console.info(\n \"[StateInspector] Reloading assets\",\n noyaManager.id\n );\n assetManager.fetch();\n }}\n >\n Reload\n </SmallButton>\n <SmallButton\n theme={theme}\n onClick={() => {\n // get file input\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = () => {\n const file = input.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = () => {\n const buffer = reader.result as ArrayBuffer;\n assetManager.create(new Uint8Array(buffer));\n };\n reader.readAsArrayBuffer(file);\n }\n };\n input.click();\n }}\n >\n Upload\n </SmallButton>\n </span>\n }\n >\n <div style={styles.sectionInner}>\n {assets.map((asset) => (\n <InspectorRow key={asset.id} colorScheme={colorScheme}>\n <ObjectInspector name={asset.id} data={asset} theme={theme} />\n <SmallButton\n theme={theme}\n onClick={() => assetManager.delete(asset.id)}\n >\n Delete\n </SmallButton>\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n title=\"Tasks\"\n colorScheme={colorScheme}\n open={showTasks}\n setOpen={setShowTasks}\n >\n <div style={styles.sectionInner}>\n {tasks?.map((task) => (\n <InspectorRow\n key={task.id}\n colorScheme={colorScheme}\n style={{\n backgroundColor:\n task.status === \"done\"\n ? \"rgba(0,255,0,0.2)\"\n : task.status === \"error\"\n ? \"rgba(255,0,0,0.2)\"\n : undefined,\n }}\n >\n <ObjectInspector\n name={task.name}\n data={task.payload}\n theme={theme}\n />\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n title={\n <TitleLabel>\n Secrets\n <ColoredDot type={secretsInitialized ? \"success\" : \"error\"} />\n </TitleLabel>\n }\n colorScheme={colorScheme}\n open={showSecrets}\n setOpen={setShowSecrets}\n right={\n <SmallButton\n theme={theme}\n onClick={() => {\n const name = prompt(\"Enter secret name\");\n if (!name) return;\n const value = prompt(\"Enter secret value\");\n if (!value) return;\n secretManager.createSecret(name, value);\n }}\n >\n Create\n </SmallButton>\n }\n >\n <div style={styles.sectionInner}>\n {secrets.map((secret) => (\n <InspectorRow key={secret.id} colorScheme={colorScheme}>\n <ObjectInspector data={secret} theme={theme} />\n <SmallButton\n theme={theme}\n onClick={() => secretManager.deleteSecret(secret.name)}\n >\n Delete\n </SmallButton>\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showEphemeral}\n setOpen={setShowEphemeral}\n title=\"Ephemeral User Data\"\n colorScheme={colorScheme}\n >\n <div style={styles.sectionInner}>\n {Object.entries(ephemeral).map(([key, value]) => (\n <InspectorRow key={key} colorScheme={colorScheme}>\n <ObjectInspector\n name={key}\n data={value}\n theme={theme}\n expandLevel={10}\n />\n </InspectorRow>\n ))}\n </div>\n </DisclosureSection>\n <DisclosureSection\n open={showEvents}\n setOpen={setShowEvents}\n title=\"Events\"\n colorScheme={colorScheme}\n >\n <div ref={eventsContainerRef} style={styles.sectionInner}>\n {connectionEvents?.map((event, index) =>\n event.type === \"stateChange\" ? (\n <InspectorRow key={index} colorScheme={colorScheme}>\n connection:{\" \"}\n <span style={{ fontStyle: \"italic\" }}>\n {event.state.toLowerCase()}\n </span>\n </InspectorRow>\n ) : (\n <InspectorRow\n key={index}\n colorScheme={colorScheme}\n variant={event.type === \"send\" ? \"up\" : \"down\"}\n style={{\n padding: \"0px 12px 1px\",\n }}\n >\n <ObjectInspector\n data={event.type === \"error\" ? event.error : event.message}\n theme={theme}\n nodeRenderer={({\n depth,\n name,\n data,\n isNonenumerable,\n }: any) => {\n const direction = event.type === \"send\" ? \"up\" : \"down\";\n\n return depth === 0 ? (\n <ObjectRootLabel direction={direction} data={data} />\n ) : (\n <ObjectLabel\n direction={direction}\n name={name}\n data={data}\n isNonenumerable={isNonenumerable}\n />\n );\n }}\n />\n </InspectorRow>\n )\n )}\n {!connectionEvents && (\n <div\n style={{\n padding: \"12px\",\n fontSize: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n }}\n >\n <span>No recorded events</span>\n </div>\n )}\n </div>\n </DisclosureSection>\n </div>\n );\n});\n\ntype MessageDirection = \"up\" | \"down\";\n\nconst ObjectRootLabel: FC<{\n name?: string;\n data: any;\n direction?: MessageDirection;\n}> = ({ name, data, direction }) => {\n if (typeof name === \"string\") {\n return (\n <span>\n <ObjectName name={name} />\n <span>: </span>\n <ObjectPreview data={data} />\n </span>\n );\n }\n if (direction === \"up\" || direction === \"down\") {\n const arrow = direction === \"up\" ? \"↑\" : \"↓\";\n\n return (\n <span>\n <span\n style={{\n background:\n direction === \"up\" ? \"rgba(0,255,0,0.2)\" : \"rgba(255,0,0,0.2)\",\n // color: \"white\",\n width: 12,\n height: 12,\n borderRadius: 2,\n display: \"inline-flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n marginRight: 4,\n lineHeight: \"12px\",\n }}\n >\n {arrow}\n </span>\n <ObjectPreview data={data} />\n </span>\n );\n } else {\n return <ObjectPreview data={data} />;\n }\n};\n\n// Rotates ▶️ or ▼ based on expanded state\nfunction Arrow({\n expanded,\n onClick,\n style,\n}: {\n expanded: boolean;\n onClick?: () => void;\n style?: CSSProperties;\n}) {\n return (\n <span\n role=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-block\",\n textAlign: \"center\",\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n fontFamily: \"Menlo, monospace\",\n ...style,\n }}\n >\n {\"▼\"}\n </span>\n );\n}\n\nfunction pathToString(extendedPath: ExtendedPathKey[]) {\n return extendedPath\n .map((key) =>\n typeof key === \"object\"\n ? `:${ellipsis(key.id.toString(), 8, \"middle\")}`\n : key\n )\n .map((key, index) =>\n index === 0 || (typeof key === \"string\" && key.startsWith(\":\"))\n ? key\n : `.${key}`\n )\n .join(\"\");\n}\n\ntype EllipsisPosition = \"start\" | \"middle\" | \"end\";\n\nfunction ellipsis(\n str: string,\n maxLength: number,\n position: EllipsisPosition = \"end\"\n) {\n if (str.length <= maxLength) return str;\n\n switch (position) {\n case \"start\":\n return `…${str.slice(str.length - maxLength)}`;\n case \"middle\":\n const halfLength = Math.floor(maxLength / 2);\n return `${str.slice(0, halfLength)}…${str.slice(str.length - halfLength)}`;\n case \"end\":\n return `${str.slice(0, maxLength)}…`;\n }\n}\n\nfunction SmallButton({\n children,\n onClick,\n style,\n theme,\n disabled,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n style?: CSSProperties;\n theme: typeof chromeLight;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n style={{\n flex: \"0\",\n appearance: \"none\",\n background: \"none\",\n color: theme.BASE_COLOR,\n opacity: disabled ? 0.25 : 1,\n border: \"none\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"0\",\n cursor: \"pointer\",\n ...style,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction ColoredDot({ type }: { type: \"success\" | \"error\" }) {\n return (\n <span\n style={{\n display: \"inline-block\",\n width: 6,\n height: 6,\n background:\n type === \"success\" ? \"rgba(0,200,0,0.8)\" : \"rgba(200,0,0,0.8)\",\n borderRadius: \"50%\",\n verticalAlign: \"middle\",\n }}\n />\n );\n}\n\nfunction TitleLabel({ children }: { children: React.ReactNode }) {\n return (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}>\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nconst localStorage = typeof window !== \"undefined\" ? window.localStorage : null;\n\nexport function useLocalStorageState<S>(\n key: string,\n defaultValue: S\n): [S, (value: S) => void] {\n const [state, setState] = React.useState<S>(() => {\n const value = localStorage?.getItem(key);\n let result = defaultValue;\n if (value) {\n try {\n result = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing localStorage value\", error);\n }\n }\n return result;\n });\n\n const setLocalStorageState = (value: S) => {\n localStorage?.setItem(key, JSON.stringify(value));\n setState(value);\n };\n\n return [state, setLocalStorageState];\n}\n","/* eslint-disable no-restricted-globals */\nimport {\n createOrCastValue,\n findAllDefs,\n isEmbeddedApp,\n localStorageSync,\n parentFrameSync,\n Static,\n stubSync,\n SyncAdapter,\n TSchema,\n TypeGuard,\n webSocketSync,\n} from \"@noya-app/state-manager\";\nimport { useMemo, useState } from \"react\";\nimport { useMultiplayerState, UseMultiplayerStateOptions } from \"./hooks\";\nimport { StateInspectorOptions } from \"./inspector/StateInspector\";\n\nexport type AppViewType = \"editable\" | \"readOnly\" | \"preview\";\n\nexport type AppTheme = \"light\" | \"dark\";\n\nexport type AppData<State> = {\n multiplayerUrl?: string;\n theme: AppTheme;\n viewType: AppViewType;\n initialState: State;\n inspector: boolean | StateInspectorOptions;\n};\n\nexport function createDefaultAppData<State>(\n initialState: State\n): AppData<State> {\n return {\n theme: \"light\",\n viewType: \"editable\",\n initialState,\n inspector: false,\n };\n}\n\nexport type GetAppDataOptions = {\n window?: { location: { hash: string } };\n overrideExistingState?: boolean;\n};\n\nexport function enforceSchema<State>(\n initialState: State,\n schema?: TSchema\n): State {\n return schema\n ? (createOrCastValue({\n schema,\n value: initialState,\n defs: findAllDefs(schema),\n }) as State)\n : initialState;\n}\n\nexport function parseAppDataParameter(\n options?: GetAppDataOptions\n): AppData<unknown> | null {\n const window = options?.window ?? globalThis;\n const location = window.location;\n if (!location) return null;\n const urlHash = (location.hash || \"\").replace(/^#/, \"\");\n const params = new URLSearchParams(urlHash);\n const data = params.get(\"data\");\n if (!data) return null;\n try {\n return JSON.parse(data);\n } catch (e) {\n return null;\n }\n}\n\nexport function getAppData<State>(\n initialState: State | (() => State),\n schema?: TSchema,\n options?: GetAppDataOptions\n): AppData<State> {\n const resolvedInitialState =\n initialState instanceof Function ? initialState() : initialState;\n\n let appData =\n parseAppDataParameter(options) ??\n createDefaultAppData(resolvedInitialState);\n\n if (options?.overrideExistingState) {\n appData.initialState = resolvedInitialState;\n }\n\n appData.initialState = enforceSchema(appData.initialState, schema) as State;\n\n return appData as AppData<State>;\n}\n\nexport type UseNoyaStateOptions<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n> = UseMultiplayerStateOptions<S, M, E, MenuT> & {\n offlineStorageKey?: string;\n};\n\nexport type UseNoyaStateResult<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n> = [\n ReturnType<typeof useMultiplayerState<S, M, E, MenuT>>[0],\n ReturnType<typeof useMultiplayerState<S, M, E, MenuT>>[1],\n ReturnType<typeof useMultiplayerState<S, M, E, MenuT>>[2] & {\n theme: AppTheme;\n viewType: AppViewType;\n },\n];\n\n/**\n * Sync data locally or to a multiplayer server.\n *\n * There are 3 ways to use this hook:\n *\n * 1. Pass an initial state: `useNoyaState(initialState)`\n * 2. Pass an initial state and a schema: `useNoyaState(initialState, { schema })`\n * 3. Pass only a schema, and a conforming initial state is created automatically: `useNoyaState({ schema })`\n */\nexport function useNoyaState<\n S,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n O extends UseNoyaStateOptions<S, M, E, MenuT> = UseNoyaStateOptions<\n S,\n M,\n E,\n MenuT\n >,\n>(\n ...args:\n | [\n initialState: O[\"schema\"] extends TSchema\n ? Static<O[\"schema\"]> | (() => Static<O[\"schema\"]>)\n : S | (() => S),\n options?: O,\n ]\n | [options: O & { schema: TSchema }]\n): UseNoyaStateResult<\n O[\"schema\"] extends TSchema ? Static<O[\"schema\"]> : S,\n M,\n E,\n MenuT\n> {\n const [initialState, options] =\n typeof args[0] === \"object\" &&\n args[0] !== null &&\n \"schema\" in args[0] &&\n TypeGuard.IsSchema(args[0].schema)\n ? [null, args[0]]\n : [args[0], args[1]];\n\n // Keep these stable after initial render\n const [\n {\n multiplayerUrl,\n inspector,\n initialState: noyaAppInitialState,\n theme,\n viewType,\n },\n ] = useState(() => {\n return getAppData(initialState, options?.schema, {\n overrideExistingState: options?.overrideExistingState,\n });\n });\n\n const sync = useMemo((): SyncAdapter<S, M, E, MenuT> => {\n return isEmbeddedApp()\n ? parentFrameSync<S, M, E, MenuT>({ debug: options?.debug })\n : multiplayerUrl\n ? webSocketSync<S, M, E, MenuT>({\n url: multiplayerUrl,\n debug: options?.debug,\n })\n : options?.offlineStorageKey\n ? localStorageSync<S, M, E, MenuT>({ key: options.offlineStorageKey })\n : stubSync<S, M, E, MenuT>();\n }, [multiplayerUrl, options?.offlineStorageKey, options?.debug]);\n\n const result = useMultiplayerState(noyaAppInitialState as S, {\n ...options,\n inspector: options?.inspector ?? inspector,\n sync: options?.sync ?? sync,\n });\n\n const [, , extras] = result;\n\n const mergedExtras = useMemo(() => {\n return { ...extras, theme, viewType } as const;\n }, [extras, theme, viewType]);\n\n return [result[0], result[1], mergedExtras] as UseNoyaStateResult<\n O[\"schema\"] extends TSchema ? Static<O[\"schema\"]> : S,\n M,\n E,\n MenuT\n >;\n}\n\n// function typeTest() {\n// const [a, setA] = useNoyaState(7);\n// const [b, setB] = useNoyaState(7, {\n// schema: Type.Number(),\n// });\n// const [c, setC] = useNoyaState({\n// schema: Type.Number(),\n// });\n// }\n","import { MenuItem } from \"@noya-app/noya-designsystem\";\nimport {\n GetAtPath,\n Observable,\n ObservableOptions,\n PathKey,\n} from \"@noya-app/observable\";\nimport {\n ConnectedUsersManager,\n EphemeralUserDataManager,\n MultiplayerStateManager,\n NoyaManager,\n StateManagerOptions,\n Static,\n TSchema,\n} from \"@noya-app/state-manager\";\nimport React, {\n createContext,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n} from \"react\";\nimport {\n AppTheme,\n AppViewType,\n useNoyaState,\n UseNoyaStateOptions,\n} from \"./noyaApp\";\nimport { useObservable } from \"./useObservable\";\n\ninterface NoyaStateProviderProps<\n S,\n M extends object,\n E extends object,\n MenuT extends string,\n> extends Omit<\n UseNoyaStateOptions<S, M, E, MenuT>,\n \"schema\" | \"mergeHistoryEntries\"\n > {\n children: React.ReactNode;\n initialState?: S;\n fallback?: React.ReactNode;\n}\n\nconst AnyNoyaStateContext = createContext<\n | {\n noyaManager: NoyaManager<any, any, any, any>;\n theme: AppTheme;\n viewType: AppViewType;\n }\n | undefined\n>(undefined);\n\nexport function useAnyNoyaStateContext() {\n const value = useContext(AnyNoyaStateContext);\n\n if (!value) {\n throw new Error(\n \"useNoyaStateContext must be used within a NoyaStateProvider\"\n );\n }\n\n return value;\n}\n\nexport function useAnyNoyaManager() {\n const { noyaManager } = useAnyNoyaStateContext();\n return noyaManager as NoyaManager<any, any, any, any>;\n}\n\nexport function useColorScheme() {\n const { theme } = useAnyNoyaStateContext();\n return theme;\n}\n\nexport function useViewType() {\n const { viewType } = useAnyNoyaStateContext();\n return viewType;\n}\n\nexport function useAssets() {\n const { noyaManager } = useAnyNoyaStateContext();\n return useObservable(noyaManager.assetManager.assets$);\n}\n\nexport function useAsset(id: string | undefined) {\n const { noyaManager } = useAnyNoyaStateContext();\n const observable = useMemo(\n () =>\n noyaManager.assetManager.assets$.map((assets) =>\n assets.find((a) => a.id === id)\n ),\n [noyaManager, id]\n );\n return useObservable(observable);\n}\n\nexport function useAssetManager() {\n const { noyaManager } = useAnyNoyaStateContext();\n const isInitialized = useObservable(noyaManager.assetManager.isInitialized$);\n return useMemo(\n () => ({\n create: noyaManager.assetManager.create,\n delete: noyaManager.assetManager.delete,\n isInitialized,\n }),\n [noyaManager, isInitialized]\n );\n}\n\nexport function useAIManager() {\n const { noyaManager } = useAnyNoyaStateContext();\n return noyaManager.aiManager;\n}\n\nexport function useSecretManager() {\n const { noyaManager } = useAnyNoyaStateContext();\n return noyaManager.secretManager;\n}\n\nexport function useSecrets() {\n const { noyaManager } = useAnyNoyaStateContext();\n return useObservable(noyaManager.secretManager.secrets$);\n}\n\nexport function useSecret(name: string) {\n const { noyaManager } = useAnyNoyaStateContext();\n\n return useObservable(\n noyaManager.secretManager.secrets$,\n useCallback((secrets) => secrets.find((s) => s.name === name), [name])\n );\n}\n\nexport function useIsInitialized() {\n const { noyaManager, viewType } = useAnyNoyaStateContext();\n\n const isInitializedObservable = useMemo(\n () =>\n Observable.combine(\n [\n ...(viewType === \"preview\"\n ? []\n : [noyaManager.multiplayerStateManager.isInitialized$]),\n noyaManager.secretManager.isInitialized$,\n noyaManager.assetManager.isInitialized$,\n ],\n (values) => values.every((v) => v)\n ),\n [noyaManager, viewType]\n );\n\n return useObservable(isInitializedObservable);\n}\n\nexport function useWorkflowManager() {\n const { noyaManager } = useAnyNoyaStateContext();\n return noyaManager.workflowManager;\n}\n\nexport const ConnectedUsersContext = createContext<\n ConnectedUsersManager | undefined\n>(undefined);\n\nexport function useConnectedUsersManager() {\n return useContext(ConnectedUsersContext);\n}\n\nexport const AnyEphemeralUserDataManagerContext = createContext<\n EphemeralUserDataManager<object> | undefined\n>(undefined);\n\nexport function useAnyEphemeralUserData() {\n return useContext(AnyEphemeralUserDataManagerContext);\n}\n\nexport function useCurrentUserId() {\n const connectedUsersManager = useConnectedUsersManager();\n return useObservable(connectedUsersManager?.currentUserId$);\n}\n\nexport const FallbackUntilInitialized = ({\n children,\n fallback,\n}: {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n}) => {\n const isInitialized = useIsInitialized();\n\n return isInitialized ? children : fallback ?? null;\n};\n\nexport function createNoyaContext<\n Schema extends TSchema,\n M extends object = object,\n E extends object = object,\n MenuT extends string = string,\n>({\n schema,\n mergeHistoryEntries,\n}: {\n schema: Schema;\n mergeHistoryEntries?: StateManagerOptions<\n Static<Schema>,\n M\n >[\"mergeHistoryEntries\"];\n}) {\n type S = Static<Schema>;\n\n const NoyaStateContext = AnyNoyaStateContext as React.Context<\n NoyaManager<S, M, E> | undefined\n >;\n\n const EphemeralUserDataManagerContext =\n AnyEphemeralUserDataManagerContext as React.Context<\n EphemeralUserDataManager<E> | undefined\n >;\n\n function NoyaStateProvider({\n children,\n initialState,\n ...options\n }: NoyaStateProviderProps<S, M, E, MenuT>) {\n const [, , { noyaManager, theme, viewType }] = useNoyaState<S, M, E, MenuT>(\n initialState,\n {\n ...(options as any),\n schema,\n mergeHistoryEntries,\n }\n );\n\n const contextValue = useMemo(\n () => ({\n noyaManager,\n theme,\n viewType,\n }),\n [noyaManager, theme, viewType]\n );\n\n return (\n <AnyNoyaStateContext.Provider value={contextValue}>\n <ConnectedUsersContext.Provider\n value={noyaManager.connectedUsersManager}\n >\n <EphemeralUserDataManagerContext.Provider\n value={noyaManager.ephemeralUserDataManager}\n >\n {options.fallback !== undefined ? (\n <FallbackUntilInitialized fallback={options.fallback}>\n {children}\n </FallbackUntilInitialized>\n ) : (\n children\n )}\n </EphemeralUserDataManagerContext.Provider>\n </ConnectedUsersContext.Provider>\n </AnyNoyaStateContext.Provider>\n );\n }\n\n function useValue(): S;\n function useValue<A>(\n selector: (value: S) => A,\n options?: Pick<ObservableOptions, \"isEqual\">\n ): A;\n function useValue<P extends PathKey[] | string>(path: P): GetAtPath<S, P>;\n function useValue(\n path?: PathKey[] | string | ((value: S) => any),\n options?: Pick<ObservableOptions, \"isEqual\">\n ) {\n const { noyaManager } = useAnyNoyaStateContext();\n\n let actualPath: PathKey[] | string =\n typeof path === \"function\" || !path ? \"\" : path;\n\n const mappedObservable = useMemo(() => {\n if (typeof path === \"function\") {\n return noyaManager.multiplayerStateManager.optimisticState$.map(path, {\n isEqual: options?.isEqual,\n });\n }\n return noyaManager.multiplayerStateManager.optimisticState$;\n }, [noyaManager, path, options?.isEqual]);\n\n const value = useObservable(mappedObservable, actualPath);\n\n return value;\n }\n\n function useSetValue(): (\n ...args:\n | [metadata: M, value: SetStateAction<S>]\n | [value: SetStateAction<S>]\n ) => void;\n function useSetValue<P extends PathKey[] | string>(\n path: P\n ): (\n ...args:\n | [metadata: M, value: SetStateAction<GetAtPath<S, P>>]\n | [value: SetStateAction<GetAtPath<S, P>>]\n ) => void;\n function useSetValue<P extends PathKey[] | string>(path?: P) {\n const { noyaManager } = useAnyNoyaStateContext();\n\n const setValue = useCallback(\n (\n ...args:\n | [metadata: M, value: SetStateAction<GetAtPath<S, P>>]\n | [value: SetStateAction<GetAtPath<S, P>>]\n ): void => {\n const [metadata, value] = args.length === 2 ? args : [{}, args[0]];\n\n noyaManager.multiplayerStateManager.setStateAtPath(\n metadata,\n (path ?? \"\") as P,\n value as never\n );\n },\n [noyaManager, path]\n );\n\n return setValue;\n }\n\n function useValueState(): [\n S,\n (\n ...args:\n | [metadata: M, value: SetStateAction<S>]\n | [value: SetStateAction<S>]\n ) => void,\n ];\n function useValueState<A>(\n selector: (value: S) => A,\n options?: ObservableOptions\n ): [\n A,\n (\n ...args:\n | [metadata: M, value: SetStateAction<S>]\n | [value: SetStateAction<S>]\n ) => void,\n ];\n function useValueState<P extends PathKey[] | string>(\n path?: P\n ): [\n GetAtPath<S, P>,\n (\n ...args:\n | [metadata: M, value: SetStateAction<GetAtPath<S, P>>]\n | [value: SetStateAction<GetAtPath<S, P>>]\n ) => void,\n ];\n function useValueState<P extends PathKey[] | string>(\n ...args: [P?] | [selector: (value: S) => any, options?: ObservableOptions]\n ) {\n const [selector, options, path] =\n args.length >= 1 && typeof args[0] === \"function\"\n ? [args[0], args[1], undefined]\n : [undefined, undefined, args[0] as P | undefined];\n\n const value = useValue((selector ?? path ?? \"\") as any, options);\n const setValue = useSetValue(path ?? \"\");\n return [value, setValue];\n }\n\n function useStateManager() {\n const { noyaManager } = useAnyNoyaStateContext();\n\n return noyaManager.multiplayerStateManager as MultiplayerStateManager<S, M>;\n }\n\n function useEphemeralUserDataManager() {\n const ephemeralUserData = useContext(EphemeralUserDataManagerContext);\n\n if (!ephemeralUserData) {\n throw new Error(\n \"useEphemeralUserData must be used within a NoyaStateProvider\"\n );\n }\n\n return ephemeralUserData;\n }\n\n function useNoyaManager() {\n return useAnyNoyaStateContext().noyaManager as NoyaManager<S, M, E, MenuT>;\n }\n\n function useLeftMenuItems() {\n const { menuManager } = useNoyaManager();\n\n return useObservable(menuManager.leftMenuItems$);\n }\n\n function useSetLeftMenuItems(leftMenuItems?: MenuItem<MenuT>[]) {\n const { menuManager } = useNoyaManager();\n\n useEffect(() => {\n if (leftMenuItems) {\n menuManager.setLeftMenuItems(leftMenuItems);\n }\n }, [menuManager, leftMenuItems]);\n }\n\n function useRightMenuItems() {\n const { menuManager } = useNoyaManager();\n\n return useObservable(menuManager.rightMenuItems$);\n }\n\n function useSetRightMenuItems(rightMenuItems?: MenuItem<MenuT>[]) {\n const { menuManager } = useNoyaManager();\n\n useEffect(() => {\n if (rightMenuItems) {\n menuManager.setRightMenuItems(rightMenuItems);\n }\n }, [menuManager, rightMenuItems]);\n }\n\n function useHandleMenuItem(callback: (type: MenuT) => void) {\n const { menuManager } = useNoyaManager();\n\n useEffect(() => {\n return menuManager.addListener(callback);\n }, [menuManager, callback]);\n }\n\n function useOnSelectMenuItemCallback(): (type: MenuT) => void {\n const { menuManager } = useNoyaManager();\n\n return useCallback((type: MenuT) => menuManager.emit(type), [menuManager]);\n }\n\n function useMenu(options: {\n leftMenuItems?: MenuItem<MenuT>[];\n rightMenuItems?: MenuItem<MenuT>[];\n onSelectMenuItem?: (type: MenuT) => void;\n }) {\n const { leftMenuItems, rightMenuItems, onSelectMenuItem } = options;\n\n useSetLeftMenuItems(leftMenuItems);\n useSetRightMenuItems(rightMenuItems);\n\n const noop = useCallback(() => {}, []);\n useHandleMenuItem(onSelectMenuItem ?? noop);\n }\n\n return {\n Context: NoyaStateContext,\n Provider: NoyaStateProvider,\n useValue,\n useSetValue,\n useValueState,\n useStateManager,\n useEphemeralUserDataManager,\n useLeftMenuItems,\n useSetLeftMenuItems,\n useRightMenuItems,\n useSetRightMenuItems,\n useHandleMenuItem,\n useOnSelectMenuItemCallback,\n useNoyaManager,\n useMenu,\n };\n}\n","import {\n ClientToServerMessage,\n MultiplayerStateManagerError,\n ReconnectingWebSocket,\n ReconnectingWebSocketState,\n ServerToClientMessage,\n UserActivityDetector,\n} from \"@noya-app/state-manager\";\n\nexport type ConnectionEvent<State> =\n | {\n type: \"stateChange\";\n state: ReconnectingWebSocketState;\n }\n | {\n type: \"send\";\n message: ClientToServerMessage<State>;\n }\n | {\n type: \"receive\";\n message: ServerToClientMessage<State>;\n }\n | {\n type: \"error\";\n error: MultiplayerStateManagerError;\n };\n\nexport type ConnectionOptions<State> = {\n debug?: boolean;\n onConnectionEvent?: (event: ConnectionEvent<State>) => void;\n};\n\nexport class WebSocketConnection<State> {\n private ws: ReconnectingWebSocket;\n private pingCount = 0;\n private pendingPingId?: string;\n private intervalId?: NodeJS.Timer;\n\n constructor(\n private url: URL,\n private options: ConnectionOptions<State> = {}\n ) {\n this.ws = new ReconnectingWebSocket({\n debug: options.debug,\n onopen: this.handleOpen,\n onmessage: this.handleMessage,\n onclose: this.handleClose,\n activityDetector: new UserActivityDetector(),\n });\n }\n\n async connect() {\n this.ws.connect(this.url.toString());\n\n // Start ping interval\n this.intervalId = setInterval(() => {\n if (this.ws.state !== \"OPEN\") return;\n\n // A response to a previous ping hasn't been received, so we'll reset the connection\n if (this.pendingPingId) {\n this.ws.close();\n return;\n }\n\n const pingId = (this.pingCount++).toString();\n\n const message: ClientToServerMessage<State> = {\n type: \"ping\",\n id: pingId,\n };\n\n this.pendingPingId = message.id;\n\n this.options.onConnectionEvent?.({\n type: \"send\",\n message,\n });\n\n this.ws.send(JSON.stringify(message));\n }, 10000);\n }\n\n private handleOpen = () => {\n this.pendingPingId = undefined;\n\n if (this.options.debug) {\n console.info(\"ws connected\");\n }\n\n this.options.onConnectionEvent?.({\n type: \"stateChange\",\n state: \"OPEN\",\n });\n };\n\n private handleMessage = (event: MessageEvent) => {\n if (this.options.debug) {\n console.info(\"ws receiving message \", event.data);\n }\n\n const parsed = JSON.parse(event.data) as ServerToClientMessage<State>;\n\n this.options.onConnectionEvent?.({\n type: \"receive\",\n message: parsed,\n });\n\n if (parsed.type === \"pong\" && parsed.id === this.pendingPingId) {\n this.pendingPingId = undefined;\n }\n };\n\n private handleClose = () => {\n this.pendingPingId = undefined;\n\n if (this.options.debug) {\n console.info(\"ws disconnected\");\n }\n\n this.options.onConnectionEvent?.({\n type: \"stateChange\",\n state: \"CLOSED\",\n });\n };\n\n send(message: ClientToServerMessage<State>) {\n if (this.options.debug) {\n console.info(\"ws sending message\", message);\n }\n\n this.options.onConnectionEvent?.({\n type: \"send\",\n message,\n });\n\n this.ws.send(JSON.stringify(message));\n }\n\n close() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n this.ws.shutdown();\n }\n\n addListener(listener: (state: ReconnectingWebSocketState) => void) {\n return this.ws.addListener(listener);\n }\n\n removeListener(listener: (state: ReconnectingWebSocketState) => void) {\n return this.ws.removeListener(listener);\n }\n}\n"],"mappings":"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","names":["listen","get","UserPointerInternal","createElement","useEffect","useMemo","useState","useSyncExternalStore","createRoot","React","ErrorOverlay","React","useLayoutEffect","memoGeneric","React","useEffect","React","React","memoGeneric","StateInspector","useEffect","React","useLayoutEffect","root","useSyncExternalStore","useState","useMemo","useEffect","createRoot","createElement","stubSync","useMemo","useState","window","useState","useMemo","stubSync","React","useCallback","useEffect","useMemo","useMemo","useCallback","React","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noya-app/noya-multiplayer-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.49",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
"dev": "npm run build -- --watch"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@noya-app/state-manager": "0.1.
|
|
15
|
+
"@noya-app/state-manager": "0.1.38",
|
|
16
16
|
"@noya-app/emitter": "0.1.0",
|
|
17
|
-
"@noya-app/observable": "0.1.
|
|
17
|
+
"@noya-app/observable": "0.1.5",
|
|
18
18
|
"@noya-app/task-runner": "0.1.5",
|
|
19
|
-
"@noya-app/react-utils": "0.1.
|
|
19
|
+
"@noya-app/react-utils": "0.1.14",
|
|
20
20
|
"react-inspector": "6.0.2"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|