@player-ui/react 0.10.5--canary.606.20937 → 0.10.5--canary.611.20992

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.
@@ -39,7 +39,6 @@ __export(src_exports, {
39
39
  WebPlayer: () => WebPlayer,
40
40
  buildUrl: () => buildUrl,
41
41
  callOrReturn: () => callOrReturn,
42
- createPersistentStateMachine: () => createPersistentStateMachine,
43
42
  isEmptyObject: () => isEmptyObject,
44
43
  isFunction: () => isFunction,
45
44
  removeEmptyValuesFromObject: () => removeEmptyValuesFromObject,
@@ -48,6 +47,7 @@ __export(src_exports, {
48
47
  useGetConstant: () => useGetConstant,
49
48
  useGetConstantByType: () => useGetConstantByType,
50
49
  useLogger: () => useLogger,
50
+ usePersistentStateMachine: () => usePersistentStateMachine,
51
51
  usePlayer: () => usePlayer,
52
52
  useReactPlayer: () => useReactPlayer,
53
53
  useRequestTime: () => useRequestTime
@@ -596,23 +596,12 @@ var ManagedState = class {
596
596
  }
597
597
  };
598
598
  var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
599
- function createKey() {
600
- return {
599
+ var usePersistentStateMachine = (options) => {
600
+ const keyRef = import_react7.default.useRef({
601
601
  _key: Symbol("managed-player")
602
- };
603
- }
604
- var createPersistentStateMachine = (keyRef, middleware) => {
605
- const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware });
606
- managedPlayerStateMachines.set(keyRef.current, managedState);
607
- return managedState;
608
- };
609
- var ManagedPlayer = (props) => {
610
- const keyRef = import_react7.default.useRef(createKey());
611
- const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
612
- const initialState = createPersistentStateMachine(keyRef, {
613
- next: withRequestTime
614
602
  });
615
- const [managedState, setManagedState] = import_react7.default.useState(initialState);
603
+ const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware: options.middleware });
604
+ managedPlayerStateMachines.set(keyRef.current, managedState);
616
605
  const [state, setState] = import_react7.default.useState(managedState.state);
617
606
  import_react7.default.useEffect(() => {
618
607
  const unsub = managedState.addListener({
@@ -620,32 +609,30 @@ var ManagedPlayer = (props) => {
620
609
  setState(s);
621
610
  }
622
611
  });
612
+ if (managedState.state === void 0) {
613
+ managedState.start(options);
614
+ }
623
615
  return unsub;
624
616
  }, []);
617
+ return { managedState, state };
618
+ };
619
+ var ManagedPlayer = (props) => {
620
+ const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
621
+ const { state, managedState } = usePersistentStateMachine({
622
+ manager: props.manager,
623
+ middleware: { next: withRequestTime },
624
+ playerConfig: {
625
+ plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
626
+ player: props.player
627
+ }
628
+ });
625
629
  import_react7.default.useEffect(() => {
626
630
  if (state?.value === "ended") {
627
- if (props.manager !== state.context.manager) {
628
- keyRef.current = createKey();
629
- const newManagedState = createPersistentStateMachine(keyRef, {
630
- next: withRequestTime
631
- });
632
- setManagedState(newManagedState);
633
- setState(newManagedState.state);
634
- } else {
635
- props.onComplete?.(state?.context.result);
636
- }
631
+ props.onComplete?.(state?.context.result);
637
632
  } else if (state?.value === "error") {
638
633
  props.onError?.(state?.context.error);
639
634
  } else if (state?.value === "running") {
640
635
  props.onStartedFlow?.();
641
- } else if (state === void 0) {
642
- managedState.start({
643
- manager: props.manager,
644
- playerConfig: {
645
- plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
646
- player: props.player
647
- }
648
- });
649
636
  }
650
637
  }, [state]);
651
638
  import_react7.default.useEffect(() => {
@@ -691,7 +678,6 @@ var ManagedPlayer = (props) => {
691
678
  WebPlayer,
692
679
  buildUrl,
693
680
  callOrReturn,
694
- createPersistentStateMachine,
695
681
  isEmptyObject,
696
682
  isFunction,
697
683
  removeEmptyValuesFromObject,
@@ -700,6 +686,7 @@ var ManagedPlayer = (props) => {
700
686
  useGetConstant,
701
687
  useGetConstantByType,
702
688
  useLogger,
689
+ usePersistentStateMachine,
703
690
  usePlayer,
704
691
  useReactPlayer,
705
692
  useRequestTime,
@@ -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/**\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 [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 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"]}
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 }) {\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() {\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() {\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 renders (due to Suspense) */\nexport const usePersistentStateMachine = (options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** Player config */\n playerConfig: ReactPlayerOptions;\n\n /** Any middleware for the manager */\n middleware?: ManagerMiddleware;\n}) => {\n const keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: options.middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\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\n if (managedState.state === undefined) {\n managedState.start(options);\n }\n\n return unsub;\n }, []);\n\n return { managedState, state };\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 = (props: ManagedPlayerProps) => {\n const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();\n\n const { state, managedState } = usePersistentStateMachine({\n manager: props.manager,\n middleware: { next: withRequestTime },\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n props.onComplete?.(state?.context.result);\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\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"]}
@@ -545,23 +545,12 @@ var ManagedState = class {
545
545
  }
546
546
  };
547
547
  var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
548
- function createKey() {
549
- return {
548
+ var usePersistentStateMachine = (options) => {
549
+ const keyRef = React6.useRef({
550
550
  _key: Symbol("managed-player")
551
- };
552
- }
553
- var createPersistentStateMachine = (keyRef, middleware) => {
554
- const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware });
555
- managedPlayerStateMachines.set(keyRef.current, managedState);
556
- return managedState;
557
- };
558
- var ManagedPlayer = (props) => {
559
- const keyRef = React6.useRef(createKey());
560
- const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
561
- const initialState = createPersistentStateMachine(keyRef, {
562
- next: withRequestTime
563
551
  });
564
- const [managedState, setManagedState] = React6.useState(initialState);
552
+ const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware: options.middleware });
553
+ managedPlayerStateMachines.set(keyRef.current, managedState);
565
554
  const [state, setState] = React6.useState(managedState.state);
566
555
  React6.useEffect(() => {
567
556
  const unsub = managedState.addListener({
@@ -569,32 +558,30 @@ var ManagedPlayer = (props) => {
569
558
  setState(s);
570
559
  }
571
560
  });
561
+ if (managedState.state === void 0) {
562
+ managedState.start(options);
563
+ }
572
564
  return unsub;
573
565
  }, []);
566
+ return { managedState, state };
567
+ };
568
+ var ManagedPlayer = (props) => {
569
+ const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
570
+ const { state, managedState } = usePersistentStateMachine({
571
+ manager: props.manager,
572
+ middleware: { next: withRequestTime },
573
+ playerConfig: {
574
+ plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
575
+ player: props.player
576
+ }
577
+ });
574
578
  React6.useEffect(() => {
575
579
  if (state?.value === "ended") {
576
- if (props.manager !== state.context.manager) {
577
- keyRef.current = createKey();
578
- const newManagedState = createPersistentStateMachine(keyRef, {
579
- next: withRequestTime
580
- });
581
- setManagedState(newManagedState);
582
- setState(newManagedState.state);
583
- } else {
584
- props.onComplete?.(state?.context.result);
585
- }
580
+ props.onComplete?.(state?.context.result);
586
581
  } else if (state?.value === "error") {
587
582
  props.onError?.(state?.context.error);
588
583
  } else if (state?.value === "running") {
589
584
  props.onStartedFlow?.();
590
- } else if (state === void 0) {
591
- managedState.start({
592
- manager: props.manager,
593
- playerConfig: {
594
- plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
595
- player: props.player
596
- }
597
- });
598
585
  }
599
586
  }, [state]);
600
587
  React6.useEffect(() => {
@@ -639,7 +626,6 @@ export {
639
626
  WebPlayer,
640
627
  buildUrl,
641
628
  callOrReturn,
642
- createPersistentStateMachine,
643
629
  isEmptyObject,
644
630
  isFunction,
645
631
  removeEmptyValuesFromObject,
@@ -648,6 +634,7 @@ export {
648
634
  useGetConstant,
649
635
  useGetConstantByType,
650
636
  useLogger,
637
+ usePersistentStateMachine,
651
638
  usePlayer,
652
639
  useReactPlayer,
653
640
  useRequestTime
package/dist/index.mjs CHANGED
@@ -545,23 +545,12 @@ var ManagedState = class {
545
545
  }
546
546
  };
547
547
  var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
548
- function createKey() {
549
- return {
548
+ var usePersistentStateMachine = (options) => {
549
+ const keyRef = React6.useRef({
550
550
  _key: Symbol("managed-player")
551
- };
552
- }
553
- var createPersistentStateMachine = (keyRef, middleware) => {
554
- const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware });
555
- managedPlayerStateMachines.set(keyRef.current, managedState);
556
- return managedState;
557
- };
558
- var ManagedPlayer = (props) => {
559
- const keyRef = React6.useRef(createKey());
560
- const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
561
- const initialState = createPersistentStateMachine(keyRef, {
562
- next: withRequestTime
563
551
  });
564
- const [managedState, setManagedState] = React6.useState(initialState);
552
+ const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware: options.middleware });
553
+ managedPlayerStateMachines.set(keyRef.current, managedState);
565
554
  const [state, setState] = React6.useState(managedState.state);
566
555
  React6.useEffect(() => {
567
556
  const unsub = managedState.addListener({
@@ -569,32 +558,30 @@ var ManagedPlayer = (props) => {
569
558
  setState(s);
570
559
  }
571
560
  });
561
+ if (managedState.state === void 0) {
562
+ managedState.start(options);
563
+ }
572
564
  return unsub;
573
565
  }, []);
566
+ return { managedState, state };
567
+ };
568
+ var ManagedPlayer = (props) => {
569
+ const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
570
+ const { state, managedState } = usePersistentStateMachine({
571
+ manager: props.manager,
572
+ middleware: { next: withRequestTime },
573
+ playerConfig: {
574
+ plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
575
+ player: props.player
576
+ }
577
+ });
574
578
  React6.useEffect(() => {
575
579
  if (state?.value === "ended") {
576
- if (props.manager !== state.context.manager) {
577
- keyRef.current = createKey();
578
- const newManagedState = createPersistentStateMachine(keyRef, {
579
- next: withRequestTime
580
- });
581
- setManagedState(newManagedState);
582
- setState(newManagedState.state);
583
- } else {
584
- props.onComplete?.(state?.context.result);
585
- }
580
+ props.onComplete?.(state?.context.result);
586
581
  } else if (state?.value === "error") {
587
582
  props.onError?.(state?.context.error);
588
583
  } else if (state?.value === "running") {
589
584
  props.onStartedFlow?.();
590
- } else if (state === void 0) {
591
- managedState.start({
592
- manager: props.manager,
593
- playerConfig: {
594
- plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
595
- player: props.player
596
- }
597
- });
598
585
  }
599
586
  }, [state]);
600
587
  React6.useEffect(() => {
@@ -639,7 +626,6 @@ export {
639
626
  WebPlayer,
640
627
  buildUrl,
641
628
  callOrReturn,
642
- createPersistentStateMachine,
643
629
  isEmptyObject,
644
630
  isFunction,
645
631
  removeEmptyValuesFromObject,
@@ -648,6 +634,7 @@ export {
648
634
  useGetConstant,
649
635
  useGetConstantByType,
650
636
  useLogger,
637
+ usePersistentStateMachine,
651
638
  usePlayer,
652
639
  useReactPlayer,
653
640
  useRequestTime
@@ -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/**\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 [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 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"]}
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 }) {\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() {\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() {\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 renders (due to Suspense) */\nexport const usePersistentStateMachine = (options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** Player config */\n playerConfig: ReactPlayerOptions;\n\n /** Any middleware for the manager */\n middleware?: ManagerMiddleware;\n}) => {\n const keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: options.middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\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\n if (managedState.state === undefined) {\n managedState.start(options);\n }\n\n return unsub;\n }, []);\n\n return { managedState, state };\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 = (props: ManagedPlayerProps) => {\n const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();\n\n const { state, managedState } = usePersistentStateMachine({\n manager: props.manager,\n middleware: { next: withRequestTime },\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n props.onComplete?.(state?.context.result);\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\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,13 +6,13 @@
6
6
  "types"
7
7
  ],
8
8
  "name": "@player-ui/react",
9
- "version": "0.10.5--canary.606.20937",
9
+ "version": "0.10.5--canary.611.20992",
10
10
  "main": "dist/cjs/index.cjs",
11
11
  "dependencies": {
12
- "@player-ui/metrics-plugin": "0.10.5--canary.606.20937",
13
- "@player-ui/partial-match-registry": "0.10.5--canary.606.20937",
14
- "@player-ui/player": "0.10.5--canary.606.20937",
15
- "@player-ui/react-subscribe": "0.10.5--canary.606.20937",
12
+ "@player-ui/metrics-plugin": "0.10.5--canary.611.20992",
13
+ "@player-ui/partial-match-registry": "0.10.5--canary.611.20992",
14
+ "@player-ui/player": "0.10.5--canary.611.20992",
15
+ "@player-ui/react-subscribe": "0.10.5--canary.611.20992",
16
16
  "react-error-boundary": "^3.1.3",
17
17
  "tapable-ts": "^0.2.3",
18
18
  "leven": "3.1.0",
@@ -59,7 +59,7 @@ class ManagedState {
59
59
 
60
60
  /** the config to use when creating a player */
61
61
  playerConfig: ReactPlayerOptions;
62
- }): this {
62
+ }) {
63
63
  const initialState: ManagedPlayerState = {
64
64
  value: "not_started",
65
65
  context: {
@@ -75,7 +75,7 @@ class ManagedState {
75
75
  }
76
76
 
77
77
  /** reset starts from nothing */
78
- public reset(): void {
78
+ public reset() {
79
79
  if (this.state?.value === "error") {
80
80
  const { playerConfig, manager } = this.state.context;
81
81
  this.start({ playerConfig, manager });
@@ -85,7 +85,7 @@ class ManagedState {
85
85
  }
86
86
 
87
87
  /** restart starts from the last result */
88
- public restart(): void {
88
+ public restart() {
89
89
  if (this.state?.value === "error") {
90
90
  const { playerConfig, manager, prevResult, reactPlayer } =
91
91
  this.state.context;
@@ -208,26 +208,42 @@ const managedPlayerStateMachines = new WeakMap<
208
208
  ManagedState
209
209
  >();
210
210
 
211
- /**
212
- * Helper to make a unique symbol
213
- */
214
- function createKey() {
215
- return {
211
+ /** Creates an x-state state machine that persists when this component is no longer renders (due to Suspense) */
212
+ export const usePersistentStateMachine = (options: {
213
+ /** the flow manager to use */
214
+ manager: FlowManager;
215
+
216
+ /** Player config */
217
+ playerConfig: ReactPlayerOptions;
218
+
219
+ /** Any middleware for the manager */
220
+ middleware?: ManagerMiddleware;
221
+ }) => {
222
+ const keyRef = React.useRef<ManagedPlayerStateKey>({
216
223
  _key: Symbol("managed-player"),
217
- };
218
- }
224
+ });
219
225
 
220
- /** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */
221
- export const createPersistentStateMachine = (
222
- keyRef: React.MutableRefObject<ManagedPlayerStateKey>,
223
- middleware?: ManagerMiddleware,
224
- ): ManagedState => {
225
226
  const managedState =
226
227
  managedPlayerStateMachines.get(keyRef.current) ??
227
- new ManagedState({ middleware: middleware });
228
+ new ManagedState({ middleware: options.middleware });
228
229
  managedPlayerStateMachines.set(keyRef.current, managedState);
230
+ const [state, setState] = React.useState(managedState.state);
231
+
232
+ React.useEffect(() => {
233
+ const unsub = managedState.addListener({
234
+ onState: (s) => {
235
+ setState(s);
236
+ },
237
+ });
238
+
239
+ if (managedState.state === undefined) {
240
+ managedState.start(options);
241
+ }
229
242
 
230
- return managedState;
243
+ return unsub;
244
+ }, []);
245
+
246
+ return { managedState, state };
231
247
  };
232
248
 
233
249
  /**
@@ -236,52 +252,25 @@ export const createPersistentStateMachine = (
236
252
  *
237
253
  * `suspense` must be enabled to wait for results in flight.
238
254
  */
239
- export const ManagedPlayer = (
240
- props: ManagedPlayerProps,
241
- ): React.JSX.Element | null => {
242
- const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());
255
+ export const ManagedPlayer = (props: ManagedPlayerProps) => {
243
256
  const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
244
257
 
245
- const initialState = createPersistentStateMachine(keyRef, {
246
- next: withRequestTime,
258
+ const { state, managedState } = usePersistentStateMachine({
259
+ manager: props.manager,
260
+ middleware: { next: withRequestTime },
261
+ playerConfig: {
262
+ plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],
263
+ player: props.player,
264
+ },
247
265
  });
248
266
 
249
- const [managedState, setManagedState] = React.useState(initialState);
250
- const [state, setState] = React.useState(managedState.state);
251
-
252
- React.useEffect(() => {
253
- const unsub = managedState.addListener({
254
- onState: (s) => {
255
- setState(s);
256
- },
257
- });
258
- return unsub;
259
- }, []);
260
-
261
267
  React.useEffect(() => {
262
268
  if (state?.value === "ended") {
263
- if (props.manager !== state.context.manager) {
264
- keyRef.current = createKey();
265
- const newManagedState = createPersistentStateMachine(keyRef, {
266
- next: withRequestTime,
267
- });
268
- setManagedState(newManagedState);
269
- setState(newManagedState.state);
270
- } else {
271
- props.onComplete?.(state?.context.result);
272
- }
269
+ props.onComplete?.(state?.context.result);
273
270
  } else if (state?.value === "error") {
274
271
  props.onError?.(state?.context.error);
275
272
  } else if (state?.value === "running") {
276
273
  props.onStartedFlow?.();
277
- } else if (state === undefined) {
278
- managedState.start({
279
- manager: props.manager,
280
- playerConfig: {
281
- plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],
282
- player: props.player,
283
- },
284
- });
285
274
  }
286
275
  }, [state]);
287
276
 
@@ -1,10 +1,6 @@
1
1
  import React from "react";
2
- import type { FlowManager, ManagedPlayerProps, ManagedPlayerState, ManagerMiddleware } from "./types";
2
+ import type { FlowManager, ManagedPlayerProps, ManagedPlayerState, ManagerMiddleware, ManagedPlayerContext } from "./types";
3
3
  import type { ReactPlayerOptions } from "../player";
4
- interface ManagedPlayerStateKey {
5
- /** the storage key for the state (outside of the react tree) */
6
- _key: symbol;
7
- }
8
4
  export interface StateChangeCallback {
9
5
  /** Trigger for state changes */
10
6
  onState: (s: ManagedPlayerState) => void;
@@ -36,8 +32,56 @@ declare class ManagedState {
36
32
  private setState;
37
33
  private processState;
38
34
  }
39
- /** Creates an x-state state machine that persists when this component is no longer rendered (due to Suspense) */
40
- export declare const createPersistentStateMachine: (keyRef: React.MutableRefObject<ManagedPlayerStateKey>, middleware?: ManagerMiddleware) => ManagedState;
35
+ /** Creates an x-state state machine that persists when this component is no longer renders (due to Suspense) */
36
+ export declare const usePersistentStateMachine: (options: {
37
+ /** the flow manager to use */
38
+ manager: FlowManager;
39
+ /** Player config */
40
+ playerConfig: ReactPlayerOptions;
41
+ /** Any middleware for the manager */
42
+ middleware?: ManagerMiddleware;
43
+ }) => {
44
+ managedState: ManagedState;
45
+ state: {
46
+ value: "not_started";
47
+ context: ManagedPlayerContext;
48
+ } | {
49
+ value: "pending";
50
+ context: ManagedPlayerContext & {
51
+ prevResult?: import("@player-ui/player").CompletedState;
52
+ next: Promise<import("./types").FinalState | import("./types").NextState<import("@player-ui/player").Flow>>;
53
+ };
54
+ } | {
55
+ value: "loaded";
56
+ context: ManagedPlayerContext & {
57
+ flow: import("@player-ui/player").Flow;
58
+ prevResult?: import("@player-ui/player").CompletedState;
59
+ };
60
+ } | {
61
+ value: "running";
62
+ context: ManagedPlayerContext & {
63
+ flow: import("@player-ui/player").Flow;
64
+ result: Promise<import("@player-ui/player").CompletedState>;
65
+ prevResult?: import("@player-ui/player").CompletedState;
66
+ };
67
+ } | {
68
+ value: "completed";
69
+ context: ManagedPlayerContext & {
70
+ result?: import("@player-ui/player").CompletedState;
71
+ };
72
+ } | {
73
+ value: "ended";
74
+ context: ManagedPlayerContext & {
75
+ result?: import("@player-ui/player").CompletedState;
76
+ };
77
+ } | {
78
+ value: "error";
79
+ context: ManagedPlayerContext & {
80
+ error: Error;
81
+ prevResult?: import("@player-ui/player").CompletedState;
82
+ };
83
+ } | undefined;
84
+ };
41
85
  /**
42
86
  * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.
43
87
  * Provide a valid `FlowManager` to handle fetching the next flow.