@player-ui/react 1.1.0--canary.866.38513 → 1.1.0--canary.866.38904
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +17 -9
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +17 -9
- package/dist/index.mjs +17 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/manager/__tests__/managed-player.test.tsx +53 -0
- package/src/manager/managed-player.tsx +20 -5
- package/src/manager/types.ts +15 -1
- package/types/manager/managed-player.d.ts +5 -0
- package/types/manager/types.d.ts +8 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -628,7 +628,8 @@ var ManagedState = class {
|
|
|
628
628
|
context: {
|
|
629
629
|
playerConfig: options.playerConfig,
|
|
630
630
|
reactPlayer: new ReactPlayer2(options.playerConfig),
|
|
631
|
-
manager: options.manager
|
|
631
|
+
manager: options.manager,
|
|
632
|
+
startOptions: options.startOptions
|
|
632
633
|
}
|
|
633
634
|
};
|
|
634
635
|
this.setState(initialState);
|
|
@@ -637,8 +638,8 @@ var ManagedState = class {
|
|
|
637
638
|
/** reset starts from nothing */
|
|
638
639
|
reset() {
|
|
639
640
|
if (this.state?.value === "error") {
|
|
640
|
-
const { playerConfig, manager } = this.state.context;
|
|
641
|
-
this.start({ playerConfig, manager });
|
|
641
|
+
const { playerConfig, manager, startOptions } = this.state.context;
|
|
642
|
+
this.start({ playerConfig, manager, startOptions });
|
|
642
643
|
} else {
|
|
643
644
|
throw new Error("Flow must be in error state to reset");
|
|
644
645
|
}
|
|
@@ -646,14 +647,15 @@ var ManagedState = class {
|
|
|
646
647
|
/** restart starts from the last result */
|
|
647
648
|
restart() {
|
|
648
649
|
if (this.state?.value === "error") {
|
|
649
|
-
const { playerConfig, manager, prevResult, reactPlayer } = this.state.context;
|
|
650
|
+
const { playerConfig, manager, prevResult, reactPlayer, startOptions } = this.state.context;
|
|
650
651
|
this.setState({
|
|
651
652
|
value: "completed",
|
|
652
653
|
context: {
|
|
653
654
|
playerConfig,
|
|
654
655
|
manager,
|
|
655
656
|
result: prevResult,
|
|
656
|
-
reactPlayer
|
|
657
|
+
reactPlayer,
|
|
658
|
+
startOptions
|
|
657
659
|
}
|
|
658
660
|
});
|
|
659
661
|
} else {
|
|
@@ -667,12 +669,13 @@ var ManagedState = class {
|
|
|
667
669
|
c(this.state);
|
|
668
670
|
}
|
|
669
671
|
});
|
|
670
|
-
const { manager, reactPlayer, playerConfig } = state.context;
|
|
672
|
+
const { manager, reactPlayer, playerConfig, startOptions } = state.context;
|
|
671
673
|
try {
|
|
672
674
|
const nextState = await this.processState(state, {
|
|
673
675
|
manager,
|
|
674
676
|
reactPlayer,
|
|
675
|
-
playerConfig
|
|
677
|
+
playerConfig,
|
|
678
|
+
startOptions
|
|
676
679
|
});
|
|
677
680
|
if (nextState) {
|
|
678
681
|
this.setState(nextState);
|
|
@@ -684,6 +687,7 @@ var ManagedState = class {
|
|
|
684
687
|
manager,
|
|
685
688
|
reactPlayer,
|
|
686
689
|
playerConfig,
|
|
690
|
+
startOptions,
|
|
687
691
|
error: e
|
|
688
692
|
}
|
|
689
693
|
});
|
|
@@ -729,7 +733,10 @@ var ManagedState = class {
|
|
|
729
733
|
...context,
|
|
730
734
|
flow: state.context.flow,
|
|
731
735
|
prevResult: state.context.prevResult,
|
|
732
|
-
result: state.context.reactPlayer.start(
|
|
736
|
+
result: state.context.reactPlayer.start(
|
|
737
|
+
state.context.flow,
|
|
738
|
+
state.context.startOptions
|
|
739
|
+
)
|
|
733
740
|
}
|
|
734
741
|
};
|
|
735
742
|
}
|
|
@@ -815,7 +822,8 @@ var ManagedPlayer = (props) => {
|
|
|
815
822
|
playerConfig: {
|
|
816
823
|
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
|
|
817
824
|
player: props.player
|
|
818
|
-
}
|
|
825
|
+
},
|
|
826
|
+
startOptions: props.startOptions
|
|
819
827
|
});
|
|
820
828
|
const previousState = import_react7.default.useRef();
|
|
821
829
|
if (state?.value !== previousState.current?.value) {
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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/asset/AssetRenderError.ts","../../../../../../../../../../../../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","import React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport {\n Subscribe,\n useSubscribedState,\n useSubscriber,\n} from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n View,\n PlayerInfo,\n StartOptions,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary, FallbackProps } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport { ReactPlayer as PlayerComp } from \"./app\";\nimport { OnUpdatePlugin } from \"./plugins/onupdate-plugin\";\n\n/** Backup context for receiving ReactPlayerComponentProps when components setup in the webComponent call don't pass the props down to their inner components. */\nexport const ReactPlayerPropsContext: React.Context<ReactPlayerComponentProps> =\n React.createContext<ReactPlayerComponentProps>({ isInErrorState: false });\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\n// Alias until more properties are added\nexport type ReactPlayerInfo = PlayerInfo;\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 = {\n /** Whether or not player is currently recovering from an error. */\n isInErrorState?: boolean;\n [key: string]: unknown;\n};\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: SyncWaterfallHook<\n [React.ComponentType<any>],\n Record<string, any>\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: SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>],\n Record<string, any>\n >;\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: AsyncParallelHook<[], Record<string, any>>;\n } = {\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(),\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\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook(),\n };\n\n public readonly viewUpdateSubscription: Subscribe<View> =\n 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 version: this.player.getVersion(),\n commit: this.player.getCommit(),\n };\n }\n\n /** Returns the current version Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /** Returns the git commit used to build this Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 | PlayerPlugin): void {\n if (plugin.apply) {\n this.player.registerPlugin(plugin as PlayerPlugin);\n }\n\n if ((plugin as ReactPlayerPlugin).applyReact) {\n (plugin as ReactPlayerPlugin).applyReact?.(this);\n }\n\n if (!this.options.plugins) {\n this.options.plugins = [];\n }\n\n this.options.plugins.push(plugin);\n }\n\n /**\n * Returns the current version of the running React Player\n * @deprecated use `getPlayerVersion()` instead. Will be removed next major\n */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /**\n * Returns the git commit used to build the React Player version\n * @deprecated use `getPlayerCommit()` instead. Will be removed next major\n */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 const trackedErrors = React.useRef(new Map<Error, boolean>());\n const [errorSubId, setErrorSubId] = React.useState<number | undefined>(\n undefined,\n );\n const { subscribe, unsubscribe } = useSubscriber(\n this.viewUpdateSubscription,\n );\n\n const componentProps: ReactPlayerComponentProps = React.useMemo(\n () => ({\n ...props,\n isInErrorState: errorSubId !== undefined,\n }),\n [props, errorSubId],\n );\n\n /** Callback to remove all tracked errors and unsub from */\n const clearErrorTracking = React.useCallback(() => {\n trackedErrors.current.clear();\n setErrorSubId((prev) => {\n if (prev !== undefined) {\n unsubscribe(prev);\n }\n\n return undefined;\n });\n }, []);\n\n React.useEffect(() => {\n // Clear errors and error subscription on unmount\n return clearErrorTracking;\n }, [clearErrorTracking]);\n\n /** capture error and return true or false to represent if we are recovering from the error or not. */\n const captureError = React.useCallback(\n (err: Error) => {\n // If player isn't in progress we can't actually render anything so render errors are irrelevant.\n const playerState = this.player.getState();\n if (playerState.status !== \"in-progress\") {\n this.player.logger.warn(\n `[ReactPlayer]: An error occurred during rendering but was ignored due to a change in the player state (current state: '${playerState.status}'). Error Details:`,\n err,\n );\n return false;\n }\n\n // Only capture each error once.\n const currentError = trackedErrors.current.get(err);\n if (currentError !== undefined) {\n return currentError;\n }\n\n let isRecovering = false;\n setErrorSubId((prev) => {\n // subscribe only if no subscription available.\n // Needs to happen before capture error to ensure error recovery isn't missed\n const subId =\n prev === undefined\n ? subscribe(clearErrorTracking, {\n initializeWithPreviousValue: false,\n })\n : prev;\n\n // Get skipped state after trying to capture.\n isRecovering = playerState.controllers.error.captureError(err);\n trackedErrors.current.set(err, isRecovering);\n\n // If we can't recover from the error, avoid updating state to stay in error boundary\n if (!isRecovering) {\n // Unsub if not previously subbed since we don't need to reset the view\n if (subId !== prev) {\n unsubscribe(subId);\n }\n return prev;\n }\n\n return subId;\n });\n\n return isRecovering;\n },\n [errorSubId],\n );\n\n return (\n <ErrorBoundary\n fallbackRender={(fallbackProps: FallbackProps) => {\n const isRecovering = captureError(fallbackProps.error);\n\n if (!isRecovering) {\n // Display nothing if not recovering. Let the player state fail and handle what the view will be.\n return null;\n }\n fallbackProps.resetErrorBoundary();\n\n // Render the same as on success when recovering to preserve the react tree.\n return (\n <ReactPlayerPropsContext.Provider\n value={{ ...componentProps, isInErrorState: true }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} isInErrorState />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.Provider>\n );\n }}\n >\n <ReactPlayerPropsContext.Provider value={{ ...componentProps }}>\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.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: React.ComponentType = (): React.ReactElement => {\n const { isInErrorState } = React.useContext(ReactPlayerPropsContext);\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n const lastSuccessfulView = React.useRef<View | undefined>(undefined);\n this.viewUpdateSubscription.suspend();\n\n React.useEffect(() => {\n if (!isInErrorState) {\n lastSuccessfulView.current = view;\n }\n }, [isInErrorState, view]);\n\n const displayedView = isInErrorState ? lastSuccessfulView.current : view;\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {displayedView && <ActualPlayerComp view={displayedView} />}\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(): Promise<void> {\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(\n payload: unknown,\n options?: StartOptions,\n ): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(payload, options).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer: typeof ReactPlayer = 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\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { AssetRenderError } from \"./AssetRenderError\";\n\nexport * from \"./AssetRenderError\";\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.Context<ContextType> =\n React.createContext<ContextType>({});\n\nconst isAssetUnwrapped = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n): props is AssetType<string> => {\n return \"type\" in props && \"id\" in props;\n};\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): React.ReactElement => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped: AssetType<string> | undefined;\n\n if (isAssetUnwrapped(props)) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = props.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 (\n <ErrorBoundary\n fallbackRender={(props) => {\n const { error } = props;\n\n if (error instanceof AssetRenderError) {\n error.addAssetParent(unwrapped);\n throw error;\n } else {\n throw new AssetRenderError(\n unwrapped,\n \"Failed to render asset\",\n error,\n );\n }\n return null;\n }}\n >\n <Impl key={unwrapped.id} {...unwrapped} />\n </ErrorBoundary>\n );\n};\n","import {\n ErrorSeverity,\n ErrorTypes,\n type Asset,\n type PlayerErrorMetadata,\n} from \"@player-ui/player\";\n\nexport type AssetRenderErrorMetadata = {\n assetId: string;\n};\nexport class AssetRenderError\n extends Error\n implements PlayerErrorMetadata<AssetRenderErrorMetadata>\n{\n private assetParentPath: Array<Asset> = [];\n initialMessage: string;\n innerExceptionMessage: string;\n\n readonly type: string = ErrorTypes.RENDER;\n readonly severity: ErrorSeverity = ErrorSeverity.ERROR;\n readonly metadata: AssetRenderErrorMetadata;\n\n constructor(\n readonly rootAsset: Asset,\n message?: string,\n readonly innerException?: unknown,\n ) {\n super(message);\n this.metadata = {\n assetId: rootAsset.id,\n };\n this.initialMessage = message ?? \"\";\n this.innerExceptionMessage =\n innerException instanceof Error\n ? innerException.message\n : String(innerException);\n\n if (this.innerExceptionMessage) {\n this.initialMessage = this.initialMessage.concat(\n \"\\nCaused by: \",\n this.innerExceptionMessage,\n );\n }\n\n this.message = this.initialMessage;\n }\n\n private updateMessage() {\n this.message = `${this.initialMessage}\n${this.getAssetPathMessage()}\n`;\n }\n\n getAssetPathMessage() {\n return `Exception occurred in asset with id '${this.rootAsset.id}' of type '${this.rootAsset.type}'${this.assetParentPath.map((c) => `\\n\\tFound in (id: '${c.id}', type: '${c.type}')`)}`;\n }\n\n addAssetParent(asset: Asset): void {\n this.assetParentPath.push(asset);\n this.updateMessage();\n }\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 */\nexport const ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\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 class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\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 type StateChangeCallback = (state?: ManagedPlayerState) => void;\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 if (c && typeof c === \"function\") {\n c(this.state);\n }\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\nfunction createKey(): ManagedPlayerStateKey {\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 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}): { managedState: ManagedState; state?: ManagedPlayerState } => {\n const mounted = React.useRef(false);\n const previousManager = React.useRef(options.manager);\n const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());\n const managedStateRef = React.useRef(\n new ManagedState({ middleware: options.middleware }),\n );\n\n if (!mounted.current) {\n managedPlayerStateMachines.set(keyRef.current, managedStateRef.current);\n mounted.current = true;\n }\n\n if (previousManager.current !== options.manager) {\n const oldManagedState = managedPlayerStateMachines.get(keyRef.current);\n\n /**\n * We have to handle terminate here as well as the useEffect in the\n * ManagedPlayer since it won't have the instance of the previous manager\n */\n if (oldManagedState) {\n const playerState =\n oldManagedState.state?.context.reactPlayer.player.getState();\n\n if (\n oldManagedState.state?.value === \"running\" &&\n playerState?.status === \"in-progress\"\n ) {\n previousManager.current.terminate?.(playerState);\n }\n }\n\n const newKey = createKey();\n const newManagedState = new ManagedState({\n middleware: options.middleware,\n });\n\n managedPlayerStateMachines.set(newKey, newManagedState);\n keyRef.current = newKey;\n managedStateRef.current = newManagedState;\n previousManager.current = options.manager;\n }\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ?? managedStateRef.current;\n\n /**\n * There are times where the managedState the external store references no\n * longer exists, so we have to wrap instead of calling addListener directly.\n */\n function subscription(callback: (val?: ManagedPlayerState) => void) {\n if (managedState) {\n const unsub = managedState.addListener((s) => {\n callback(s);\n });\n\n return () => {\n if (managedState) {\n unsub();\n }\n };\n }\n\n return () => {};\n }\n\n function getSnapshot() {\n return managedState.state;\n }\n\n const state = useSyncExternalStore(\n subscription,\n getSnapshot,\n () => undefined,\n );\n\n /**\n * This needs to come after useSyncExternalStore, otherwise it causes\n * a weird state update and none of the refs in this hook persist\n */\n if (managedState.state === undefined) {\n managedState.start(options);\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 = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\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 const previousState = React.useRef<ManagedPlayerState | undefined>();\n\n if (state?.value !== previousState.current?.value) {\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?.(state.context.flow);\n }\n }\n\n previousState.current = 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);\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","import_react_error_boundary","React","leven","props","import_react","React","import_player","import_react","React","React","ReactPlayer","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/asset/AssetRenderError.ts","../../../../../../../../../../../../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","import React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport {\n Subscribe,\n useSubscribedState,\n useSubscriber,\n} from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n View,\n PlayerInfo,\n StartOptions,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary, FallbackProps } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport { ReactPlayer as PlayerComp } from \"./app\";\nimport { OnUpdatePlugin } from \"./plugins/onupdate-plugin\";\n\n/** Backup context for receiving ReactPlayerComponentProps when components setup in the webComponent call don't pass the props down to their inner components. */\nexport const ReactPlayerPropsContext: React.Context<ReactPlayerComponentProps> =\n React.createContext<ReactPlayerComponentProps>({ isInErrorState: false });\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\n// Alias until more properties are added\nexport type ReactPlayerInfo = PlayerInfo;\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 = {\n /** Whether or not player is currently recovering from an error. */\n isInErrorState?: boolean;\n [key: string]: unknown;\n};\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: SyncWaterfallHook<\n [React.ComponentType<any>],\n Record<string, any>\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: SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>],\n Record<string, any>\n >;\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: AsyncParallelHook<[], Record<string, any>>;\n } = {\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(),\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\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook(),\n };\n\n public readonly viewUpdateSubscription: Subscribe<View> =\n 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 version: this.player.getVersion(),\n commit: this.player.getCommit(),\n };\n }\n\n /** Returns the current version Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /** Returns the git commit used to build this Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 | PlayerPlugin): void {\n if (plugin.apply) {\n this.player.registerPlugin(plugin as PlayerPlugin);\n }\n\n if ((plugin as ReactPlayerPlugin).applyReact) {\n (plugin as ReactPlayerPlugin).applyReact?.(this);\n }\n\n if (!this.options.plugins) {\n this.options.plugins = [];\n }\n\n this.options.plugins.push(plugin);\n }\n\n /**\n * Returns the current version of the running React Player\n * @deprecated use `getPlayerVersion()` instead. Will be removed next major\n */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /**\n * Returns the git commit used to build the React Player version\n * @deprecated use `getPlayerCommit()` instead. Will be removed next major\n */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 const trackedErrors = React.useRef(new Map<Error, boolean>());\n const [errorSubId, setErrorSubId] = React.useState<number | undefined>(\n undefined,\n );\n const { subscribe, unsubscribe } = useSubscriber(\n this.viewUpdateSubscription,\n );\n\n const componentProps: ReactPlayerComponentProps = React.useMemo(\n () => ({\n ...props,\n isInErrorState: errorSubId !== undefined,\n }),\n [props, errorSubId],\n );\n\n /** Callback to remove all tracked errors and unsub from */\n const clearErrorTracking = React.useCallback(() => {\n trackedErrors.current.clear();\n setErrorSubId((prev) => {\n if (prev !== undefined) {\n unsubscribe(prev);\n }\n\n return undefined;\n });\n }, []);\n\n React.useEffect(() => {\n // Clear errors and error subscription on unmount\n return clearErrorTracking;\n }, [clearErrorTracking]);\n\n /** capture error and return true or false to represent if we are recovering from the error or not. */\n const captureError = React.useCallback(\n (err: Error) => {\n // If player isn't in progress we can't actually render anything so render errors are irrelevant.\n const playerState = this.player.getState();\n if (playerState.status !== \"in-progress\") {\n this.player.logger.warn(\n `[ReactPlayer]: An error occurred during rendering but was ignored due to a change in the player state (current state: '${playerState.status}'). Error Details:`,\n err,\n );\n return false;\n }\n\n // Only capture each error once.\n const currentError = trackedErrors.current.get(err);\n if (currentError !== undefined) {\n return currentError;\n }\n\n let isRecovering = false;\n setErrorSubId((prev) => {\n // subscribe only if no subscription available.\n // Needs to happen before capture error to ensure error recovery isn't missed\n const subId =\n prev === undefined\n ? subscribe(clearErrorTracking, {\n initializeWithPreviousValue: false,\n })\n : prev;\n\n // Get skipped state after trying to capture.\n isRecovering = playerState.controllers.error.captureError(err);\n trackedErrors.current.set(err, isRecovering);\n\n // If we can't recover from the error, avoid updating state to stay in error boundary\n if (!isRecovering) {\n // Unsub if not previously subbed since we don't need to reset the view\n if (subId !== prev) {\n unsubscribe(subId);\n }\n return prev;\n }\n\n return subId;\n });\n\n return isRecovering;\n },\n [errorSubId],\n );\n\n return (\n <ErrorBoundary\n fallbackRender={(fallbackProps: FallbackProps) => {\n const isRecovering = captureError(fallbackProps.error);\n\n if (!isRecovering) {\n // Display nothing if not recovering. Let the player state fail and handle what the view will be.\n return null;\n }\n fallbackProps.resetErrorBoundary();\n\n // Render the same as on success when recovering to preserve the react tree.\n return (\n <ReactPlayerPropsContext.Provider\n value={{ ...componentProps, isInErrorState: true }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} isInErrorState />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.Provider>\n );\n }}\n >\n <ReactPlayerPropsContext.Provider value={{ ...componentProps }}>\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.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: React.ComponentType = (): React.ReactElement => {\n const { isInErrorState } = React.useContext(ReactPlayerPropsContext);\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n const lastSuccessfulView = React.useRef<View | undefined>(undefined);\n this.viewUpdateSubscription.suspend();\n\n React.useEffect(() => {\n if (!isInErrorState) {\n lastSuccessfulView.current = view;\n }\n }, [isInErrorState, view]);\n\n const displayedView = isInErrorState ? lastSuccessfulView.current : view;\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {displayedView && <ActualPlayerComp view={displayedView} />}\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(): Promise<void> {\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(\n payload: unknown,\n options?: StartOptions,\n ): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(payload, options).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer: typeof ReactPlayer = 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\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { AssetRenderError } from \"./AssetRenderError\";\n\nexport * from \"./AssetRenderError\";\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.Context<ContextType> =\n React.createContext<ContextType>({});\n\nconst isAssetUnwrapped = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n): props is AssetType<string> => {\n return \"type\" in props && \"id\" in props;\n};\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): React.ReactElement => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped: AssetType<string> | undefined;\n\n if (isAssetUnwrapped(props)) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = props.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 (\n <ErrorBoundary\n fallbackRender={(props) => {\n const { error } = props;\n\n if (error instanceof AssetRenderError) {\n error.addAssetParent(unwrapped);\n throw error;\n } else {\n throw new AssetRenderError(\n unwrapped,\n \"Failed to render asset\",\n error,\n );\n }\n return null;\n }}\n >\n <Impl key={unwrapped.id} {...unwrapped} />\n </ErrorBoundary>\n );\n};\n","import {\n ErrorSeverity,\n ErrorTypes,\n type Asset,\n type PlayerErrorMetadata,\n} from \"@player-ui/player\";\n\nexport type AssetRenderErrorMetadata = {\n assetId: string;\n};\nexport class AssetRenderError\n extends Error\n implements PlayerErrorMetadata<AssetRenderErrorMetadata>\n{\n private assetParentPath: Array<Asset> = [];\n initialMessage: string;\n innerExceptionMessage: string;\n\n readonly type: string = ErrorTypes.RENDER;\n readonly severity: ErrorSeverity = ErrorSeverity.ERROR;\n readonly metadata: AssetRenderErrorMetadata;\n\n constructor(\n readonly rootAsset: Asset,\n message?: string,\n readonly innerException?: unknown,\n ) {\n super(message);\n this.metadata = {\n assetId: rootAsset.id,\n };\n this.initialMessage = message ?? \"\";\n this.innerExceptionMessage =\n innerException instanceof Error\n ? innerException.message\n : String(innerException);\n\n if (this.innerExceptionMessage) {\n this.initialMessage = this.initialMessage.concat(\n \"\\nCaused by: \",\n this.innerExceptionMessage,\n );\n }\n\n this.message = this.initialMessage;\n }\n\n private updateMessage() {\n this.message = `${this.initialMessage}\n${this.getAssetPathMessage()}\n`;\n }\n\n getAssetPathMessage() {\n return `Exception occurred in asset with id '${this.rootAsset.id}' of type '${this.rootAsset.type}'${this.assetParentPath.map((c) => `\\n\\tFound in (id: '${c.id}', type: '${c.type}')`)}`;\n }\n\n addAssetParent(asset: Asset): void {\n this.assetParentPath.push(asset);\n this.updateMessage();\n }\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 */\nexport const ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\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 class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport type { StartOptions } from \"@player-ui/player\";\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 type StateChangeCallback = (state?: ManagedPlayerState) => void;\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 /** options forwarded to `player.start()` for each flow */\n startOptions?: StartOptions;\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 startOptions: options.startOptions,\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, startOptions } = this.state.context;\n this.start({ playerConfig, manager, startOptions });\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, startOptions } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n startOptions,\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 if (c && typeof c === \"function\") {\n c(this.state);\n }\n });\n\n const { manager, reactPlayer, playerConfig, startOptions } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n startOptions,\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 startOptions,\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(\n state.context.flow,\n state.context.startOptions,\n ),\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\nfunction createKey(): ManagedPlayerStateKey {\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 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 /** Options forwarded to `player.start()` for each flow */\n startOptions?: StartOptions;\n}): { managedState: ManagedState; state?: ManagedPlayerState } => {\n const mounted = React.useRef(false);\n const previousManager = React.useRef(options.manager);\n const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());\n const managedStateRef = React.useRef(\n new ManagedState({ middleware: options.middleware }),\n );\n\n if (!mounted.current) {\n managedPlayerStateMachines.set(keyRef.current, managedStateRef.current);\n mounted.current = true;\n }\n\n if (previousManager.current !== options.manager) {\n const oldManagedState = managedPlayerStateMachines.get(keyRef.current);\n\n /**\n * We have to handle terminate here as well as the useEffect in the\n * ManagedPlayer since it won't have the instance of the previous manager\n */\n if (oldManagedState) {\n const playerState =\n oldManagedState.state?.context.reactPlayer.player.getState();\n\n if (\n oldManagedState.state?.value === \"running\" &&\n playerState?.status === \"in-progress\"\n ) {\n previousManager.current.terminate?.(playerState);\n }\n }\n\n const newKey = createKey();\n const newManagedState = new ManagedState({\n middleware: options.middleware,\n });\n\n managedPlayerStateMachines.set(newKey, newManagedState);\n keyRef.current = newKey;\n managedStateRef.current = newManagedState;\n previousManager.current = options.manager;\n }\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ?? managedStateRef.current;\n\n /**\n * There are times where the managedState the external store references no\n * longer exists, so we have to wrap instead of calling addListener directly.\n */\n function subscription(callback: (val?: ManagedPlayerState) => void) {\n if (managedState) {\n const unsub = managedState.addListener((s) => {\n callback(s);\n });\n\n return () => {\n if (managedState) {\n unsub();\n }\n };\n }\n\n return () => {};\n }\n\n function getSnapshot() {\n return managedState.state;\n }\n\n const state = useSyncExternalStore(\n subscription,\n getSnapshot,\n () => undefined,\n );\n\n /**\n * This needs to come after useSyncExternalStore, otherwise it causes\n * a weird state update and none of the refs in this hook persist\n */\n if (managedState.state === undefined) {\n managedState.start(options);\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 = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\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 startOptions: props.startOptions,\n });\n\n const previousState = React.useRef<ManagedPlayerState | undefined>();\n\n if (state?.value !== previousState.current?.value) {\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?.(state.context.flow);\n }\n }\n\n previousState.current = 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);\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","import_react_error_boundary","React","leven","props","import_react","React","import_player","import_react","React","React","ReactPlayer","import_player","import_react","React","ReactPlayer","import_react","import_react","ReactPlayer","React"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -582,7 +582,8 @@ var ManagedState = class {
|
|
|
582
582
|
context: {
|
|
583
583
|
playerConfig: options.playerConfig,
|
|
584
584
|
reactPlayer: new ReactPlayer2(options.playerConfig),
|
|
585
|
-
manager: options.manager
|
|
585
|
+
manager: options.manager,
|
|
586
|
+
startOptions: options.startOptions
|
|
586
587
|
}
|
|
587
588
|
};
|
|
588
589
|
this.setState(initialState);
|
|
@@ -591,8 +592,8 @@ var ManagedState = class {
|
|
|
591
592
|
/** reset starts from nothing */
|
|
592
593
|
reset() {
|
|
593
594
|
if (this.state?.value === "error") {
|
|
594
|
-
const { playerConfig, manager } = this.state.context;
|
|
595
|
-
this.start({ playerConfig, manager });
|
|
595
|
+
const { playerConfig, manager, startOptions } = this.state.context;
|
|
596
|
+
this.start({ playerConfig, manager, startOptions });
|
|
596
597
|
} else {
|
|
597
598
|
throw new Error("Flow must be in error state to reset");
|
|
598
599
|
}
|
|
@@ -600,14 +601,15 @@ var ManagedState = class {
|
|
|
600
601
|
/** restart starts from the last result */
|
|
601
602
|
restart() {
|
|
602
603
|
if (this.state?.value === "error") {
|
|
603
|
-
const { playerConfig, manager, prevResult, reactPlayer } = this.state.context;
|
|
604
|
+
const { playerConfig, manager, prevResult, reactPlayer, startOptions } = this.state.context;
|
|
604
605
|
this.setState({
|
|
605
606
|
value: "completed",
|
|
606
607
|
context: {
|
|
607
608
|
playerConfig,
|
|
608
609
|
manager,
|
|
609
610
|
result: prevResult,
|
|
610
|
-
reactPlayer
|
|
611
|
+
reactPlayer,
|
|
612
|
+
startOptions
|
|
611
613
|
}
|
|
612
614
|
});
|
|
613
615
|
} else {
|
|
@@ -621,12 +623,13 @@ var ManagedState = class {
|
|
|
621
623
|
c(this.state);
|
|
622
624
|
}
|
|
623
625
|
});
|
|
624
|
-
const { manager, reactPlayer, playerConfig } = state.context;
|
|
626
|
+
const { manager, reactPlayer, playerConfig, startOptions } = state.context;
|
|
625
627
|
try {
|
|
626
628
|
const nextState = await this.processState(state, {
|
|
627
629
|
manager,
|
|
628
630
|
reactPlayer,
|
|
629
|
-
playerConfig
|
|
631
|
+
playerConfig,
|
|
632
|
+
startOptions
|
|
630
633
|
});
|
|
631
634
|
if (nextState) {
|
|
632
635
|
this.setState(nextState);
|
|
@@ -638,6 +641,7 @@ var ManagedState = class {
|
|
|
638
641
|
manager,
|
|
639
642
|
reactPlayer,
|
|
640
643
|
playerConfig,
|
|
644
|
+
startOptions,
|
|
641
645
|
error: e
|
|
642
646
|
}
|
|
643
647
|
});
|
|
@@ -683,7 +687,10 @@ var ManagedState = class {
|
|
|
683
687
|
...context,
|
|
684
688
|
flow: state.context.flow,
|
|
685
689
|
prevResult: state.context.prevResult,
|
|
686
|
-
result: state.context.reactPlayer.start(
|
|
690
|
+
result: state.context.reactPlayer.start(
|
|
691
|
+
state.context.flow,
|
|
692
|
+
state.context.startOptions
|
|
693
|
+
)
|
|
687
694
|
}
|
|
688
695
|
};
|
|
689
696
|
}
|
|
@@ -769,7 +776,8 @@ var ManagedPlayer = (props) => {
|
|
|
769
776
|
playerConfig: {
|
|
770
777
|
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
|
|
771
778
|
player: props.player
|
|
772
|
-
}
|
|
779
|
+
},
|
|
780
|
+
startOptions: props.startOptions
|
|
773
781
|
});
|
|
774
782
|
const previousState = React6.useRef();
|
|
775
783
|
if (state?.value !== previousState.current?.value) {
|
package/dist/index.mjs
CHANGED
|
@@ -582,7 +582,8 @@ var ManagedState = class {
|
|
|
582
582
|
context: {
|
|
583
583
|
playerConfig: options.playerConfig,
|
|
584
584
|
reactPlayer: new ReactPlayer2(options.playerConfig),
|
|
585
|
-
manager: options.manager
|
|
585
|
+
manager: options.manager,
|
|
586
|
+
startOptions: options.startOptions
|
|
586
587
|
}
|
|
587
588
|
};
|
|
588
589
|
this.setState(initialState);
|
|
@@ -591,8 +592,8 @@ var ManagedState = class {
|
|
|
591
592
|
/** reset starts from nothing */
|
|
592
593
|
reset() {
|
|
593
594
|
if (this.state?.value === "error") {
|
|
594
|
-
const { playerConfig, manager } = this.state.context;
|
|
595
|
-
this.start({ playerConfig, manager });
|
|
595
|
+
const { playerConfig, manager, startOptions } = this.state.context;
|
|
596
|
+
this.start({ playerConfig, manager, startOptions });
|
|
596
597
|
} else {
|
|
597
598
|
throw new Error("Flow must be in error state to reset");
|
|
598
599
|
}
|
|
@@ -600,14 +601,15 @@ var ManagedState = class {
|
|
|
600
601
|
/** restart starts from the last result */
|
|
601
602
|
restart() {
|
|
602
603
|
if (this.state?.value === "error") {
|
|
603
|
-
const { playerConfig, manager, prevResult, reactPlayer } = this.state.context;
|
|
604
|
+
const { playerConfig, manager, prevResult, reactPlayer, startOptions } = this.state.context;
|
|
604
605
|
this.setState({
|
|
605
606
|
value: "completed",
|
|
606
607
|
context: {
|
|
607
608
|
playerConfig,
|
|
608
609
|
manager,
|
|
609
610
|
result: prevResult,
|
|
610
|
-
reactPlayer
|
|
611
|
+
reactPlayer,
|
|
612
|
+
startOptions
|
|
611
613
|
}
|
|
612
614
|
});
|
|
613
615
|
} else {
|
|
@@ -621,12 +623,13 @@ var ManagedState = class {
|
|
|
621
623
|
c(this.state);
|
|
622
624
|
}
|
|
623
625
|
});
|
|
624
|
-
const { manager, reactPlayer, playerConfig } = state.context;
|
|
626
|
+
const { manager, reactPlayer, playerConfig, startOptions } = state.context;
|
|
625
627
|
try {
|
|
626
628
|
const nextState = await this.processState(state, {
|
|
627
629
|
manager,
|
|
628
630
|
reactPlayer,
|
|
629
|
-
playerConfig
|
|
631
|
+
playerConfig,
|
|
632
|
+
startOptions
|
|
630
633
|
});
|
|
631
634
|
if (nextState) {
|
|
632
635
|
this.setState(nextState);
|
|
@@ -638,6 +641,7 @@ var ManagedState = class {
|
|
|
638
641
|
manager,
|
|
639
642
|
reactPlayer,
|
|
640
643
|
playerConfig,
|
|
644
|
+
startOptions,
|
|
641
645
|
error: e
|
|
642
646
|
}
|
|
643
647
|
});
|
|
@@ -683,7 +687,10 @@ var ManagedState = class {
|
|
|
683
687
|
...context,
|
|
684
688
|
flow: state.context.flow,
|
|
685
689
|
prevResult: state.context.prevResult,
|
|
686
|
-
result: state.context.reactPlayer.start(
|
|
690
|
+
result: state.context.reactPlayer.start(
|
|
691
|
+
state.context.flow,
|
|
692
|
+
state.context.startOptions
|
|
693
|
+
)
|
|
687
694
|
}
|
|
688
695
|
};
|
|
689
696
|
}
|
|
@@ -769,7 +776,8 @@ var ManagedPlayer = (props) => {
|
|
|
769
776
|
playerConfig: {
|
|
770
777
|
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
|
|
771
778
|
player: props.player
|
|
772
|
-
}
|
|
779
|
+
},
|
|
780
|
+
startOptions: props.startOptions
|
|
773
781
|
});
|
|
774
782
|
const previousState = React6.useRef();
|
|
775
783
|
if (state?.value !== previousState.current?.value) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -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/asset/AssetRenderError.ts","../../../../../../../../../../../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","import React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport {\n Subscribe,\n useSubscribedState,\n useSubscriber,\n} from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n View,\n PlayerInfo,\n StartOptions,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary, FallbackProps } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport { ReactPlayer as PlayerComp } from \"./app\";\nimport { OnUpdatePlugin } from \"./plugins/onupdate-plugin\";\n\n/** Backup context for receiving ReactPlayerComponentProps when components setup in the webComponent call don't pass the props down to their inner components. */\nexport const ReactPlayerPropsContext: React.Context<ReactPlayerComponentProps> =\n React.createContext<ReactPlayerComponentProps>({ isInErrorState: false });\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\n// Alias until more properties are added\nexport type ReactPlayerInfo = PlayerInfo;\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 = {\n /** Whether or not player is currently recovering from an error. */\n isInErrorState?: boolean;\n [key: string]: unknown;\n};\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: SyncWaterfallHook<\n [React.ComponentType<any>],\n Record<string, any>\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: SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>],\n Record<string, any>\n >;\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: AsyncParallelHook<[], Record<string, any>>;\n } = {\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(),\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\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook(),\n };\n\n public readonly viewUpdateSubscription: Subscribe<View> =\n 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 version: this.player.getVersion(),\n commit: this.player.getCommit(),\n };\n }\n\n /** Returns the current version Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /** Returns the git commit used to build this Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 | PlayerPlugin): void {\n if (plugin.apply) {\n this.player.registerPlugin(plugin as PlayerPlugin);\n }\n\n if ((plugin as ReactPlayerPlugin).applyReact) {\n (plugin as ReactPlayerPlugin).applyReact?.(this);\n }\n\n if (!this.options.plugins) {\n this.options.plugins = [];\n }\n\n this.options.plugins.push(plugin);\n }\n\n /**\n * Returns the current version of the running React Player\n * @deprecated use `getPlayerVersion()` instead. Will be removed next major\n */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /**\n * Returns the git commit used to build the React Player version\n * @deprecated use `getPlayerCommit()` instead. Will be removed next major\n */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 const trackedErrors = React.useRef(new Map<Error, boolean>());\n const [errorSubId, setErrorSubId] = React.useState<number | undefined>(\n undefined,\n );\n const { subscribe, unsubscribe } = useSubscriber(\n this.viewUpdateSubscription,\n );\n\n const componentProps: ReactPlayerComponentProps = React.useMemo(\n () => ({\n ...props,\n isInErrorState: errorSubId !== undefined,\n }),\n [props, errorSubId],\n );\n\n /** Callback to remove all tracked errors and unsub from */\n const clearErrorTracking = React.useCallback(() => {\n trackedErrors.current.clear();\n setErrorSubId((prev) => {\n if (prev !== undefined) {\n unsubscribe(prev);\n }\n\n return undefined;\n });\n }, []);\n\n React.useEffect(() => {\n // Clear errors and error subscription on unmount\n return clearErrorTracking;\n }, [clearErrorTracking]);\n\n /** capture error and return true or false to represent if we are recovering from the error or not. */\n const captureError = React.useCallback(\n (err: Error) => {\n // If player isn't in progress we can't actually render anything so render errors are irrelevant.\n const playerState = this.player.getState();\n if (playerState.status !== \"in-progress\") {\n this.player.logger.warn(\n `[ReactPlayer]: An error occurred during rendering but was ignored due to a change in the player state (current state: '${playerState.status}'). Error Details:`,\n err,\n );\n return false;\n }\n\n // Only capture each error once.\n const currentError = trackedErrors.current.get(err);\n if (currentError !== undefined) {\n return currentError;\n }\n\n let isRecovering = false;\n setErrorSubId((prev) => {\n // subscribe only if no subscription available.\n // Needs to happen before capture error to ensure error recovery isn't missed\n const subId =\n prev === undefined\n ? subscribe(clearErrorTracking, {\n initializeWithPreviousValue: false,\n })\n : prev;\n\n // Get skipped state after trying to capture.\n isRecovering = playerState.controllers.error.captureError(err);\n trackedErrors.current.set(err, isRecovering);\n\n // If we can't recover from the error, avoid updating state to stay in error boundary\n if (!isRecovering) {\n // Unsub if not previously subbed since we don't need to reset the view\n if (subId !== prev) {\n unsubscribe(subId);\n }\n return prev;\n }\n\n return subId;\n });\n\n return isRecovering;\n },\n [errorSubId],\n );\n\n return (\n <ErrorBoundary\n fallbackRender={(fallbackProps: FallbackProps) => {\n const isRecovering = captureError(fallbackProps.error);\n\n if (!isRecovering) {\n // Display nothing if not recovering. Let the player state fail and handle what the view will be.\n return null;\n }\n fallbackProps.resetErrorBoundary();\n\n // Render the same as on success when recovering to preserve the react tree.\n return (\n <ReactPlayerPropsContext.Provider\n value={{ ...componentProps, isInErrorState: true }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} isInErrorState />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.Provider>\n );\n }}\n >\n <ReactPlayerPropsContext.Provider value={{ ...componentProps }}>\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.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: React.ComponentType = (): React.ReactElement => {\n const { isInErrorState } = React.useContext(ReactPlayerPropsContext);\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n const lastSuccessfulView = React.useRef<View | undefined>(undefined);\n this.viewUpdateSubscription.suspend();\n\n React.useEffect(() => {\n if (!isInErrorState) {\n lastSuccessfulView.current = view;\n }\n }, [isInErrorState, view]);\n\n const displayedView = isInErrorState ? lastSuccessfulView.current : view;\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {displayedView && <ActualPlayerComp view={displayedView} />}\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(): Promise<void> {\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(\n payload: unknown,\n options?: StartOptions,\n ): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(payload, options).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer: typeof ReactPlayer = 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\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { AssetRenderError } from \"./AssetRenderError\";\n\nexport * from \"./AssetRenderError\";\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.Context<ContextType> =\n React.createContext<ContextType>({});\n\nconst isAssetUnwrapped = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n): props is AssetType<string> => {\n return \"type\" in props && \"id\" in props;\n};\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): React.ReactElement => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped: AssetType<string> | undefined;\n\n if (isAssetUnwrapped(props)) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = props.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 (\n <ErrorBoundary\n fallbackRender={(props) => {\n const { error } = props;\n\n if (error instanceof AssetRenderError) {\n error.addAssetParent(unwrapped);\n throw error;\n } else {\n throw new AssetRenderError(\n unwrapped,\n \"Failed to render asset\",\n error,\n );\n }\n return null;\n }}\n >\n <Impl key={unwrapped.id} {...unwrapped} />\n </ErrorBoundary>\n );\n};\n","import {\n ErrorSeverity,\n ErrorTypes,\n type Asset,\n type PlayerErrorMetadata,\n} from \"@player-ui/player\";\n\nexport type AssetRenderErrorMetadata = {\n assetId: string;\n};\nexport class AssetRenderError\n extends Error\n implements PlayerErrorMetadata<AssetRenderErrorMetadata>\n{\n private assetParentPath: Array<Asset> = [];\n initialMessage: string;\n innerExceptionMessage: string;\n\n readonly type: string = ErrorTypes.RENDER;\n readonly severity: ErrorSeverity = ErrorSeverity.ERROR;\n readonly metadata: AssetRenderErrorMetadata;\n\n constructor(\n readonly rootAsset: Asset,\n message?: string,\n readonly innerException?: unknown,\n ) {\n super(message);\n this.metadata = {\n assetId: rootAsset.id,\n };\n this.initialMessage = message ?? \"\";\n this.innerExceptionMessage =\n innerException instanceof Error\n ? innerException.message\n : String(innerException);\n\n if (this.innerExceptionMessage) {\n this.initialMessage = this.initialMessage.concat(\n \"\\nCaused by: \",\n this.innerExceptionMessage,\n );\n }\n\n this.message = this.initialMessage;\n }\n\n private updateMessage() {\n this.message = `${this.initialMessage}\n${this.getAssetPathMessage()}\n`;\n }\n\n getAssetPathMessage() {\n return `Exception occurred in asset with id '${this.rootAsset.id}' of type '${this.rootAsset.type}'${this.assetParentPath.map((c) => `\\n\\tFound in (id: '${c.id}', type: '${c.type}')`)}`;\n }\n\n addAssetParent(asset: Asset): void {\n this.assetParentPath.push(asset);\n this.updateMessage();\n }\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 */\nexport const ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\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 class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\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 type StateChangeCallback = (state?: ManagedPlayerState) => void;\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 if (c && typeof c === \"function\") {\n c(this.state);\n }\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\nfunction createKey(): ManagedPlayerStateKey {\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 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}): { managedState: ManagedState; state?: ManagedPlayerState } => {\n const mounted = React.useRef(false);\n const previousManager = React.useRef(options.manager);\n const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());\n const managedStateRef = React.useRef(\n new ManagedState({ middleware: options.middleware }),\n );\n\n if (!mounted.current) {\n managedPlayerStateMachines.set(keyRef.current, managedStateRef.current);\n mounted.current = true;\n }\n\n if (previousManager.current !== options.manager) {\n const oldManagedState = managedPlayerStateMachines.get(keyRef.current);\n\n /**\n * We have to handle terminate here as well as the useEffect in the\n * ManagedPlayer since it won't have the instance of the previous manager\n */\n if (oldManagedState) {\n const playerState =\n oldManagedState.state?.context.reactPlayer.player.getState();\n\n if (\n oldManagedState.state?.value === \"running\" &&\n playerState?.status === \"in-progress\"\n ) {\n previousManager.current.terminate?.(playerState);\n }\n }\n\n const newKey = createKey();\n const newManagedState = new ManagedState({\n middleware: options.middleware,\n });\n\n managedPlayerStateMachines.set(newKey, newManagedState);\n keyRef.current = newKey;\n managedStateRef.current = newManagedState;\n previousManager.current = options.manager;\n }\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ?? managedStateRef.current;\n\n /**\n * There are times where the managedState the external store references no\n * longer exists, so we have to wrap instead of calling addListener directly.\n */\n function subscription(callback: (val?: ManagedPlayerState) => void) {\n if (managedState) {\n const unsub = managedState.addListener((s) => {\n callback(s);\n });\n\n return () => {\n if (managedState) {\n unsub();\n }\n };\n }\n\n return () => {};\n }\n\n function getSnapshot() {\n return managedState.state;\n }\n\n const state = useSyncExternalStore(\n subscription,\n getSnapshot,\n () => undefined,\n );\n\n /**\n * This needs to come after useSyncExternalStore, otherwise it causes\n * a weird state update and none of the refs in this hook persist\n */\n if (managedState.state === undefined) {\n managedState.start(options);\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 = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\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 const previousState = React.useRef<ManagedPlayerState | undefined>();\n\n if (state?.value !== previousState.current?.value) {\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?.(state.context.flow);\n }\n }\n\n previousState.current = 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);\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","ErrorBoundary","props","React","React","React","React","ReactPlayer","ErrorBoundary","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/asset/AssetRenderError.ts","../../../../../../../../../../../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","import React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport {\n Subscribe,\n useSubscribedState,\n useSubscriber,\n} from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n View,\n PlayerInfo,\n StartOptions,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary, FallbackProps } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport { ReactPlayer as PlayerComp } from \"./app\";\nimport { OnUpdatePlugin } from \"./plugins/onupdate-plugin\";\n\n/** Backup context for receiving ReactPlayerComponentProps when components setup in the webComponent call don't pass the props down to their inner components. */\nexport const ReactPlayerPropsContext: React.Context<ReactPlayerComponentProps> =\n React.createContext<ReactPlayerComponentProps>({ isInErrorState: false });\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\n// Alias until more properties are added\nexport type ReactPlayerInfo = PlayerInfo;\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 = {\n /** Whether or not player is currently recovering from an error. */\n isInErrorState?: boolean;\n [key: string]: unknown;\n};\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: SyncWaterfallHook<\n [React.ComponentType<any>],\n Record<string, any>\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: SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>],\n Record<string, any>\n >;\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: AsyncParallelHook<[], Record<string, any>>;\n } = {\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(),\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\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook(),\n };\n\n public readonly viewUpdateSubscription: Subscribe<View> =\n 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 version: this.player.getVersion(),\n commit: this.player.getCommit(),\n };\n }\n\n /** Returns the current version Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /** Returns the git commit used to build this Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 | PlayerPlugin): void {\n if (plugin.apply) {\n this.player.registerPlugin(plugin as PlayerPlugin);\n }\n\n if ((plugin as ReactPlayerPlugin).applyReact) {\n (plugin as ReactPlayerPlugin).applyReact?.(this);\n }\n\n if (!this.options.plugins) {\n this.options.plugins = [];\n }\n\n this.options.plugins.push(plugin);\n }\n\n /**\n * Returns the current version of the running React Player\n * @deprecated use `getPlayerVersion()` instead. Will be removed next major\n */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.version;\n }\n\n /**\n * Returns the git commit used to build the React Player version\n * @deprecated use `getPlayerCommit()` instead. Will be removed next major\n */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.commit;\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 const trackedErrors = React.useRef(new Map<Error, boolean>());\n const [errorSubId, setErrorSubId] = React.useState<number | undefined>(\n undefined,\n );\n const { subscribe, unsubscribe } = useSubscriber(\n this.viewUpdateSubscription,\n );\n\n const componentProps: ReactPlayerComponentProps = React.useMemo(\n () => ({\n ...props,\n isInErrorState: errorSubId !== undefined,\n }),\n [props, errorSubId],\n );\n\n /** Callback to remove all tracked errors and unsub from */\n const clearErrorTracking = React.useCallback(() => {\n trackedErrors.current.clear();\n setErrorSubId((prev) => {\n if (prev !== undefined) {\n unsubscribe(prev);\n }\n\n return undefined;\n });\n }, []);\n\n React.useEffect(() => {\n // Clear errors and error subscription on unmount\n return clearErrorTracking;\n }, [clearErrorTracking]);\n\n /** capture error and return true or false to represent if we are recovering from the error or not. */\n const captureError = React.useCallback(\n (err: Error) => {\n // If player isn't in progress we can't actually render anything so render errors are irrelevant.\n const playerState = this.player.getState();\n if (playerState.status !== \"in-progress\") {\n this.player.logger.warn(\n `[ReactPlayer]: An error occurred during rendering but was ignored due to a change in the player state (current state: '${playerState.status}'). Error Details:`,\n err,\n );\n return false;\n }\n\n // Only capture each error once.\n const currentError = trackedErrors.current.get(err);\n if (currentError !== undefined) {\n return currentError;\n }\n\n let isRecovering = false;\n setErrorSubId((prev) => {\n // subscribe only if no subscription available.\n // Needs to happen before capture error to ensure error recovery isn't missed\n const subId =\n prev === undefined\n ? subscribe(clearErrorTracking, {\n initializeWithPreviousValue: false,\n })\n : prev;\n\n // Get skipped state after trying to capture.\n isRecovering = playerState.controllers.error.captureError(err);\n trackedErrors.current.set(err, isRecovering);\n\n // If we can't recover from the error, avoid updating state to stay in error boundary\n if (!isRecovering) {\n // Unsub if not previously subbed since we don't need to reset the view\n if (subId !== prev) {\n unsubscribe(subId);\n }\n return prev;\n }\n\n return subId;\n });\n\n return isRecovering;\n },\n [errorSubId],\n );\n\n return (\n <ErrorBoundary\n fallbackRender={(fallbackProps: FallbackProps) => {\n const isRecovering = captureError(fallbackProps.error);\n\n if (!isRecovering) {\n // Display nothing if not recovering. Let the player state fail and handle what the view will be.\n return null;\n }\n fallbackProps.resetErrorBoundary();\n\n // Render the same as on success when recovering to preserve the react tree.\n return (\n <ReactPlayerPropsContext.Provider\n value={{ ...componentProps, isInErrorState: true }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} isInErrorState />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.Provider>\n );\n }}\n >\n <ReactPlayerPropsContext.Provider value={{ ...componentProps }}>\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...componentProps} />\n </PlayerContext.Provider>\n </ReactPlayerPropsContext.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: React.ComponentType = (): React.ReactElement => {\n const { isInErrorState } = React.useContext(ReactPlayerPropsContext);\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n const lastSuccessfulView = React.useRef<View | undefined>(undefined);\n this.viewUpdateSubscription.suspend();\n\n React.useEffect(() => {\n if (!isInErrorState) {\n lastSuccessfulView.current = view;\n }\n }, [isInErrorState, view]);\n\n const displayedView = isInErrorState ? lastSuccessfulView.current : view;\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {displayedView && <ActualPlayerComp view={displayedView} />}\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(): Promise<void> {\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(\n payload: unknown,\n options?: StartOptions,\n ): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(payload, options).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer: typeof ReactPlayer = 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\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { AssetRenderError } from \"./AssetRenderError\";\n\nexport * from \"./AssetRenderError\";\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.Context<ContextType> =\n React.createContext<ContextType>({});\n\nconst isAssetUnwrapped = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n): props is AssetType<string> => {\n return \"type\" in props && \"id\" in props;\n};\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): React.ReactElement => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped: AssetType<string> | undefined;\n\n if (isAssetUnwrapped(props)) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = props.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 (\n <ErrorBoundary\n fallbackRender={(props) => {\n const { error } = props;\n\n if (error instanceof AssetRenderError) {\n error.addAssetParent(unwrapped);\n throw error;\n } else {\n throw new AssetRenderError(\n unwrapped,\n \"Failed to render asset\",\n error,\n );\n }\n return null;\n }}\n >\n <Impl key={unwrapped.id} {...unwrapped} />\n </ErrorBoundary>\n );\n};\n","import {\n ErrorSeverity,\n ErrorTypes,\n type Asset,\n type PlayerErrorMetadata,\n} from \"@player-ui/player\";\n\nexport type AssetRenderErrorMetadata = {\n assetId: string;\n};\nexport class AssetRenderError\n extends Error\n implements PlayerErrorMetadata<AssetRenderErrorMetadata>\n{\n private assetParentPath: Array<Asset> = [];\n initialMessage: string;\n innerExceptionMessage: string;\n\n readonly type: string = ErrorTypes.RENDER;\n readonly severity: ErrorSeverity = ErrorSeverity.ERROR;\n readonly metadata: AssetRenderErrorMetadata;\n\n constructor(\n readonly rootAsset: Asset,\n message?: string,\n readonly innerException?: unknown,\n ) {\n super(message);\n this.metadata = {\n assetId: rootAsset.id,\n };\n this.initialMessage = message ?? \"\";\n this.innerExceptionMessage =\n innerException instanceof Error\n ? innerException.message\n : String(innerException);\n\n if (this.innerExceptionMessage) {\n this.initialMessage = this.initialMessage.concat(\n \"\\nCaused by: \",\n this.innerExceptionMessage,\n );\n }\n\n this.message = this.initialMessage;\n }\n\n private updateMessage() {\n this.message = `${this.initialMessage}\n${this.getAssetPathMessage()}\n`;\n }\n\n getAssetPathMessage() {\n return `Exception occurred in asset with id '${this.rootAsset.id}' of type '${this.rootAsset.type}'${this.assetParentPath.map((c) => `\\n\\tFound in (id: '${c.id}', type: '${c.type}')`)}`;\n }\n\n addAssetParent(asset: Asset): void {\n this.assetParentPath.push(asset);\n this.updateMessage();\n }\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 */\nexport const ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\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 class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport type { StartOptions } from \"@player-ui/player\";\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 type StateChangeCallback = (state?: ManagedPlayerState) => void;\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 /** options forwarded to `player.start()` for each flow */\n startOptions?: StartOptions;\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 startOptions: options.startOptions,\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, startOptions } = this.state.context;\n this.start({ playerConfig, manager, startOptions });\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, startOptions } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n startOptions,\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 if (c && typeof c === \"function\") {\n c(this.state);\n }\n });\n\n const { manager, reactPlayer, playerConfig, startOptions } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n startOptions,\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 startOptions,\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(\n state.context.flow,\n state.context.startOptions,\n ),\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\nfunction createKey(): ManagedPlayerStateKey {\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 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 /** Options forwarded to `player.start()` for each flow */\n startOptions?: StartOptions;\n}): { managedState: ManagedState; state?: ManagedPlayerState } => {\n const mounted = React.useRef(false);\n const previousManager = React.useRef(options.manager);\n const keyRef = React.useRef<ManagedPlayerStateKey>(createKey());\n const managedStateRef = React.useRef(\n new ManagedState({ middleware: options.middleware }),\n );\n\n if (!mounted.current) {\n managedPlayerStateMachines.set(keyRef.current, managedStateRef.current);\n mounted.current = true;\n }\n\n if (previousManager.current !== options.manager) {\n const oldManagedState = managedPlayerStateMachines.get(keyRef.current);\n\n /**\n * We have to handle terminate here as well as the useEffect in the\n * ManagedPlayer since it won't have the instance of the previous manager\n */\n if (oldManagedState) {\n const playerState =\n oldManagedState.state?.context.reactPlayer.player.getState();\n\n if (\n oldManagedState.state?.value === \"running\" &&\n playerState?.status === \"in-progress\"\n ) {\n previousManager.current.terminate?.(playerState);\n }\n }\n\n const newKey = createKey();\n const newManagedState = new ManagedState({\n middleware: options.middleware,\n });\n\n managedPlayerStateMachines.set(newKey, newManagedState);\n keyRef.current = newKey;\n managedStateRef.current = newManagedState;\n previousManager.current = options.manager;\n }\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ?? managedStateRef.current;\n\n /**\n * There are times where the managedState the external store references no\n * longer exists, so we have to wrap instead of calling addListener directly.\n */\n function subscription(callback: (val?: ManagedPlayerState) => void) {\n if (managedState) {\n const unsub = managedState.addListener((s) => {\n callback(s);\n });\n\n return () => {\n if (managedState) {\n unsub();\n }\n };\n }\n\n return () => {};\n }\n\n function getSnapshot() {\n return managedState.state;\n }\n\n const state = useSyncExternalStore(\n subscription,\n getSnapshot,\n () => undefined,\n );\n\n /**\n * This needs to come after useSyncExternalStore, otherwise it causes\n * a weird state update and none of the refs in this hook persist\n */\n if (managedState.state === undefined) {\n managedState.start(options);\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 = (\n props: ManagedPlayerProps,\n): React.JSX.Element | null => {\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 startOptions: props.startOptions,\n });\n\n const previousState = React.useRef<ManagedPlayerState | undefined>();\n\n if (state?.value !== previousState.current?.value) {\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?.(state.context.flow);\n }\n }\n\n previousState.current = 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);\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","ErrorBoundary","props","React","React","React","React","ReactPlayer","ErrorBoundary","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": "1.1.0--canary.866.
|
|
9
|
+
"version": "1.1.0--canary.866.38904",
|
|
10
10
|
"main": "dist/cjs/index.cjs",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@player-ui/metrics-plugin": "1.1.0--canary.866.
|
|
13
|
-
"@player-ui/partial-match-registry": "1.1.0--canary.866.
|
|
14
|
-
"@player-ui/player": "1.1.0--canary.866.
|
|
15
|
-
"@player-ui/react-subscribe": "1.1.0--canary.866.
|
|
12
|
+
"@player-ui/metrics-plugin": "1.1.0--canary.866.38904",
|
|
13
|
+
"@player-ui/partial-match-registry": "1.1.0--canary.866.38904",
|
|
14
|
+
"@player-ui/player": "1.1.0--canary.866.38904",
|
|
15
|
+
"@player-ui/react-subscribe": "1.1.0--canary.866.38904",
|
|
16
16
|
"react-error-boundary": "^3.1.3",
|
|
17
17
|
"tapable-ts": "^0.2.3",
|
|
18
18
|
"leven": "3.1.0",
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
RequestTimeWebPlugin,
|
|
9
9
|
} from "@player-ui/metrics-plugin";
|
|
10
10
|
import { ManagedPlayer } from "../managed-player";
|
|
11
|
+
import { ReactPlayer } from "../../player";
|
|
11
12
|
import type { FlowManager, FallbackProps } from "../types";
|
|
12
13
|
import { SimpleAssetPlugin } from "../../__tests__/helpers/simple-asset-plugin";
|
|
13
14
|
import { InProgressState } from "@player-ui/player";
|
|
@@ -120,6 +121,58 @@ describe.each([
|
|
|
120
121
|
expect(onComplete).toBeCalled();
|
|
121
122
|
});
|
|
122
123
|
|
|
124
|
+
test("forwards startOptions to player.start for each flow", async () => {
|
|
125
|
+
const startSpy = vitest.spyOn(ReactPlayer.prototype, "start");
|
|
126
|
+
|
|
127
|
+
const manager: FlowManager = {
|
|
128
|
+
next: vitest
|
|
129
|
+
.fn()
|
|
130
|
+
.mockReturnValueOnce(
|
|
131
|
+
Promise.resolve({
|
|
132
|
+
value: makeFlow({
|
|
133
|
+
id: "flow-1",
|
|
134
|
+
type: "collection",
|
|
135
|
+
values: [
|
|
136
|
+
{
|
|
137
|
+
asset: {
|
|
138
|
+
id: "action",
|
|
139
|
+
type: "action",
|
|
140
|
+
value: "Next",
|
|
141
|
+
label: "Continue",
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
}),
|
|
146
|
+
}),
|
|
147
|
+
)
|
|
148
|
+
.mockReturnValue(Promise.resolve({ done: true })),
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
render(
|
|
152
|
+
<Suspense fallback="loading">
|
|
153
|
+
<ManagedPlayer
|
|
154
|
+
manager={manager}
|
|
155
|
+
plugins={[new SimpleAssetPlugin()]}
|
|
156
|
+
startOptions={{ format: "a2ui", version: "0.9" }}
|
|
157
|
+
onComplete={vitest.fn()}
|
|
158
|
+
onError={vitest.fn()}
|
|
159
|
+
/>
|
|
160
|
+
</Suspense>,
|
|
161
|
+
{ legacyRoot },
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
// The managed player forwards startOptions verbatim to player.start at the
|
|
165
|
+
// loaded -> running transition, independent of what the flow renders.
|
|
166
|
+
await vitest.waitFor(() =>
|
|
167
|
+
expect(startSpy).toHaveBeenCalledWith(expect.anything(), {
|
|
168
|
+
format: "a2ui",
|
|
169
|
+
version: "0.9",
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
startSpy.mockRestore();
|
|
174
|
+
});
|
|
175
|
+
|
|
123
176
|
test("handles dummy flows", async () => {
|
|
124
177
|
const manager: FlowManager = {
|
|
125
178
|
next: vitest
|
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
ManagerMiddleware,
|
|
8
8
|
ManagedPlayerContext,
|
|
9
9
|
} from "./types";
|
|
10
|
+
import type { StartOptions } from "@player-ui/player";
|
|
10
11
|
import { useRequestTime } from "./request-time";
|
|
11
12
|
import type { ReactPlayerOptions } from "../player";
|
|
12
13
|
import { ReactPlayer } from "../player";
|
|
@@ -57,6 +58,9 @@ class ManagedState {
|
|
|
57
58
|
|
|
58
59
|
/** the config to use when creating a player */
|
|
59
60
|
playerConfig: ReactPlayerOptions;
|
|
61
|
+
|
|
62
|
+
/** options forwarded to `player.start()` for each flow */
|
|
63
|
+
startOptions?: StartOptions;
|
|
60
64
|
}): this {
|
|
61
65
|
const initialState: ManagedPlayerState = {
|
|
62
66
|
value: "not_started",
|
|
@@ -64,6 +68,7 @@ class ManagedState {
|
|
|
64
68
|
playerConfig: options.playerConfig,
|
|
65
69
|
reactPlayer: new ReactPlayer(options.playerConfig),
|
|
66
70
|
manager: options.manager,
|
|
71
|
+
startOptions: options.startOptions,
|
|
67
72
|
},
|
|
68
73
|
};
|
|
69
74
|
|
|
@@ -75,8 +80,8 @@ class ManagedState {
|
|
|
75
80
|
/** reset starts from nothing */
|
|
76
81
|
public reset(): void {
|
|
77
82
|
if (this.state?.value === "error") {
|
|
78
|
-
const { playerConfig, manager } = this.state.context;
|
|
79
|
-
this.start({ playerConfig, manager });
|
|
83
|
+
const { playerConfig, manager, startOptions } = this.state.context;
|
|
84
|
+
this.start({ playerConfig, manager, startOptions });
|
|
80
85
|
} else {
|
|
81
86
|
throw new Error("Flow must be in error state to reset");
|
|
82
87
|
}
|
|
@@ -85,7 +90,7 @@ class ManagedState {
|
|
|
85
90
|
/** restart starts from the last result */
|
|
86
91
|
public restart(): void {
|
|
87
92
|
if (this.state?.value === "error") {
|
|
88
|
-
const { playerConfig, manager, prevResult, reactPlayer } =
|
|
93
|
+
const { playerConfig, manager, prevResult, reactPlayer, startOptions } =
|
|
89
94
|
this.state.context;
|
|
90
95
|
this.setState({
|
|
91
96
|
value: "completed",
|
|
@@ -94,6 +99,7 @@ class ManagedState {
|
|
|
94
99
|
manager,
|
|
95
100
|
result: prevResult,
|
|
96
101
|
reactPlayer,
|
|
102
|
+
startOptions,
|
|
97
103
|
},
|
|
98
104
|
});
|
|
99
105
|
} else {
|
|
@@ -109,13 +115,14 @@ class ManagedState {
|
|
|
109
115
|
}
|
|
110
116
|
});
|
|
111
117
|
|
|
112
|
-
const { manager, reactPlayer, playerConfig } = state.context;
|
|
118
|
+
const { manager, reactPlayer, playerConfig, startOptions } = state.context;
|
|
113
119
|
|
|
114
120
|
try {
|
|
115
121
|
const nextState = await this.processState(state, {
|
|
116
122
|
manager,
|
|
117
123
|
reactPlayer,
|
|
118
124
|
playerConfig,
|
|
125
|
+
startOptions,
|
|
119
126
|
});
|
|
120
127
|
|
|
121
128
|
if (nextState) {
|
|
@@ -128,6 +135,7 @@ class ManagedState {
|
|
|
128
135
|
manager,
|
|
129
136
|
reactPlayer,
|
|
130
137
|
playerConfig,
|
|
138
|
+
startOptions,
|
|
131
139
|
error: e as Error,
|
|
132
140
|
},
|
|
133
141
|
});
|
|
@@ -184,7 +192,10 @@ class ManagedState {
|
|
|
184
192
|
...context,
|
|
185
193
|
flow: state.context.flow,
|
|
186
194
|
prevResult: state.context.prevResult,
|
|
187
|
-
result: state.context.reactPlayer.start(
|
|
195
|
+
result: state.context.reactPlayer.start(
|
|
196
|
+
state.context.flow,
|
|
197
|
+
state.context.startOptions,
|
|
198
|
+
),
|
|
188
199
|
},
|
|
189
200
|
};
|
|
190
201
|
}
|
|
@@ -224,6 +235,9 @@ export const usePersistentStateMachine = (options: {
|
|
|
224
235
|
|
|
225
236
|
/** Any middleware for the manager */
|
|
226
237
|
middleware?: ManagerMiddleware;
|
|
238
|
+
|
|
239
|
+
/** Options forwarded to `player.start()` for each flow */
|
|
240
|
+
startOptions?: StartOptions;
|
|
227
241
|
}): { managedState: ManagedState; state?: ManagedPlayerState } => {
|
|
228
242
|
const mounted = React.useRef(false);
|
|
229
243
|
const previousManager = React.useRef(options.manager);
|
|
@@ -329,6 +343,7 @@ export const ManagedPlayer = (
|
|
|
329
343
|
plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],
|
|
330
344
|
player: props.player,
|
|
331
345
|
},
|
|
346
|
+
startOptions: props.startOptions,
|
|
332
347
|
});
|
|
333
348
|
|
|
334
349
|
const previousState = React.useRef<ManagedPlayerState | undefined>();
|
package/src/manager/types.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
CompletedState,
|
|
4
|
+
Flow,
|
|
5
|
+
InProgressState,
|
|
6
|
+
StartOptions,
|
|
7
|
+
} from "@player-ui/player";
|
|
3
8
|
import type { ReactPlayer, ReactPlayerOptions } from "../player";
|
|
4
9
|
|
|
5
10
|
export interface FinalState {
|
|
@@ -52,6 +57,12 @@ export interface ManagedPlayerProps extends ReactPlayerOptions {
|
|
|
52
57
|
/** A callback when a flow is started */
|
|
53
58
|
onStartedFlow?: (flow: Flow) => void;
|
|
54
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Options forwarded to `player.start()` for every flow in the managed session,
|
|
62
|
+
* e.g. `{ format: "a2ui" }`. Defaults to the `"player"` format.
|
|
63
|
+
*/
|
|
64
|
+
startOptions?: StartOptions;
|
|
65
|
+
|
|
55
66
|
/** A callback when the entire async iteration is completed */
|
|
56
67
|
onComplete?: (finalState?: CompletedState) => void;
|
|
57
68
|
|
|
@@ -71,6 +82,9 @@ export type ManagedPlayerContext = {
|
|
|
71
82
|
|
|
72
83
|
/** The config for Player */
|
|
73
84
|
playerConfig: ReactPlayerOptions;
|
|
85
|
+
|
|
86
|
+
/** Options forwarded to `player.start()` for each flow (e.g. `{ format: "a2ui" }`) */
|
|
87
|
+
startOptions?: StartOptions;
|
|
74
88
|
};
|
|
75
89
|
|
|
76
90
|
export type ManagedPlayerState =
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { FlowManager, ManagedPlayerProps, ManagedPlayerState, ManagerMiddleware } from "./types";
|
|
3
|
+
import type { StartOptions } from "@player-ui/player";
|
|
3
4
|
import type { ReactPlayerOptions } from "../player";
|
|
4
5
|
export type StateChangeCallback = (state?: ManagedPlayerState) => void;
|
|
5
6
|
/**
|
|
@@ -21,6 +22,8 @@ declare class ManagedState {
|
|
|
21
22
|
manager: FlowManager;
|
|
22
23
|
/** the config to use when creating a player */
|
|
23
24
|
playerConfig: ReactPlayerOptions;
|
|
25
|
+
/** options forwarded to `player.start()` for each flow */
|
|
26
|
+
startOptions?: StartOptions;
|
|
24
27
|
}): this;
|
|
25
28
|
/** reset starts from nothing */
|
|
26
29
|
reset(): void;
|
|
@@ -37,6 +40,8 @@ export declare const usePersistentStateMachine: (options: {
|
|
|
37
40
|
playerConfig: ReactPlayerOptions;
|
|
38
41
|
/** Any middleware for the manager */
|
|
39
42
|
middleware?: ManagerMiddleware;
|
|
43
|
+
/** Options forwarded to `player.start()` for each flow */
|
|
44
|
+
startOptions?: StartOptions;
|
|
40
45
|
}) => {
|
|
41
46
|
managedState: ManagedState;
|
|
42
47
|
state?: ManagedPlayerState;
|
package/types/manager/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
|
-
import type { CompletedState, Flow, InProgressState } from "@player-ui/player";
|
|
2
|
+
import type { CompletedState, Flow, InProgressState, StartOptions } from "@player-ui/player";
|
|
3
3
|
import type { ReactPlayer, ReactPlayerOptions } from "../player";
|
|
4
4
|
export interface FinalState {
|
|
5
5
|
/** Mark the iteration as complete */
|
|
@@ -41,6 +41,11 @@ export interface ManagedPlayerProps extends ReactPlayerOptions {
|
|
|
41
41
|
manager: FlowManager;
|
|
42
42
|
/** A callback when a flow is started */
|
|
43
43
|
onStartedFlow?: (flow: Flow) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Options forwarded to `player.start()` for every flow in the managed session,
|
|
46
|
+
* e.g. `{ format: "a2ui" }`. Defaults to the `"player"` format.
|
|
47
|
+
*/
|
|
48
|
+
startOptions?: StartOptions;
|
|
44
49
|
/** A callback when the entire async iteration is completed */
|
|
45
50
|
onComplete?: (finalState?: CompletedState) => void;
|
|
46
51
|
/** A callback for any errors */
|
|
@@ -55,6 +60,8 @@ export type ManagedPlayerContext = {
|
|
|
55
60
|
reactPlayer: ReactPlayer;
|
|
56
61
|
/** The config for Player */
|
|
57
62
|
playerConfig: ReactPlayerOptions;
|
|
63
|
+
/** Options forwarded to `player.start()` for each flow (e.g. `{ format: "a2ui" }`) */
|
|
64
|
+
startOptions?: StartOptions;
|
|
58
65
|
};
|
|
59
66
|
export type ManagedPlayerState = {
|
|
60
67
|
/** The managed player hasn't started yet */
|