@player-ui/react 0.10.5--canary.606.20861 → 0.10.5--canary.606.20908

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.
@@ -412,6 +412,7 @@ var useReactPlayer = (options) => {
412
412
 
413
413
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx
414
414
  var import_react7 = __toESM(require("react"));
415
+ var import_shim = require("use-sync-external-store/shim/index.js");
415
416
 
416
417
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx
417
418
  var import_react6 = require("react");
@@ -463,16 +464,19 @@ var ManagedState = class {
463
464
  constructor({
464
465
  middleware
465
466
  }) {
467
+ /** Add a listener to state changes */
468
+ this.addListener = (callback) => {
469
+ this.callbacks.push(callback);
470
+ return () => {
471
+ this.callbacks = this.callbacks.filter((s) => s !== callback);
472
+ };
473
+ };
474
+ this.getSnapshot = () => {
475
+ return this.state;
476
+ };
466
477
  this.middleware = middleware;
467
478
  this.callbacks = [];
468
479
  }
469
- /** Add a listener to state changes */
470
- addListener(callback) {
471
- this.callbacks.push(callback);
472
- return () => {
473
- this.callbacks = this.callbacks.filter((s) => s !== callback);
474
- };
475
- }
476
480
  /** start the managed flow */
477
481
  start(options) {
478
482
  const initialState = {
@@ -596,37 +600,42 @@ var ManagedState = class {
596
600
  }
597
601
  };
598
602
  var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
603
+ function createKey() {
604
+ return {
605
+ _key: Symbol("managed-player")
606
+ };
607
+ }
599
608
  var createPersistentStateMachine = (keyRef, middleware) => {
600
609
  const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware });
601
610
  managedPlayerStateMachines.set(keyRef.current, managedState);
602
611
  return managedState;
603
612
  };
604
613
  var ManagedPlayer = (props) => {
605
- const keyRef = import_react7.default.useRef({
606
- _key: Symbol("managed-player")
607
- });
614
+ const keyRef = import_react7.default.useRef(createKey());
608
615
  const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
609
616
  const initialState = createPersistentStateMachine(keyRef, {
610
617
  next: withRequestTime
611
618
  });
612
619
  const [managedState, setManagedState] = import_react7.default.useState(initialState);
613
- const [state, setState] = import_react7.default.useState(managedState.state);
614
- import_react7.default.useEffect(() => {
615
- const unsub = managedState.addListener({
616
- onState: (s) => {
617
- setState(s);
618
- }
619
- });
620
- return unsub;
621
- }, []);
620
+ const wrappedListener = import_react7.default.useCallback(
621
+ (cb) => {
622
+ return managedState.addListener({
623
+ onState(s) {
624
+ cb(s);
625
+ }
626
+ });
627
+ },
628
+ [managedState]
629
+ );
630
+ const state = (0, import_shim.useSyncExternalStore)(wrappedListener, managedState.getSnapshot);
622
631
  import_react7.default.useEffect(() => {
623
632
  if (state?.value === "ended") {
624
633
  if (props.manager !== state.context.manager) {
634
+ keyRef.current = createKey();
625
635
  const newManagedState = createPersistentStateMachine(keyRef, {
626
636
  next: withRequestTime
627
637
  });
628
638
  setManagedState(newManagedState);
629
- setState(newManagedState.state);
630
639
  } else {
631
640
  props.onComplete?.(state?.context.result);
632
641
  }
@@ -646,12 +655,12 @@ var ManagedPlayer = (props) => {
646
655
  }, [state]);
647
656
  import_react7.default.useEffect(() => {
648
657
  return () => {
649
- const playerState = state?.context.reactPlayer.player.getState();
658
+ const playerState = state?.context?.reactPlayer?.player?.getState();
650
659
  if (state?.value === "running" && playerState?.status === "in-progress") {
651
660
  props.manager.terminate?.(playerState.controllers.data.serialize());
652
661
  }
653
662
  };
654
- }, [props.manager, state?.context.reactPlayer.player, state?.value]);
663
+ }, [props.manager, state?.context?.reactPlayer?.player, state?.value]);
655
664
  if (state?.value === "error") {
656
665
  if (props.fallbackComponent) {
657
666
  return /* @__PURE__ */ import_react7.default.createElement(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/index.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/asset/index.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/player-context.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n }\n\n /** Add a listener to state changes */\n public addListener(callback: StateChangeCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n }\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\n/** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */\nexport const createPersistentStateMachine = (\n keyRef: React.MutableRefObject<ManagedPlayerStateKey>,\n middleware?: ManagerMiddleware,\n): ManagedState => {\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\n\n return managedState;\n};\n\n/**\n * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.\n * Provide a valid `FlowManager` to handle fetching the next flow.\n *\n * `suspense` must be enabled to wait for results in flight.\n */\nexport const ManagedPlayer = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\n const keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();\n\n const initialState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n\n const [managedState, setManagedState] = React.useState(initialState);\n const [state, setState] = React.useState(managedState.state);\n\n React.useEffect(() => {\n const unsub = managedState.addListener({\n onState: (s) => {\n setState(s);\n },\n });\n return unsub;\n }, []);\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n if (props.manager !== state.context.manager) {\n const newManagedState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n setManagedState(newManagedState);\n setState(newManagedState.state);\n } else {\n props.onComplete?.(state?.context.result);\n }\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n } else if (state === undefined) {\n managedState.start({\n manager: props.manager,\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context.reactPlayer.player.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context.reactPlayer.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["ReactPlayer","import_react","import_player","React","leven","import_react","React","import_react","React","ReactPlayer","React","import_player","import_react","React","ReactPlayer","import_react","import_react","ReactPlayer","React"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/index.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/asset/index.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/player-context.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim/index.js\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n // this.state = {\n // value: \"uninitialized\",\n // context: {},\n // };\n }\n\n /** Add a listener to state changes */\n public addListener = (callback: StateChangeCallback): (() => void) => {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n };\n\n public getSnapshot = (): ManagedPlayerState | undefined => {\n return this.state;\n };\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\n/**\n * Helper to make a unique symbol\n */\nfunction createKey() {\n return {\n _key: Symbol(\"managed-player\"),\n };\n}\n\n/** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */\nexport const createPersistentStateMachine = (\n keyRef: React.MutableRefObject<ManagedPlayerStateKey>,\n middleware?: ManagerMiddleware,\n): ManagedState => {\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\n\n return managedState;\n};\n\n/**\n * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.\n * Provide a valid `FlowManager` to handle fetching the next flow.\n *\n * `suspense` must be enabled to wait for results in flight.\n */\nexport const ManagedPlayer = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\n const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());\n const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();\n\n const initialState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n\n const [managedState, setManagedState] = React.useState(initialState);\n const wrappedListener = React.useCallback(\n (cb: (s: ManagedPlayerState) => void) => {\n return managedState.addListener({\n onState(s) {\n cb(s);\n },\n });\n },\n [managedState],\n );\n\n // const [state, setState] = React.useState(managedState.state);\n const state = useSyncExternalStore(wrappedListener, managedState.getSnapshot);\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n if (props.manager !== state.context.manager) {\n keyRef.current = createKey();\n const newManagedState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n setManagedState(newManagedState);\n // setState(newManagedState.state);\n } else {\n props.onComplete?.(state?.context.result);\n }\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n } else if (state === undefined) {\n managedState.start({\n manager: props.manager,\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context?.reactPlayer?.player?.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context?.reactPlayer?.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["ReactPlayer","import_react","import_player","React","leven","import_react","React","import_react","React","ReactPlayer","React","import_player","import_react","React","ReactPlayer","import_react","import_react","ReactPlayer","React"]}
@@ -358,6 +358,7 @@ var useReactPlayer = (options) => {
358
358
 
359
359
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx
360
360
  import React6 from "react";
361
+ import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
361
362
 
362
363
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx
363
364
  import { useCallback, useEffect, useRef, useMemo } from "react";
@@ -412,16 +413,19 @@ var ManagedState = class {
412
413
  constructor({
413
414
  middleware
414
415
  }) {
416
+ /** Add a listener to state changes */
417
+ this.addListener = (callback) => {
418
+ this.callbacks.push(callback);
419
+ return () => {
420
+ this.callbacks = this.callbacks.filter((s) => s !== callback);
421
+ };
422
+ };
423
+ this.getSnapshot = () => {
424
+ return this.state;
425
+ };
415
426
  this.middleware = middleware;
416
427
  this.callbacks = [];
417
428
  }
418
- /** Add a listener to state changes */
419
- addListener(callback) {
420
- this.callbacks.push(callback);
421
- return () => {
422
- this.callbacks = this.callbacks.filter((s) => s !== callback);
423
- };
424
- }
425
429
  /** start the managed flow */
426
430
  start(options) {
427
431
  const initialState = {
@@ -545,37 +549,42 @@ var ManagedState = class {
545
549
  }
546
550
  };
547
551
  var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
552
+ function createKey() {
553
+ return {
554
+ _key: Symbol("managed-player")
555
+ };
556
+ }
548
557
  var createPersistentStateMachine = (keyRef, middleware) => {
549
558
  const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware });
550
559
  managedPlayerStateMachines.set(keyRef.current, managedState);
551
560
  return managedState;
552
561
  };
553
562
  var ManagedPlayer = (props) => {
554
- const keyRef = React6.useRef({
555
- _key: Symbol("managed-player")
556
- });
563
+ const keyRef = React6.useRef(createKey());
557
564
  const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
558
565
  const initialState = createPersistentStateMachine(keyRef, {
559
566
  next: withRequestTime
560
567
  });
561
568
  const [managedState, setManagedState] = React6.useState(initialState);
562
- const [state, setState] = React6.useState(managedState.state);
563
- React6.useEffect(() => {
564
- const unsub = managedState.addListener({
565
- onState: (s) => {
566
- setState(s);
567
- }
568
- });
569
- return unsub;
570
- }, []);
569
+ const wrappedListener = React6.useCallback(
570
+ (cb) => {
571
+ return managedState.addListener({
572
+ onState(s) {
573
+ cb(s);
574
+ }
575
+ });
576
+ },
577
+ [managedState]
578
+ );
579
+ const state = useSyncExternalStore(wrappedListener, managedState.getSnapshot);
571
580
  React6.useEffect(() => {
572
581
  if (state?.value === "ended") {
573
582
  if (props.manager !== state.context.manager) {
583
+ keyRef.current = createKey();
574
584
  const newManagedState = createPersistentStateMachine(keyRef, {
575
585
  next: withRequestTime
576
586
  });
577
587
  setManagedState(newManagedState);
578
- setState(newManagedState.state);
579
588
  } else {
580
589
  props.onComplete?.(state?.context.result);
581
590
  }
@@ -595,12 +604,12 @@ var ManagedPlayer = (props) => {
595
604
  }, [state]);
596
605
  React6.useEffect(() => {
597
606
  return () => {
598
- const playerState = state?.context.reactPlayer.player.getState();
607
+ const playerState = state?.context?.reactPlayer?.player?.getState();
599
608
  if (state?.value === "running" && playerState?.status === "in-progress") {
600
609
  props.manager.terminate?.(playerState.controllers.data.serialize());
601
610
  }
602
611
  };
603
- }, [props.manager, state?.context.reactPlayer.player, state?.value]);
612
+ }, [props.manager, state?.context?.reactPlayer?.player, state?.value]);
604
613
  if (state?.value === "error") {
605
614
  if (props.fallbackComponent) {
606
615
  return /* @__PURE__ */ React6.createElement(
package/dist/index.mjs CHANGED
@@ -358,6 +358,7 @@ var useReactPlayer = (options) => {
358
358
 
359
359
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx
360
360
  import React6 from "react";
361
+ import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
361
362
 
362
363
  // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx
363
364
  import { useCallback, useEffect, useRef, useMemo } from "react";
@@ -412,16 +413,19 @@ var ManagedState = class {
412
413
  constructor({
413
414
  middleware
414
415
  }) {
416
+ /** Add a listener to state changes */
417
+ this.addListener = (callback) => {
418
+ this.callbacks.push(callback);
419
+ return () => {
420
+ this.callbacks = this.callbacks.filter((s) => s !== callback);
421
+ };
422
+ };
423
+ this.getSnapshot = () => {
424
+ return this.state;
425
+ };
415
426
  this.middleware = middleware;
416
427
  this.callbacks = [];
417
428
  }
418
- /** Add a listener to state changes */
419
- addListener(callback) {
420
- this.callbacks.push(callback);
421
- return () => {
422
- this.callbacks = this.callbacks.filter((s) => s !== callback);
423
- };
424
- }
425
429
  /** start the managed flow */
426
430
  start(options) {
427
431
  const initialState = {
@@ -545,37 +549,42 @@ var ManagedState = class {
545
549
  }
546
550
  };
547
551
  var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
552
+ function createKey() {
553
+ return {
554
+ _key: Symbol("managed-player")
555
+ };
556
+ }
548
557
  var createPersistentStateMachine = (keyRef, middleware) => {
549
558
  const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware });
550
559
  managedPlayerStateMachines.set(keyRef.current, managedState);
551
560
  return managedState;
552
561
  };
553
562
  var ManagedPlayer = (props) => {
554
- const keyRef = React6.useRef({
555
- _key: Symbol("managed-player")
556
- });
563
+ const keyRef = React6.useRef(createKey());
557
564
  const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
558
565
  const initialState = createPersistentStateMachine(keyRef, {
559
566
  next: withRequestTime
560
567
  });
561
568
  const [managedState, setManagedState] = React6.useState(initialState);
562
- const [state, setState] = React6.useState(managedState.state);
563
- React6.useEffect(() => {
564
- const unsub = managedState.addListener({
565
- onState: (s) => {
566
- setState(s);
567
- }
568
- });
569
- return unsub;
570
- }, []);
569
+ const wrappedListener = React6.useCallback(
570
+ (cb) => {
571
+ return managedState.addListener({
572
+ onState(s) {
573
+ cb(s);
574
+ }
575
+ });
576
+ },
577
+ [managedState]
578
+ );
579
+ const state = useSyncExternalStore(wrappedListener, managedState.getSnapshot);
571
580
  React6.useEffect(() => {
572
581
  if (state?.value === "ended") {
573
582
  if (props.manager !== state.context.manager) {
583
+ keyRef.current = createKey();
574
584
  const newManagedState = createPersistentStateMachine(keyRef, {
575
585
  next: withRequestTime
576
586
  });
577
587
  setManagedState(newManagedState);
578
- setState(newManagedState.state);
579
588
  } else {
580
589
  props.onComplete?.(state?.context.result);
581
590
  }
@@ -595,12 +604,12 @@ var ManagedPlayer = (props) => {
595
604
  }, [state]);
596
605
  React6.useEffect(() => {
597
606
  return () => {
598
- const playerState = state?.context.reactPlayer.player.getState();
607
+ const playerState = state?.context?.reactPlayer?.player?.getState();
599
608
  if (state?.value === "running" && playerState?.status === "in-progress") {
600
609
  props.manager.terminate?.(playerState.controllers.data.serialize());
601
610
  }
602
611
  };
603
- }, [props.manager, state?.context.reactPlayer.player, state?.value]);
612
+ }, [props.manager, state?.context?.reactPlayer?.player, state?.value]);
604
613
  if (state?.value === "error") {
605
614
  if (props.fallbackComponent) {
606
615
  return /* @__PURE__ */ React6.createElement(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/asset/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/player-context.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n }\n\n /** Add a listener to state changes */\n public addListener(callback: StateChangeCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n }\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\n/** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */\nexport const createPersistentStateMachine = (\n keyRef: React.MutableRefObject<ManagedPlayerStateKey>,\n middleware?: ManagerMiddleware,\n): ManagedState => {\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\n\n return managedState;\n};\n\n/**\n * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.\n * Provide a valid `FlowManager` to handle fetching the next flow.\n *\n * `suspense` must be enabled to wait for results in flight.\n */\nexport const ManagedPlayer = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\n const keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();\n\n const initialState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n\n const [managedState, setManagedState] = React.useState(initialState);\n const [state, setState] = React.useState(managedState.state);\n\n React.useEffect(() => {\n const unsub = managedState.addListener({\n onState: (s) => {\n setState(s);\n },\n });\n return unsub;\n }, []);\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n if (props.manager !== state.context.manager) {\n const newManagedState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n setManagedState(newManagedState);\n setState(newManagedState.state);\n } else {\n props.onComplete?.(state?.context.result);\n }\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n } else if (state === undefined) {\n managedState.start({\n manager: props.manager,\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context.reactPlayer.player.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context.reactPlayer.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["React","React","React","React","ReactPlayer","React","React","React","ReactPlayer","React","ReactPlayer","React"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/asset/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/player-context.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim/index.js\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n // this.state = {\n // value: \"uninitialized\",\n // context: {},\n // };\n }\n\n /** Add a listener to state changes */\n public addListener = (callback: StateChangeCallback): (() => void) => {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n };\n\n public getSnapshot = (): ManagedPlayerState | undefined => {\n return this.state;\n };\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\n/**\n * Helper to make a unique symbol\n */\nfunction createKey() {\n return {\n _key: Symbol(\"managed-player\"),\n };\n}\n\n/** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */\nexport const createPersistentStateMachine = (\n keyRef: React.MutableRefObject<ManagedPlayerStateKey>,\n middleware?: ManagerMiddleware,\n): ManagedState => {\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\n\n return managedState;\n};\n\n/**\n * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.\n * Provide a valid `FlowManager` to handle fetching the next flow.\n *\n * `suspense` must be enabled to wait for results in flight.\n */\nexport const ManagedPlayer = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\n const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());\n const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();\n\n const initialState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n\n const [managedState, setManagedState] = React.useState(initialState);\n const wrappedListener = React.useCallback(\n (cb: (s: ManagedPlayerState) => void) => {\n return managedState.addListener({\n onState(s) {\n cb(s);\n },\n });\n },\n [managedState],\n );\n\n // const [state, setState] = React.useState(managedState.state);\n const state = useSyncExternalStore(wrappedListener, managedState.getSnapshot);\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n if (props.manager !== state.context.manager) {\n keyRef.current = createKey();\n const newManagedState = createPersistentStateMachine(keyRef, {\n next: withRequestTime,\n });\n setManagedState(newManagedState);\n // setState(newManagedState.state);\n } else {\n props.onComplete?.(state?.context.result);\n }\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n } else if (state === undefined) {\n managedState.start({\n manager: props.manager,\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context?.reactPlayer?.player?.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context?.reactPlayer?.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["React","React","React","React","ReactPlayer","React","React","React","ReactPlayer","React","ReactPlayer","React"]}
package/package.json CHANGED
@@ -6,16 +6,18 @@
6
6
  "types"
7
7
  ],
8
8
  "name": "@player-ui/react",
9
- "version": "0.10.5--canary.606.20861",
9
+ "version": "0.10.5--canary.606.20908",
10
10
  "main": "dist/cjs/index.cjs",
11
11
  "dependencies": {
12
- "@player-ui/metrics-plugin": "0.10.5--canary.606.20861",
13
- "@player-ui/partial-match-registry": "0.10.5--canary.606.20861",
14
- "@player-ui/player": "0.10.5--canary.606.20861",
15
- "@player-ui/react-subscribe": "0.10.5--canary.606.20861",
12
+ "@player-ui/metrics-plugin": "0.10.5--canary.606.20908",
13
+ "@player-ui/partial-match-registry": "0.10.5--canary.606.20908",
14
+ "@player-ui/player": "0.10.5--canary.606.20908",
15
+ "@player-ui/react-subscribe": "0.10.5--canary.606.20908",
16
+ "@types/use-sync-external-store": "^0.0.6",
16
17
  "react-error-boundary": "^3.1.3",
17
18
  "tapable-ts": "^0.2.3",
18
19
  "leven": "3.1.0",
20
+ "use-sync-external-store": "^1.4.0",
19
21
  "tslib": "^2.6.2"
20
22
  },
21
23
  "devDependencies": {
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
2
3
  import type {
3
4
  FlowManager,
4
5
  ManagedPlayerProps,
@@ -41,16 +42,24 @@ class ManagedState {
41
42
  }) {
42
43
  this.middleware = middleware;
43
44
  this.callbacks = [];
45
+ // this.state = {
46
+ // value: "uninitialized",
47
+ // context: {},
48
+ // };
44
49
  }
45
50
 
46
51
  /** Add a listener to state changes */
47
- public addListener(callback: StateChangeCallback): () => void {
52
+ public addListener = (callback: StateChangeCallback): (() => void) => {
48
53
  this.callbacks.push(callback);
49
54
 
50
55
  return () => {
51
56
  this.callbacks = this.callbacks.filter((s) => s !== callback);
52
57
  };
53
- }
58
+ };
59
+
60
+ public getSnapshot = (): ManagedPlayerState | undefined => {
61
+ return this.state;
62
+ };
54
63
 
55
64
  /** start the managed flow */
56
65
  public start(options: {
@@ -208,6 +217,15 @@ const managedPlayerStateMachines = new WeakMap<
208
217
  ManagedState
209
218
  >();
210
219
 
220
+ /**
221
+ * Helper to make a unique symbol
222
+ */
223
+ function createKey() {
224
+ return {
225
+ _key: Symbol("managed-player"),
226
+ };
227
+ }
228
+
211
229
  /** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */
212
230
  export const createPersistentStateMachine = (
213
231
  keyRef: React.MutableRefObject<ManagedPlayerStateKey>,
@@ -230,10 +248,7 @@ export const createPersistentStateMachine = (
230
248
  export const ManagedPlayer = (
231
249
  props: ManagedPlayerProps,
232
250
  ): React.JSX.Element | null => {
233
- const keyRef = React.useRef<ManagedPlayerStateKey>({
234
- _key: Symbol("managed-player"),
235
- });
236
-
251
+ const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());
237
252
  const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
238
253
 
239
254
  const initialState = createPersistentStateMachine(keyRef, {
@@ -241,25 +256,29 @@ export const ManagedPlayer = (
241
256
  });
242
257
 
243
258
  const [managedState, setManagedState] = React.useState(initialState);
244
- const [state, setState] = React.useState(managedState.state);
259
+ const wrappedListener = React.useCallback(
260
+ (cb: (s: ManagedPlayerState) => void) => {
261
+ return managedState.addListener({
262
+ onState(s) {
263
+ cb(s);
264
+ },
265
+ });
266
+ },
267
+ [managedState],
268
+ );
245
269
 
246
- React.useEffect(() => {
247
- const unsub = managedState.addListener({
248
- onState: (s) => {
249
- setState(s);
250
- },
251
- });
252
- return unsub;
253
- }, []);
270
+ // const [state, setState] = React.useState(managedState.state);
271
+ const state = useSyncExternalStore(wrappedListener, managedState.getSnapshot);
254
272
 
255
273
  React.useEffect(() => {
256
274
  if (state?.value === "ended") {
257
275
  if (props.manager !== state.context.manager) {
276
+ keyRef.current = createKey();
258
277
  const newManagedState = createPersistentStateMachine(keyRef, {
259
278
  next: withRequestTime,
260
279
  });
261
280
  setManagedState(newManagedState);
262
- setState(newManagedState.state);
281
+ // setState(newManagedState.state);
263
282
  } else {
264
283
  props.onComplete?.(state?.context.result);
265
284
  }
@@ -280,13 +299,13 @@ export const ManagedPlayer = (
280
299
 
281
300
  React.useEffect(() => {
282
301
  return () => {
283
- const playerState = state?.context.reactPlayer.player.getState();
302
+ const playerState = state?.context?.reactPlayer?.player?.getState();
284
303
 
285
304
  if (state?.value === "running" && playerState?.status === "in-progress") {
286
305
  props.manager.terminate?.(playerState.controllers.data.serialize());
287
306
  }
288
307
  };
289
- }, [props.manager, state?.context.reactPlayer.player, state?.value]);
308
+ }, [props.manager, state?.context?.reactPlayer?.player, state?.value]);
290
309
 
291
310
  if (state?.value === "error") {
292
311
  if (props.fallbackComponent) {
@@ -21,7 +21,8 @@ declare class ManagedState {
21
21
  middleware?: ManagerMiddleware;
22
22
  });
23
23
  /** Add a listener to state changes */
24
- addListener(callback: StateChangeCallback): () => void;
24
+ addListener: (callback: StateChangeCallback) => (() => void);
25
+ getSnapshot: () => ManagedPlayerState | undefined;
25
26
  /** start the managed flow */
26
27
  start(options: {
27
28
  /** the flow manager to use */