@player-ui/react 0.10.3--canary.585.19781 → 0.10.3--canary.597.20124
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 +61 -23
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +62 -24
- package/dist/index.mjs +62 -24
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/manager/managed-player.tsx +83 -35
- package/src/manager/types.ts +5 -0
- package/types/manager/managed-player.d.ts +8 -2
- package/types/manager/types.d.ts +3 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -486,6 +486,17 @@ var ManagedState = class {
|
|
|
486
486
|
this.setState(initialState);
|
|
487
487
|
return this;
|
|
488
488
|
}
|
|
489
|
+
sync(options) {
|
|
490
|
+
if (options.middleware) {
|
|
491
|
+
this.middleware = options.middleware;
|
|
492
|
+
}
|
|
493
|
+
if (options.playerConfig) {
|
|
494
|
+
if (this?.state?.context) {
|
|
495
|
+
this.state.context.playerConfig = options.playerConfig;
|
|
496
|
+
this.state.context.reactPlayer = new ReactPlayer2(options.playerConfig);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
489
500
|
/** reset starts from nothing */
|
|
490
501
|
reset() {
|
|
491
502
|
if (this.state?.value === "error") {
|
|
@@ -596,31 +607,13 @@ var ManagedState = class {
|
|
|
596
607
|
}
|
|
597
608
|
};
|
|
598
609
|
var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
|
|
599
|
-
function getOrCreateNewManagedState(key, middleware) {
|
|
600
|
-
const newManagedState = managedPlayerStateMachines.get(key) ?? new ManagedState({ middleware });
|
|
601
|
-
managedPlayerStateMachines.set(key, newManagedState);
|
|
602
|
-
return newManagedState;
|
|
603
|
-
}
|
|
604
610
|
var usePersistentStateMachine = (options) => {
|
|
605
611
|
const keyRef = import_react7.default.useRef({
|
|
606
612
|
_key: Symbol("managed-player")
|
|
607
613
|
});
|
|
608
|
-
const
|
|
609
|
-
|
|
610
|
-
options.middleware
|
|
611
|
-
);
|
|
612
|
-
const managedStateRef = import_react7.default.useRef(initialManagedState);
|
|
613
|
-
let managedState = managedStateRef.current;
|
|
614
|
+
const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware: options.middleware });
|
|
615
|
+
managedPlayerStateMachines.set(keyRef.current, managedState);
|
|
614
616
|
const [state, setState] = import_react7.default.useState(managedState.state);
|
|
615
|
-
import_react7.default.useEffect(() => {
|
|
616
|
-
if (state?.value === "completed") {
|
|
617
|
-
const newManagedState = getOrCreateNewManagedState(
|
|
618
|
-
keyRef.current,
|
|
619
|
-
options.middleware
|
|
620
|
-
);
|
|
621
|
-
managedState = newManagedState;
|
|
622
|
-
}
|
|
623
|
-
}, [options.manager, options.playerConfig]);
|
|
624
617
|
import_react7.default.useEffect(() => {
|
|
625
618
|
const unsub = managedState.addListener({
|
|
626
619
|
onState: (s) => {
|
|
@@ -631,19 +624,64 @@ var usePersistentStateMachine = (options) => {
|
|
|
631
624
|
managedState.start(options);
|
|
632
625
|
}
|
|
633
626
|
return unsub;
|
|
634
|
-
}, [
|
|
635
|
-
return {
|
|
627
|
+
}, []);
|
|
628
|
+
return { managedState, state };
|
|
636
629
|
};
|
|
630
|
+
function composeMiddleware(...functions) {
|
|
631
|
+
if (functions.length === 1) {
|
|
632
|
+
return functions[0];
|
|
633
|
+
}
|
|
634
|
+
const [fn, ...fns] = functions;
|
|
635
|
+
return fns.reduceRight(
|
|
636
|
+
(a, b) => (input) => {
|
|
637
|
+
return a(b(input));
|
|
638
|
+
},
|
|
639
|
+
fn
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
function usePrevious(value) {
|
|
643
|
+
const ref = (0, import_react7.useRef)();
|
|
644
|
+
(0, import_react7.useEffect)(() => {
|
|
645
|
+
ref.current = value;
|
|
646
|
+
});
|
|
647
|
+
return ref.current;
|
|
648
|
+
}
|
|
637
649
|
var ManagedPlayer = (props) => {
|
|
638
650
|
const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
|
|
651
|
+
const previousMiddleware = usePrevious(props.middleware);
|
|
652
|
+
const previousPlugins = usePrevious(props.plugins);
|
|
639
653
|
const { state, managedState } = usePersistentStateMachine({
|
|
640
654
|
manager: props.manager,
|
|
641
|
-
middleware: {
|
|
655
|
+
middleware: {
|
|
656
|
+
next: composeMiddleware(
|
|
657
|
+
...props?.middleware ?? [],
|
|
658
|
+
withRequestTime
|
|
659
|
+
)
|
|
660
|
+
},
|
|
642
661
|
playerConfig: {
|
|
643
662
|
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
|
|
644
663
|
player: props.player
|
|
645
664
|
}
|
|
646
665
|
});
|
|
666
|
+
if (state && state.value !== "running") {
|
|
667
|
+
if (previousMiddleware !== props.middleware) {
|
|
668
|
+
managedState.sync({
|
|
669
|
+
middleware: {
|
|
670
|
+
next: composeMiddleware(
|
|
671
|
+
...props?.middleware ?? [],
|
|
672
|
+
withRequestTime
|
|
673
|
+
)
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
if (previousPlugins !== props.plugins) {
|
|
678
|
+
managedState.sync({
|
|
679
|
+
playerConfig: {
|
|
680
|
+
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin]
|
|
681
|
+
}
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
}
|
|
647
685
|
import_react7.default.useEffect(() => {
|
|
648
686
|
if (state?.value === "ended") {
|
|
649
687
|
props.onComplete?.(state?.context.result);
|
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/utils/player-context.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n }\n\n /** Add a listener to state changes */\n public addListener(callback: StateChangeCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n }\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\nfunction getOrCreateNewManagedState(\n key: ManagedPlayerStateKey,\n middleware?: ManagerMiddleware,\n): ManagedState {\n const newManagedState =\n managedPlayerStateMachines.get(key) ??\n new ManagedState({ middleware: middleware });\n managedPlayerStateMachines.set(key, newManagedState);\n\n return newManagedState;\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}): { state: ManagedPlayerState | undefined; managedState: ManagedState } => {\n const keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const initialManagedState = getOrCreateNewManagedState(\n keyRef.current,\n options.middleware,\n );\n\n const managedStateRef = React.useRef(initialManagedState);\n let managedState = managedStateRef.current;\n const [state, setState] = React.useState(managedState.state);\n\n React.useEffect(() => {\n if (state?.value === \"completed\") {\n const newManagedState = getOrCreateNewManagedState(\n keyRef.current,\n options.middleware,\n );\n managedState = newManagedState;\n }\n }, [options.manager, options.playerConfig]);\n\n React.useEffect(() => {\n const unsub = managedState.addListener({\n onState: (s) => {\n setState(s);\n },\n });\n\n if (managedState.state === undefined) {\n managedState.start(options);\n }\n\n return unsub;\n }, [managedState]);\n\n return { state, managedState };\n};\n\n/**\n * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.\n * Provide a valid `FlowManager` to handle fetching the next flow.\n *\n * `suspense` must be enabled to wait for results in flight.\n */\nexport const ManagedPlayer = (\n props: ManagedPlayerProps,\n): React.ReactElement | 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 React.useEffect(() => {\n if (state?.value === \"ended\") {\n props.onComplete?.(state?.context.result);\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context.reactPlayer.player.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context.reactPlayer.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["ReactPlayer","import_react","import_player","React","leven","import_react","React","import_react","React","ReactPlayer","React","import_player","import_react","React","ReactPlayer","import_react","import_react","ReactPlayer","React"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/index.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/asset/index.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/player-context.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React, { useEffect, useRef } from \"react\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n MiddlewareMethod,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n }\n\n /** Add a listener to state changes */\n public addListener(callback: StateChangeCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n }\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n public sync(options: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n\n /** the config to use when creating a player */\n playerConfig?: ReactPlayerOptions;\n }): void {\n if (options.middleware) {\n this.middleware = options.middleware;\n }\n\n if (options.playerConfig) {\n if (this?.state?.context) {\n this.state.context.playerConfig = options.playerConfig;\n this.state.context.reactPlayer = new ReactPlayer(options.playerConfig);\n }\n }\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\n/** Creates an x-state state machine that persists when this component is no longer 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 keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: options.middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\n const [state, setState] = React.useState(managedState.state);\n\n React.useEffect(() => {\n const unsub = managedState.addListener({\n onState: (s) => {\n setState(s);\n },\n });\n\n if (managedState.state === undefined) {\n managedState.start(options);\n }\n\n return unsub;\n }, []);\n\n return { managedState, state };\n};\n\nfunction composeMiddleware<T>(...functions: MiddlewareMethod<T>[]) {\n if (functions.length === 1) {\n return functions[0];\n }\n\n const [fn, ...fns] = functions;\n\n return fns.reduceRight(\n (a, b) => (input) => {\n return a(b(input));\n },\n fn as MiddlewareMethod<T>,\n );\n}\n\nfunction usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n });\n\n return ref.current;\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 const previousMiddleware = usePrevious(props.middleware);\n const previousPlugins = usePrevious(props.plugins);\n\n const { state, managedState } = usePersistentStateMachine({\n manager: props.manager,\n middleware: {\n next: composeMiddleware(\n ...(props?.middleware ?? []),\n withRequestTime,\n ) as any,\n },\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n\n if (state && state.value !== \"running\") {\n if (previousMiddleware !== props.middleware) {\n managedState.sync({\n middleware: {\n next: composeMiddleware(\n ...(props?.middleware ?? []),\n withRequestTime,\n ) as any,\n },\n });\n }\n\n if (previousPlugins !== props.plugins) {\n managedState.sync({\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n },\n });\n }\n }\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n props.onComplete?.(state?.context.result);\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context.reactPlayer.player.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context.reactPlayer.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAc,8BAAd;;;ACCA,IAAAC,gBAAkB;AAClB,wBAAqD;AACrD,6BAA8C;AAC9C,oCAAyB;AAOzB,IAAAC,iBAAuB;AACvB,kCAA8B;;;ACZ9B,mBAAkB;AAClB,mBAAkB;AAaX,IAAM,eAAe,aAAAC,QAAM,cAA2B,CAAC,CAAC;AAKxD,IAAM,aAAa,CACxB,UACG;AACH,QAAM,EAAE,SAAS,IAAI,aAAAA,QAAM,WAAW,YAAY;AAElD,MAAI;AAEJ,MAAI,UAAU,SAAS,QAAQ,OAAO;AACpC,gBAAY;AAAA,EACd,WAAW,WAAW,OAAO;AAC3B,gBAAa,MAAkC;AAAA,EACjD;AAEA,MAAI,CAAC,WAAW;AACd,UAAM;AAAA,MACJ,0CAA0C,KAAK,UAAU,KAAK,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM;AAAA,MACJ,gCAAgC,OAAO,SAAS,cAAc,SAAS;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,QAAW;AAChC,UAAM,OACJ,UAAU,OAAO,SACb,KAAK,UAAU,KAAK,IACpB,OAAO,UAAU,EAAE;AACzB,UAAM,MAAM,6BAA6B,IAAI,EAAE;AAAA,EACjD;AAEA,MAAI,CAAC,YAAY,SAAS,gBAAgB,GAAG;AAC3C,UAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yIAGyH;AAAA,EACvI;AAEA,QAAM,OAAO,UAAU,IAAI,SAAS;AAEpC,MAAI,CAAC,MAAM;AACT,UAAM,YAAsB,CAAC;AAE7B,aAAS,QAAQ,CAAC,UAAU;AAC1B,gBAAU,KAAK,MAAM,GAAG;AAAA,IAC1B,CAAC;AAED,UAAM,WAAW,UAAU;AAAA,MACzB,CAAC,UAAU,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IAC/C;AAEA,UAAM,cAAc,SAAS,OAAO,CAAC,MAAM,SAAS;AAClD,YAAM,OAAO;AAAA,QACX,WAAO,aAAAC,SAAM,UAAU,MAAM,IAAI;AAAA,QACjC,MAAM;AAAA,MACR;AAEA,UAAI,SAAS,UAAa,KAAK,QAAQ,KAAK,OAAO;AACjD,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,GAAG,MAAS;AAEZ,UAAM;AAAA,MACJ,mCAAmC,UAAU,EAAE,UAAU,UAAU,IAAI,kBAAkB,YAAY,IAAI;AAAA;AAAA;AAAA;AAAA,QAEvG,KAAK,UAAU,SAAS,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,6BAAAD,QAAA,cAAC,QAAK,KAAK,UAAU,IAAK,GAAG,WAAW;AACjD;;;AC7FA,IAAAE,gBAAkB;AAaX,IAAM,gBAAgB,cAAAC,QAAM,cAAiC,CAAC,CAAC;AAK/D,IAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,OAAO,IAAI,cAAAA,QAAM,WAAW,aAAa;AAEjD,SAAO;AACT;;;ACrBA,oBAA2B;AAG3B,IAAM,aAAa,IAAI,yBAAW;AAK3B,SAAS,YAAoB;AAClC,QAAM,SAAS,UAAU;AAEzB,SAAO,QAAQ,UAAU;AAC3B;;;ACVO,SAAS,cAAc,OAAc;AAC1C,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,mBAAmB,MAAM;AAAA,EAC3B;AACF;;;ACLO,SAAS,YAAY,KAAa;AACvC,SAAO,IAAI,QAAQ,cAAc,EAAE;AACrC;AAKO,SAAS,4BACd,KACkC;AAClC,SAAO,OAAO,KAAK,GAAG,EAAE;AAAA,IACtB,CAAC,KAAK,QAAQ;AACZ,YAAM,QAAQ,IAAI,GAAG;AAErB,UAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,YAAI,GAAG,IAAI;AAAA,MACb;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;AAGO,SAAS,cAAc,KAA8B;AAC1D,SAAO,OAAO,KAAK,GAAG,EAAE,WAAW,KAAK,IAAI,gBAAgB;AAC9D;AAGO,SAAS,WACd,SAC+C;AAC/C,SAAO,QAAQ,mBAAmB,YAAY,OAAO,YAAY,UAAU;AAC7E;AAKO,SAAS,aAId,SAA8B,QAA4B;AAC1D,MAAI,WAAW,OAAO,GAAG;AACvB,WAAO,QAAQ,MAAM;AAAA,EACvB;AAEA,SAAO;AACT;;;AC/CO,SAAS,SACd,KACA,SAAkC,CAAC,GAC3B;AACR,QAAM,UAAU,IAAI,IAAI,GAAG;AAE3B,MAAI,UAAU,cAAc,MAAM,GAAG;AACnC,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,SAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACnC,UAAM,QAAQ,OAAO,GAAG;AACxB,YAAQ,aAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,EAChD,CAAC;AAED,SAAO,QAAQ,SAAS;AAC1B;;;AClBO,SAAS,qBAAqB,MAAc,KAAsB;AACvE,QAAM,SAAS,UAAU;AAEzB,SAAO,QAAQ,oBAAoB,aAAa,KAAK,IAAI;AAC3D;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,SAAS,UAAU;AAEzB,SAAO,QAAQ,oBAAoB,aAAa,KAAK,WAAW;AAClE;;;ACdA,IAAAC,gBAAkB;AAclB,IAAM,cAAc,CAAC,EAAE,KAAK,MAAwB;AAClD,SAAO,8BAAAC,QAAA,cAAC,cAAY,GAAG,MAAM;AAC/B;AAEA,IAAO,cAAQ;;;ACXf,IAAqB,iBAArB,MAA4D;AAAA,EAK1D,YAAY,UAA4B;AAJxC,gBAAO;AAKL,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAgB;AAEpB,UAAM,YAAY,CAAC,gBAAqB;AACtC,WAAK,iBAAiB,WAAW;AAAA,IACnC;AAGA,UAAM,UAAU,CAAC,SAAuB;AACtC,WAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS;AAAA,IAC9C;AAGA,WAAO,MAAM,KAAK,IAAI,KAAK,MAAM,OAAO;AAGxC,UAAM,qBAAqB,OAAO,SAAS;AAE3C,QAAI,mBAAmB,WAAW,eAAe;AAC/C,YAAM,EAAE,YAAY,IAAI,mBAAmB,YAAY;AAEvD,UAAI,aAAa;AACf,gBAAQ,WAAW;AACnB,cAAM,EAAE,WAAW,IAAI;AAEvB,YAAI,YAAY;AACd,eAAK,iBAAiB,UAAU;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ATzBA,IAAM,qBAAqB;AAC3B,IAAM,SAAS;AAWf,IAAM,UACJ,OAAO,WAAW,cAAc,SAAY;AAqCvC,IAAMC,eAAN,MAAkB;AAAA,EA6BvB,YAAY,SAA8B;AA1B1C,SAAgB,gBAAmC,IAAI,uCAAS;AAEhE,SAAgB,QAAQ;AAAA;AAAA;AAAA;AAAA,MAItB,cAAc,IAAI,oCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAO3D,iBAAiB,IAAI,oCAEnB;AAAA;AAAA;AAAA;AAAA,MAKF,mBAAmB,IAAI,oCAAsB;AAAA,IAC/C;AAEA,SAAQ,yBAAyB,IAAI,iCAAgB;AAInD,SAAK,UAAU,WAAW,CAAC;AAE3B,UAAM,WAAW,SAAS;AAC1B,UAAM,iBAAiB,IAAI;AAAA,MACzB,KAAK,uBAAuB;AAAA,IAC9B;AAEA,UAAM,UAAU,SAAS,WAAW,CAAC;AAErC,QAAI,UAAU;AACZ,cAAQ,KAAK,IAAI,SAAS,CAAC;AAAA,IAC7B;AAEA,UAAM,gBAAgB,QAAQ;AAAA,MAAO,CAAC,MACpC,QAAQ,EAAE,KAAK;AAAA,IACjB;AAEA,SAAK,SAAS,SAAS,UAAU,IAAI,sBAAO,EAAE,SAAS,cAAc,CAAC;AAEtE,YAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAI,OAAO,YAAY;AACrB,eAAO,WAAW,IAAI;AAAA,MACxB;AAAA,IACF,CAAC;AAED,mBAAe,MAAM,KAAK,MAAM;AAEhC,SAAK,YAAY,KAAK,2BAA2B;AACjD,SAAK,kBAAkB;AAAA,MACrB,eAAe,KAAK,OAAO,WAAW;AAAA,MACtC,cAAc,KAAK,OAAO,UAAU;AAAA,MACpC,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAGO,mBAA2B;AAChC,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA,EAGO,kBAA0B;AAC/B,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA,EAGO,WACL,QACoB;AACpB,WAAO,KAAK,QAAQ,SAAS,KAAK,CAAC,OAAO,GAAG,WAAW,MAAM;AAAA,EAChE;AAAA;AAAA,EAGO,eAAe,QAAiC;AACrD,QAAI,CAAC,OAAO;AAAY;AAExB,WAAO,WAAW,IAAI;AACtB,SAAK,QAAQ,SAAS,KAAK,MAAM;AAAA,EACnC;AAAA;AAAA,EAGO,wBAAgC;AACrC,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA,EAGO,uBAA+B;AACpC,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEQ,6BAA6E;AACnF,UAAM,WAAW,KAAK,MAAM,aAAa,KAAK,KAAK,gBAAgB,CAAC;AAGpE,UAAM,uBAAuB,CAAC,UAAqC;AACjE,aACE,8BAAAC,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,gBAAgB,MAAM;AAAA,UACtB,SAAS,CAAC,QAAQ;AAChB,kBAAM,cAAc,KAAK,OAAO,SAAS;AAEzC,gBAAI,YAAY,WAAW,eAAe;AACxC,0BAAY,KAAK,GAAG;AAAA,YACtB;AAAA,UACF;AAAA;AAAA,QAEA,8BAAAA,QAAA,cAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,QAAQ,KAAK,OAAO,KACnD,8BAAAA,QAAA,cAAC,YAAU,GAAG,OAAO,CACvB;AAAA,MACF;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkE;AACxE,UAAM,mBAAmB,KAAK,MAAM,gBAAgB,KAAK,WAAU;AAGnE,UAAM,qBAAqB,MAAM;AAC/B,YAAM,WAAO,2CAAyB,KAAK,sBAAsB;AACjE,WAAK,uBAAuB,QAAQ;AAEpC,aACE,8BAAAA,QAAA;AAAA,QAAC,aAAa;AAAA,QAAb;AAAA,UACC,OAAO;AAAA,YACL,UAAU,KAAK;AAAA,UACjB;AAAA;AAAA,QAEC,QAAQ,8BAAAA,QAAA,cAAC,oBAAiB,MAAY;AAAA,MACzC;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,2BAA2B;AAChC,UAAM,sBAAsB,KAAK,MAAM,kBAAkB,OAAO;AAEhE,WAAO,KAAK,uBAAuB;AAAA,MACjC,sBAAsB,KAAK,MAAM,kBAAkB,KAAK,IAAI;AAAA,IAC9D;AAAA,EACF;AAAA,EAEO,MAAM,MAAqC;AAChD,SAAK,yBAAyB;AAE9B,WAAO,KAAK,OAAO,MAAM,IAAI,EAAE,QAAQ,YAAY;AACjD,YAAM,KAAK,yBAAyB;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,YAAYD;;;AUjPzB,IAAAE,iBAAkC;AAClC,IAAAC,gBAAkB;;;ACIX,IAAM,iBAAN,MAAkD;AAAA,EAIvD,YAAY,UAA4C;AAHxD,gBAAO;AAIL,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAgB;AACpB,WAAO,MAAM,MAAM,IAAI,aAAa,CAAC,mBAAoC;AACvE,WAAK,iBAAiB,cAAc;AAAA,IACtC,CAAC;AAAA,EACH;AACF;;;ADCO,IAAM,iBAAiB,CAC5B,YACyB;AACzB,QAAM,CAAC,aAAa,cAAc,IAChC,cAAAC,QAAM,SAA0B,gCAAiB;AAEnD,QAAM,cAAc,cAAAA,QAAM,QAAQ,MAAM;AACtC,UAAM,KAAK,IAAIC,aAAY;AAAA,MACzB,QAAQ,SAAS;AAAA,MACjB,SAAS;AAAA,QACP,GAAI,SAAS,WAAW,CAAC;AAAA,QACzB,IAAI,eAAe,cAAc;AAAA,MACnC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,EAAE,OAAO,IAAI;AAEnB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AE7CA,IAAAC,gBAAyC;;;ACAzC,IAAAC,gBAAwD;AAGxD,4BAGO;AAWA,IAAM,iBAAiB,MAAM;AAClC,QAAM,qBAAiB,sBAAoB,CAAC,CAAC;AAE7C,+BAAU,MAAM;AACd,WAAO,MAAM;AACX,qBAAe,UAAU,CAAC;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,qBAAiB,2BAAY,MAAM;AACvC,UAAM,EAAE,KAAK,MAAM,IAAI,eAAe;AAEtC,QAAI,OAAO,OAAO;AAChB,aAAO,MAAM;AAAA,IACf;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,WAAS,gBAAsB,aAA2C;AACxE,UAAM,UAAU,OAAO,gBAAgB,cAAc,OAAO;AAC5D,mBAAe,UAAU,EAAE,OAAO,QAAQ,IAAI,EAAE;AAEhD,WAAO,YAAY,QAAQ,MAAM;AAC/B,qBAAe,UAAU;AAAA,QACvB,GAAG,eAAe;AAAA,QAClB,KAAK,QAAQ,IAAI;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,+BAA8C,uBAAQ,MAAM;AAChE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAsB;AAC1B,eAAO;AAAA,UACL;AAAA,UACA,CAAC,sBAAsB;AACrB,gBAAI,2CAAqB,cAAc,EAAE,MAAM,iBAAiB;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAO,EAAE,iBAAiB,yBAAyB;AACrD;;;ADhDA,SAAS,mBAAsB,MAAkB;AAC/C,SAAO;AACT;AAeA,IAAM,eAAN,MAAmB;AAAA,EAKjB,YAAY;AAAA,IACV;AAAA,EACF,GAGG;AACD,SAAK,aAAa;AAClB,SAAK,YAAY,CAAC;AAAA,EACpB;AAAA;AAAA,EAGO,YAAY,UAA2C;AAC5D,SAAK,UAAU,KAAK,QAAQ;AAE5B,WAAO,MAAM;AACX,WAAK,YAAY,KAAK,UAAU,OAAO,CAAC,MAAM,MAAM,QAAQ;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA,EAGO,MAAM,SAMJ;AACP,UAAM,eAAmC;AAAA,MACvC,OAAO;AAAA,MACP,SAAS;AAAA,QACP,cAAc,QAAQ;AAAA,QACtB,aAAa,IAAIC,aAAY,QAAQ,YAAY;AAAA,QACjD,SAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,SAAK,SAAS,YAAY;AAE1B,WAAO;AAAA,EACT;AAAA,EAEO,KAAK,SAMH;AACP,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,cAAc;AACxB,UAAI,MAAM,OAAO,SAAS;AACxB,aAAK,MAAM,QAAQ,eAAe,QAAQ;AAC1C,aAAK,MAAM,QAAQ,cAAc,IAAIA,aAAY,QAAQ,YAAY;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGO,QAAc;AACnB,QAAI,KAAK,OAAO,UAAU,SAAS;AACjC,YAAM,EAAE,cAAc,QAAQ,IAAI,KAAK,MAAM;AAC7C,WAAK,MAAM,EAAE,cAAc,QAAQ,CAAC;AAAA,IACtC,OAAO;AACL,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAGO,UAAgB;AACrB,QAAI,KAAK,OAAO,UAAU,SAAS;AACjC,YAAM,EAAE,cAAc,SAAS,YAAY,YAAY,IACrD,KAAK,MAAM;AACb,WAAK,SAAS;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,OAA2B;AAChD,SAAK,QAAQ;AACb,SAAK,UAAU,QAAQ,CAAC,MAAM;AAC5B,QAAE,QAAQ,KAAK;AAAA,IACjB,CAAC;AAED,UAAM,EAAE,SAAS,aAAa,aAAa,IAAI,MAAM;AAErD,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,aAAa,OAAO;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,WAAW;AACb,aAAK,SAAS,SAAS;AAAA,MACzB;AAAA,IACF,SAAS,GAAG;AACV,WAAK,SAAS;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,aACZ,OACA,SACyC;AACzC,QAAI,MAAM,UAAU,iBAAiB,MAAM,UAAU,aAAa;AAChE,YAAM,aACJ,MAAM,UAAU,cAAc,MAAM,QAAQ,SAAS;AAEvD,YAAM,aAAa,KAAK,YAAY,QAAQ;AAE5C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,UACP,GAAG;AAAA,UACH;AAAA,UACA,MAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK,UAAU,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,WAAW;AAC7B,YAAM,aAAa,MAAM,MAAM,QAAQ;AAEvC,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,YACP,GAAG;AAAA,YACH,QAAQ,MAAM,QAAQ;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,UACP,GAAG;AAAA,UACH,YAAY,MAAM,QAAQ;AAAA,UAC1B,MAAM,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,UAAU;AAC5B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,UACP,GAAG;AAAA,UACH,MAAM,MAAM,QAAQ;AAAA,UACpB,YAAY,MAAM,QAAQ;AAAA,UAC1B,QAAQ,MAAM,QAAQ,YAAY,MAAM,MAAM,QAAQ,IAAI;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,WAAW;AAC7B,YAAM,SAAS,MAAM,MAAM,QAAQ;AAEnC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,UACP,GAAG;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,6BAA6B,oBAAI,QAGrC;AAGK,IAAM,4BAA4B,CAAC,YASwB;AAChE,QAAM,SAAS,cAAAC,QAAM,OAA8B;AAAA,IACjD,MAAM,OAAO,gBAAgB;AAAA,EAC/B,CAAC;AAED,QAAM,eACJ,2BAA2B,IAAI,OAAO,OAAO,KAC7C,IAAI,aAAa,EAAE,YAAY,QAAQ,WAAW,CAAC;AACrD,6BAA2B,IAAI,OAAO,SAAS,YAAY;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAI,cAAAA,QAAM,SAAS,aAAa,KAAK;AAE3D,gBAAAA,QAAM,UAAU,MAAM;AACpB,UAAM,QAAQ,aAAa,YAAY;AAAA,MACrC,SAAS,CAAC,MAAM;AACd,iBAAS,CAAC;AAAA,MACZ;AAAA,IACF,CAAC;AAED,QAAI,aAAa,UAAU,QAAW;AACpC,mBAAa,MAAM,OAAO;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,cAAc,MAAM;AAC/B;AAEA,SAAS,qBAAwB,WAAkC;AACjE,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,UAAU,CAAC;AAAA,EACpB;AAEA,QAAM,CAAC,IAAI,GAAG,GAAG,IAAI;AAErB,SAAO,IAAI;AAAA,IACT,CAAC,GAAG,MAAM,CAAC,UAAU;AACnB,aAAO,EAAE,EAAE,KAAK,CAAC;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YAAe,OAAyB;AAC/C,QAAM,UAAM,sBAAU;AAEtB,+BAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO,IAAI;AACb;AAQO,IAAM,gBAAgB,CAC3B,UAC6B;AAC7B,QAAM,EAAE,iBAAiB,yBAAyB,IAAI,eAAe;AACrE,QAAM,qBAAqB,YAAY,MAAM,UAAU;AACvD,QAAM,kBAAkB,YAAY,MAAM,OAAO;AAEjD,QAAM,EAAE,OAAO,aAAa,IAAI,0BAA0B;AAAA,IACxD,SAAS,MAAM;AAAA,IACf,YAAY;AAAA,MACV,MAAM;AAAA,QACJ,GAAI,OAAO,cAAc,CAAC;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,SAAS,CAAC,GAAI,OAAO,WAAW,CAAC,GAAI,wBAAwB;AAAA,MAC7D,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF,CAAC;AAED,MAAI,SAAS,MAAM,UAAU,WAAW;AACtC,QAAI,uBAAuB,MAAM,YAAY;AAC3C,mBAAa,KAAK;AAAA,QAChB,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,GAAI,OAAO,cAAc,CAAC;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,oBAAoB,MAAM,SAAS;AACrC,mBAAa,KAAK;AAAA,QAChB,cAAc;AAAA,UACZ,SAAS,CAAC,GAAI,OAAO,WAAW,CAAC,GAAI,wBAAwB;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO,UAAU,SAAS;AAC5B,YAAM,aAAa,OAAO,QAAQ,MAAM;AAAA,IAC1C,WAAW,OAAO,UAAU,SAAS;AACnC,YAAM,UAAU,OAAO,QAAQ,KAAK;AAAA,IACtC,WAAW,OAAO,UAAU,WAAW;AACrC,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,gBAAAA,QAAM,UAAU,MAAM;AACpB,WAAO,MAAM;AACX,YAAM,cAAc,OAAO,QAAQ,YAAY,OAAO,SAAS;AAE/D,UAAI,OAAO,UAAU,aAAa,aAAa,WAAW,eAAe;AACvE,cAAM,QAAQ,YAAY,YAAY,YAAY,KAAK,UAAU,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,OAAO,QAAQ,YAAY,QAAQ,OAAO,KAAK,CAAC;AAEnE,MAAI,OAAO,UAAU,SAAS;AAC5B,QAAI,MAAM,mBAAmB;AAC3B,aACE,8BAAAA,QAAA;AAAA,QAAC,MAAM;AAAA,QAAN;AAAA,UACC,OAAO,MAAM;AACX,yBAAa,MAAM;AAAA,UACrB;AAAA,UACA,OAAO,MAAM;AACX,yBAAa,QAAQ;AAAA,UACvB;AAAA,UACA,OAAO,MAAM,QAAQ;AAAA;AAAA,MACvB;AAAA,IAEJ;AAEA,QAAI,CAAC,MAAM,SAAS;AAClB,YAAM,MAAM,QAAQ;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,aAAa;AAC9B,UAAM,EAAE,UAAU,IAAI,MAAM,QAAQ;AAEpC,WAAO,8BAAAA,QAAA,cAAC,eAAU;AAAA,EACpB;AAEA,SAAO;AACT;","names":["ReactPlayer","import_react","import_player","React","leven","import_react","React","import_react","React","ReactPlayer","React","import_player","import_react","React","ReactPlayer","import_react","import_react","ReactPlayer","React"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -357,7 +357,7 @@ var useReactPlayer = (options) => {
|
|
|
357
357
|
};
|
|
358
358
|
|
|
359
359
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx
|
|
360
|
-
import React6 from "react";
|
|
360
|
+
import React6, { useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
361
361
|
|
|
362
362
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx
|
|
363
363
|
import { useCallback, useEffect, useRef, useMemo } from "react";
|
|
@@ -435,6 +435,17 @@ var ManagedState = class {
|
|
|
435
435
|
this.setState(initialState);
|
|
436
436
|
return this;
|
|
437
437
|
}
|
|
438
|
+
sync(options) {
|
|
439
|
+
if (options.middleware) {
|
|
440
|
+
this.middleware = options.middleware;
|
|
441
|
+
}
|
|
442
|
+
if (options.playerConfig) {
|
|
443
|
+
if (this?.state?.context) {
|
|
444
|
+
this.state.context.playerConfig = options.playerConfig;
|
|
445
|
+
this.state.context.reactPlayer = new ReactPlayer2(options.playerConfig);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
438
449
|
/** reset starts from nothing */
|
|
439
450
|
reset() {
|
|
440
451
|
if (this.state?.value === "error") {
|
|
@@ -545,31 +556,13 @@ var ManagedState = class {
|
|
|
545
556
|
}
|
|
546
557
|
};
|
|
547
558
|
var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
|
|
548
|
-
function getOrCreateNewManagedState(key, middleware) {
|
|
549
|
-
const newManagedState = managedPlayerStateMachines.get(key) ?? new ManagedState({ middleware });
|
|
550
|
-
managedPlayerStateMachines.set(key, newManagedState);
|
|
551
|
-
return newManagedState;
|
|
552
|
-
}
|
|
553
559
|
var usePersistentStateMachine = (options) => {
|
|
554
560
|
const keyRef = React6.useRef({
|
|
555
561
|
_key: Symbol("managed-player")
|
|
556
562
|
});
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
options.middleware
|
|
560
|
-
);
|
|
561
|
-
const managedStateRef = React6.useRef(initialManagedState);
|
|
562
|
-
let managedState = managedStateRef.current;
|
|
563
|
+
const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware: options.middleware });
|
|
564
|
+
managedPlayerStateMachines.set(keyRef.current, managedState);
|
|
563
565
|
const [state, setState] = React6.useState(managedState.state);
|
|
564
|
-
React6.useEffect(() => {
|
|
565
|
-
if (state?.value === "completed") {
|
|
566
|
-
const newManagedState = getOrCreateNewManagedState(
|
|
567
|
-
keyRef.current,
|
|
568
|
-
options.middleware
|
|
569
|
-
);
|
|
570
|
-
managedState = newManagedState;
|
|
571
|
-
}
|
|
572
|
-
}, [options.manager, options.playerConfig]);
|
|
573
566
|
React6.useEffect(() => {
|
|
574
567
|
const unsub = managedState.addListener({
|
|
575
568
|
onState: (s) => {
|
|
@@ -580,19 +573,64 @@ var usePersistentStateMachine = (options) => {
|
|
|
580
573
|
managedState.start(options);
|
|
581
574
|
}
|
|
582
575
|
return unsub;
|
|
583
|
-
}, [
|
|
584
|
-
return {
|
|
576
|
+
}, []);
|
|
577
|
+
return { managedState, state };
|
|
585
578
|
};
|
|
579
|
+
function composeMiddleware(...functions) {
|
|
580
|
+
if (functions.length === 1) {
|
|
581
|
+
return functions[0];
|
|
582
|
+
}
|
|
583
|
+
const [fn, ...fns] = functions;
|
|
584
|
+
return fns.reduceRight(
|
|
585
|
+
(a, b) => (input) => {
|
|
586
|
+
return a(b(input));
|
|
587
|
+
},
|
|
588
|
+
fn
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
function usePrevious(value) {
|
|
592
|
+
const ref = useRef2();
|
|
593
|
+
useEffect2(() => {
|
|
594
|
+
ref.current = value;
|
|
595
|
+
});
|
|
596
|
+
return ref.current;
|
|
597
|
+
}
|
|
586
598
|
var ManagedPlayer = (props) => {
|
|
587
599
|
const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
|
|
600
|
+
const previousMiddleware = usePrevious(props.middleware);
|
|
601
|
+
const previousPlugins = usePrevious(props.plugins);
|
|
588
602
|
const { state, managedState } = usePersistentStateMachine({
|
|
589
603
|
manager: props.manager,
|
|
590
|
-
middleware: {
|
|
604
|
+
middleware: {
|
|
605
|
+
next: composeMiddleware(
|
|
606
|
+
...props?.middleware ?? [],
|
|
607
|
+
withRequestTime
|
|
608
|
+
)
|
|
609
|
+
},
|
|
591
610
|
playerConfig: {
|
|
592
611
|
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
|
|
593
612
|
player: props.player
|
|
594
613
|
}
|
|
595
614
|
});
|
|
615
|
+
if (state && state.value !== "running") {
|
|
616
|
+
if (previousMiddleware !== props.middleware) {
|
|
617
|
+
managedState.sync({
|
|
618
|
+
middleware: {
|
|
619
|
+
next: composeMiddleware(
|
|
620
|
+
...props?.middleware ?? [],
|
|
621
|
+
withRequestTime
|
|
622
|
+
)
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
if (previousPlugins !== props.plugins) {
|
|
627
|
+
managedState.sync({
|
|
628
|
+
playerConfig: {
|
|
629
|
+
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin]
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
}
|
|
596
634
|
React6.useEffect(() => {
|
|
597
635
|
if (state?.value === "ended") {
|
|
598
636
|
props.onComplete?.(state?.context.result);
|
package/dist/index.mjs
CHANGED
|
@@ -357,7 +357,7 @@ var useReactPlayer = (options) => {
|
|
|
357
357
|
};
|
|
358
358
|
|
|
359
359
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx
|
|
360
|
-
import React6 from "react";
|
|
360
|
+
import React6, { useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
361
361
|
|
|
362
362
|
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx
|
|
363
363
|
import { useCallback, useEffect, useRef, useMemo } from "react";
|
|
@@ -435,6 +435,17 @@ var ManagedState = class {
|
|
|
435
435
|
this.setState(initialState);
|
|
436
436
|
return this;
|
|
437
437
|
}
|
|
438
|
+
sync(options) {
|
|
439
|
+
if (options.middleware) {
|
|
440
|
+
this.middleware = options.middleware;
|
|
441
|
+
}
|
|
442
|
+
if (options.playerConfig) {
|
|
443
|
+
if (this?.state?.context) {
|
|
444
|
+
this.state.context.playerConfig = options.playerConfig;
|
|
445
|
+
this.state.context.reactPlayer = new ReactPlayer2(options.playerConfig);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
438
449
|
/** reset starts from nothing */
|
|
439
450
|
reset() {
|
|
440
451
|
if (this.state?.value === "error") {
|
|
@@ -545,31 +556,13 @@ var ManagedState = class {
|
|
|
545
556
|
}
|
|
546
557
|
};
|
|
547
558
|
var managedPlayerStateMachines = /* @__PURE__ */ new WeakMap();
|
|
548
|
-
function getOrCreateNewManagedState(key, middleware) {
|
|
549
|
-
const newManagedState = managedPlayerStateMachines.get(key) ?? new ManagedState({ middleware });
|
|
550
|
-
managedPlayerStateMachines.set(key, newManagedState);
|
|
551
|
-
return newManagedState;
|
|
552
|
-
}
|
|
553
559
|
var usePersistentStateMachine = (options) => {
|
|
554
560
|
const keyRef = React6.useRef({
|
|
555
561
|
_key: Symbol("managed-player")
|
|
556
562
|
});
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
options.middleware
|
|
560
|
-
);
|
|
561
|
-
const managedStateRef = React6.useRef(initialManagedState);
|
|
562
|
-
let managedState = managedStateRef.current;
|
|
563
|
+
const managedState = managedPlayerStateMachines.get(keyRef.current) ?? new ManagedState({ middleware: options.middleware });
|
|
564
|
+
managedPlayerStateMachines.set(keyRef.current, managedState);
|
|
563
565
|
const [state, setState] = React6.useState(managedState.state);
|
|
564
|
-
React6.useEffect(() => {
|
|
565
|
-
if (state?.value === "completed") {
|
|
566
|
-
const newManagedState = getOrCreateNewManagedState(
|
|
567
|
-
keyRef.current,
|
|
568
|
-
options.middleware
|
|
569
|
-
);
|
|
570
|
-
managedState = newManagedState;
|
|
571
|
-
}
|
|
572
|
-
}, [options.manager, options.playerConfig]);
|
|
573
566
|
React6.useEffect(() => {
|
|
574
567
|
const unsub = managedState.addListener({
|
|
575
568
|
onState: (s) => {
|
|
@@ -580,19 +573,64 @@ var usePersistentStateMachine = (options) => {
|
|
|
580
573
|
managedState.start(options);
|
|
581
574
|
}
|
|
582
575
|
return unsub;
|
|
583
|
-
}, [
|
|
584
|
-
return {
|
|
576
|
+
}, []);
|
|
577
|
+
return { managedState, state };
|
|
585
578
|
};
|
|
579
|
+
function composeMiddleware(...functions) {
|
|
580
|
+
if (functions.length === 1) {
|
|
581
|
+
return functions[0];
|
|
582
|
+
}
|
|
583
|
+
const [fn, ...fns] = functions;
|
|
584
|
+
return fns.reduceRight(
|
|
585
|
+
(a, b) => (input) => {
|
|
586
|
+
return a(b(input));
|
|
587
|
+
},
|
|
588
|
+
fn
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
function usePrevious(value) {
|
|
592
|
+
const ref = useRef2();
|
|
593
|
+
useEffect2(() => {
|
|
594
|
+
ref.current = value;
|
|
595
|
+
});
|
|
596
|
+
return ref.current;
|
|
597
|
+
}
|
|
586
598
|
var ManagedPlayer = (props) => {
|
|
587
599
|
const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
|
|
600
|
+
const previousMiddleware = usePrevious(props.middleware);
|
|
601
|
+
const previousPlugins = usePrevious(props.plugins);
|
|
588
602
|
const { state, managedState } = usePersistentStateMachine({
|
|
589
603
|
manager: props.manager,
|
|
590
|
-
middleware: {
|
|
604
|
+
middleware: {
|
|
605
|
+
next: composeMiddleware(
|
|
606
|
+
...props?.middleware ?? [],
|
|
607
|
+
withRequestTime
|
|
608
|
+
)
|
|
609
|
+
},
|
|
591
610
|
playerConfig: {
|
|
592
611
|
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin],
|
|
593
612
|
player: props.player
|
|
594
613
|
}
|
|
595
614
|
});
|
|
615
|
+
if (state && state.value !== "running") {
|
|
616
|
+
if (previousMiddleware !== props.middleware) {
|
|
617
|
+
managedState.sync({
|
|
618
|
+
middleware: {
|
|
619
|
+
next: composeMiddleware(
|
|
620
|
+
...props?.middleware ?? [],
|
|
621
|
+
withRequestTime
|
|
622
|
+
)
|
|
623
|
+
}
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
if (previousPlugins !== props.plugins) {
|
|
627
|
+
managedState.sync({
|
|
628
|
+
playerConfig: {
|
|
629
|
+
plugins: [...props?.plugins ?? [], RequestTimeMetricsPlugin]
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
}
|
|
596
634
|
React6.useEffect(() => {
|
|
597
635
|
if (state?.value === "ended") {
|
|
598
636
|
props.onComplete?.(state?.context.result);
|
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/utils/player-context.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React from \"react\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n }\n\n /** Add a listener to state changes */\n public addListener(callback: StateChangeCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n }\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\nfunction getOrCreateNewManagedState(\n key: ManagedPlayerStateKey,\n middleware?: ManagerMiddleware,\n): ManagedState {\n const newManagedState =\n managedPlayerStateMachines.get(key) ??\n new ManagedState({ middleware: middleware });\n managedPlayerStateMachines.set(key, newManagedState);\n\n return newManagedState;\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}): { state: ManagedPlayerState | undefined; managedState: ManagedState } => {\n const keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const initialManagedState = getOrCreateNewManagedState(\n keyRef.current,\n options.middleware,\n );\n\n const managedStateRef = React.useRef(initialManagedState);\n let managedState = managedStateRef.current;\n const [state, setState] = React.useState(managedState.state);\n\n React.useEffect(() => {\n if (state?.value === \"completed\") {\n const newManagedState = getOrCreateNewManagedState(\n keyRef.current,\n options.middleware,\n );\n managedState = newManagedState;\n }\n }, [options.manager, options.playerConfig]);\n\n React.useEffect(() => {\n const unsub = managedState.addListener({\n onState: (s) => {\n setState(s);\n },\n });\n\n if (managedState.state === undefined) {\n managedState.start(options);\n }\n\n return unsub;\n }, [managedState]);\n\n return { state, managedState };\n};\n\n/**\n * A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.\n * Provide a valid `FlowManager` to handle fetching the next flow.\n *\n * `suspense` must be enabled to wait for results in flight.\n */\nexport const ManagedPlayer = (\n props: ManagedPlayerProps,\n): React.ReactElement | 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 React.useEffect(() => {\n if (state?.value === \"ended\") {\n props.onComplete?.(state?.context.result);\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context.reactPlayer.player.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context.reactPlayer.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["React","React","React","React","ReactPlayer","React","React","React","ReactPlayer","React","ReactPlayer","React"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/asset/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/player-context.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-logger.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/use-asset-props.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/helpers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/url.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/utils/shared-constants.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/app.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/onupdate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/hooks.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/plugins/tapstate-plugin.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/managed-player.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/react/player/src/manager/request-time.tsx"],"sourcesContent":["export * from \"@player-ui/player\";\nexport * from \"./player\";\nexport * from \"./hooks\";\nexport * from \"./manager/managed-player\";\nexport * from \"./manager/request-time\";\nexport * from \"./manager/types\";\nexport * from \"./asset\";\nexport * from \"./utils\";\n","/* eslint-disable react/no-this-in-sfc */\nimport React from \"react\";\nimport { SyncWaterfallHook, AsyncParallelHook } from \"tapable-ts\";\nimport { Subscribe, useSubscribedState } from \"@player-ui/react-subscribe\";\nimport { Registry } from \"@player-ui/partial-match-registry\";\nimport type {\n CompletedState,\n PlayerPlugin,\n Flow,\n View,\n} from \"@player-ui/player\";\nimport { Player } from \"@player-ui/player\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport type { AssetRegistryType } from \"./asset\";\nimport { AssetContext } from \"./asset\";\nimport { PlayerContext } from \"./utils\";\n\nimport type { ReactPlayerProps } from \"./app\";\nimport PlayerComp from \"./app\";\nimport OnUpdatePlugin from \"./plugins/onupdate-plugin\";\n\nconst WEB_PLAYER_VERSION = \"__VERSION__\";\nconst COMMIT = \"__GIT_COMMIT__\";\n\nexport interface DevtoolsGlobals {\n /** A global for a plugin to load to Player for devtools */\n __PLAYER_DEVTOOLS_PLUGIN?: {\n new (): ReactPlayerPlugin;\n };\n}\n\nexport type DevtoolsWindow = typeof window & DevtoolsGlobals;\n\nconst _window: DevtoolsWindow | undefined =\n typeof window === \"undefined\" ? undefined : window;\n\nexport interface ReactPlayerInfo {\n /** Version of the running player */\n playerVersion: string;\n\n /** Version of the running reactPlayer */\n reactPlayerVersion: string;\n\n /** Hash of the HEAD commit used to build the current player version */\n playerCommit: string;\n\n /** Hash of the HEAD commit used to build the current reactPlayer version */\n reactPlayerCommit: string;\n}\n\nexport interface ReactPlayerPlugin extends Partial<PlayerPlugin> {\n /** The name of this plugin */\n name: string;\n\n /**\n * Attach listeners to the web-player instance\n */\n applyReact?: (reactPlayer: ReactPlayer) => void;\n}\n\nexport interface ReactPlayerOptions {\n /** A headless player instance to use */\n player?: Player;\n\n /** A set of plugins to apply to this player */\n plugins?: Array<ReactPlayerPlugin>;\n}\n\nexport type ReactPlayerComponentProps = Record<string, unknown>;\n\n/** A Player that renders UI through React */\nexport class ReactPlayer {\n public readonly options: ReactPlayerOptions;\n public readonly player: Player;\n public readonly assetRegistry: AssetRegistryType = new Registry();\n public readonly Component: React.ComponentType<ReactPlayerComponentProps>;\n public readonly hooks = {\n /**\n * A hook to create a React Component to be used for Player, regardless of the current flow state\n */\n webComponent: new SyncWaterfallHook<[React.ComponentType]>(),\n\n /**\n * A hook to create a React Component that's used to render a specific view.\n * It will be called for each view update from the core player.\n * Typically this will just be `Asset`\n */\n playerComponent: new SyncWaterfallHook<\n [React.ComponentType<ReactPlayerProps>]\n >(),\n\n /**\n * A hook to execute async tasks before the view resets to undefined\n */\n onBeforeViewReset: new AsyncParallelHook<[]>(),\n };\n\n private viewUpdateSubscription = new Subscribe<View>();\n private reactPlayerInfo: ReactPlayerInfo;\n\n constructor(options?: ReactPlayerOptions) {\n this.options = options ?? {};\n\n const Devtools = _window?.__PLAYER_DEVTOOLS_PLUGIN;\n const onUpdatePlugin = new OnUpdatePlugin(\n this.viewUpdateSubscription.publish,\n );\n\n const plugins = options?.plugins ?? [];\n\n if (Devtools) {\n plugins.push(new Devtools());\n }\n\n const playerPlugins = plugins.filter((p) =>\n Boolean(p.apply),\n ) as PlayerPlugin[];\n\n this.player = options?.player ?? new Player({ plugins: playerPlugins });\n\n plugins.forEach((plugin) => {\n if (plugin.applyReact) {\n plugin.applyReact(this);\n }\n });\n\n onUpdatePlugin.apply(this.player);\n\n this.Component = this.createReactPlayerComponent();\n this.reactPlayerInfo = {\n playerVersion: this.player.getVersion(),\n playerCommit: this.player.getCommit(),\n reactPlayerVersion: WEB_PLAYER_VERSION,\n reactPlayerCommit: COMMIT,\n };\n }\n\n /** Returns the current version of the underlying core Player */\n public getPlayerVersion(): string {\n return this.reactPlayerInfo.playerVersion;\n }\n\n /** Returns the git commit used to build this core Player version */\n public getPlayerCommit(): string {\n return this.reactPlayerInfo.playerCommit;\n }\n\n /** Find instance of [Plugin] that has been registered to the web player */\n public findPlugin<Plugin extends ReactPlayerPlugin>(\n symbol: symbol,\n ): Plugin | undefined {\n return this.options.plugins?.find((el) => el.symbol === symbol) as Plugin;\n }\n\n /** Register and apply [Plugin] if one with the same symbol is not already registered. */\n public registerPlugin(plugin: ReactPlayerPlugin): void {\n if (!plugin.applyReact) return;\n\n plugin.applyReact(this);\n this.options.plugins?.push(plugin);\n }\n\n /** Returns the current version of the running React Player */\n public getReactPlayerVersion(): string {\n return this.reactPlayerInfo.reactPlayerVersion;\n }\n\n /** Returns the git commit used to build the React Player version */\n public getReactPlayerCommit(): string {\n return this.reactPlayerInfo.reactPlayerCommit;\n }\n\n private createReactPlayerComponent(): React.ComponentType<ReactPlayerComponentProps> {\n const BaseComp = this.hooks.webComponent.call(this.createReactComp());\n\n /** Wrap the Error boundary and context provider after the hook call to catch anything wrapped by the hook */\n const ReactPlayerComponent = (props: ReactPlayerComponentProps) => {\n return (\n <ErrorBoundary\n fallbackRender={() => null}\n onError={(err) => {\n const playerState = this.player.getState();\n\n if (playerState.status === \"in-progress\") {\n playerState.fail(err);\n }\n }}\n >\n <PlayerContext.Provider value={{ player: this.player }}>\n <BaseComp {...props} />\n </PlayerContext.Provider>\n </ErrorBoundary>\n );\n };\n\n return ReactPlayerComponent;\n }\n\n private createReactComp(): React.ComponentType<ReactPlayerComponentProps> {\n const ActualPlayerComp = this.hooks.playerComponent.call(PlayerComp);\n\n /** the component to use to render the player */\n const WebPlayerComponent = () => {\n const view = useSubscribedState<View>(this.viewUpdateSubscription);\n this.viewUpdateSubscription.suspend();\n\n return (\n <AssetContext.Provider\n value={{\n registry: this.assetRegistry,\n }}\n >\n {view && <ActualPlayerComp view={view} />}\n </AssetContext.Provider>\n );\n };\n\n return WebPlayerComponent;\n }\n\n /**\n * Call this method to force the ReactPlayer to wait for the next view-update before performing the next render.\n * If the `suspense` option is set, this will suspend while an update is pending, otherwise nothing will be rendered.\n */\n public setWaitForNextViewUpdate() {\n const shouldCallResetHook = this.hooks.onBeforeViewReset.isUsed();\n\n return this.viewUpdateSubscription.reset(\n shouldCallResetHook ? this.hooks.onBeforeViewReset.call() : undefined,\n );\n }\n\n public start(flow: Flow): Promise<CompletedState> {\n this.setWaitForNextViewUpdate();\n\n return this.player.start(flow).finally(async () => {\n await this.setWaitForNextViewUpdate();\n });\n }\n}\n\n// For compatibility\nexport const WebPlayer = ReactPlayer;\n","import React from \"react\";\nimport leven from \"leven\";\nimport type { Asset as AssetType, AssetWrapper } from \"@player-ui/player\";\nimport type { Registry } from \"@player-ui/partial-match-registry\";\n\nexport type AssetRegistryType = Registry<React.ComponentType<any>>;\n\nexport interface ContextType {\n /**\n * A registry of Asset -> React Components\n */\n registry?: AssetRegistryType;\n}\n\nexport const AssetContext = React.createContext<ContextType>({});\n\n/**\n * A React Component that looks up an implementation from a registry\n */\nexport const ReactAsset = (\n props: AssetType<string> | AssetWrapper<AssetType<string>>,\n) => {\n const { registry } = React.useContext(AssetContext);\n\n let unwrapped;\n\n if (\"type\" in props && \"id\" in props) {\n unwrapped = props;\n } else if (\"asset\" in props) {\n unwrapped = (props as unknown as AssetWrapper).asset;\n }\n\n if (!unwrapped) {\n throw Error(\n `Cannot determine asset type for props: ${JSON.stringify(props)}`,\n );\n }\n\n if (typeof unwrapped !== \"object\") {\n throw Error(\n `Asset was not an object got (${typeof unwrapped}) instead: ${unwrapped}`,\n );\n }\n\n if (unwrapped.type === undefined) {\n const info =\n unwrapped.id === undefined\n ? JSON.stringify(props)\n : `id: ${unwrapped.id}`;\n throw Error(`Asset is missing type for ${info}`);\n }\n\n if (!registry || registry.isRegistryEmpty()) {\n throw Error(`No asset found in registry. This could happen for one of the following reasons: \\n\n 1. You might have no assets registered or no plugins added to the Player instance. \\n\n 2. You might have mismatching versions of React Asset Registry Context. \\n\n See https://player-ui.github.io/latest/tools/cli#player-dependency-versions-check for tips about how to debug and fix this problem`);\n }\n\n const Impl = registry?.get(unwrapped);\n\n if (!Impl) {\n const matchList: object[] = [];\n\n registry.forEach((asset) => {\n matchList.push(asset.key);\n });\n\n const typeList = matchList.map(\n (match) => JSON.parse(JSON.stringify(match)).type,\n );\n\n const similarType = typeList.reduce((prev, curr) => {\n const next = {\n value: leven(unwrapped.type, curr),\n type: curr,\n };\n\n if (prev !== undefined && prev.value < next.value) {\n return prev;\n }\n\n return next;\n }, undefined);\n\n throw Error(\n `No implementation found for id: ${unwrapped.id} type: ${unwrapped.type}. Did you mean ${similarType.type}? \\n \n Registered Asset matching functions are listed below: \\n\n ${JSON.stringify(matchList)}`,\n );\n }\n\n return <Impl key={unwrapped.id} {...unwrapped} />;\n};\n","import React from \"react\";\nimport type { Player, NavigationFlowViewState } from \"@player-ui/player\";\n\nexport interface PlayerContextType {\n /**\n * An instance of a headless player\n */\n player?: Player;\n\n /** The currently rendered view state */\n viewState?: NavigationFlowViewState;\n}\n\nexport const PlayerContext = React.createContext<PlayerContextType>({});\n\n/**\n * A hook to get the current player\n */\nexport const usePlayer = () => {\n const { player } = React.useContext(PlayerContext);\n\n return player;\n};\n","import type { Logger } from \"@player-ui/player\";\nimport { NoopLogger } from \"@player-ui/player\";\nimport { usePlayer } from \"./player-context\";\n\nconst noopLogger = new NoopLogger();\n\n/**\n * A hook to get the logger instance from the current player\n */\nexport function useLogger(): Logger {\n const player = usePlayer();\n\n return player?.logger ?? noopLogger;\n}\n","import type { Asset } from \"@player-ui/player\";\n\n/** Common props for any dom node */\nexport function useAssetProps(asset: Asset) {\n return {\n id: asset.id,\n \"data-asset-type\": asset.type,\n };\n}\n","/**\n * Trim leading and trailing slashes from string\n */\nexport function trimSlashes(str: string) {\n return str.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Removes any key: value pairs from an object when the value is null or undefined\n */\nexport function removeEmptyValuesFromObject(\n obj: Record<string, any>,\n): Record<string, NonNullable<any>> {\n return Object.keys(obj).reduce(\n (acc, key) => {\n const value = obj[key];\n\n if (value !== null && value !== undefined) {\n acc[key] = value;\n }\n\n return acc;\n },\n {} as Record<string, any>,\n );\n}\n\n/** Check if the object has no keys */\nexport function isEmptyObject(obj: Record<string, unknown>) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\n/** Check if the argument is a function */\nexport function isFunction<ReturnType>(\n maybeFn: ReturnType | ((...args: unknown[]) => ReturnType),\n): maybeFn is (...args: unknown[]) => ReturnType {\n return Boolean(maybeFn instanceof Function || typeof maybeFn === \"function\");\n}\n\n/**\n * Calls function with provided data or returns original value\n */\nexport function callOrReturn<\n ReturnType,\n FnArgs extends Array<unknown> = unknown[],\n FnType = (...args: FnArgs) => ReturnType,\n>(maybeFn: FnType | ReturnType, fnArgs: FnArgs): ReturnType {\n if (isFunction(maybeFn)) {\n return maybeFn(fnArgs) as ReturnType;\n }\n\n return maybeFn as ReturnType;\n}\n","import { isEmptyObject } from \"./helpers\";\n\n/**\n * Combines a URL with any additional parameters\n */\nexport function buildUrl(\n url: string,\n params: Record<string, unknown> = {},\n): string {\n const baseUrl = new URL(url);\n\n if (params && isEmptyObject(params)) {\n return baseUrl.toString();\n }\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n baseUrl.searchParams.append(key, String(value));\n });\n\n return baseUrl.toString();\n}\n","import { usePlayer } from \"./player-context\";\n\n/** Hook to get a constant under a specific namespace */\nexport function useGetConstantByType(type: string, key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, type);\n}\n\n/** Get a constant under the default namespace */\nexport function useGetConstant(key: string): unknown {\n const player = usePlayer();\n\n return player?.constantsController.getConstants(key, \"constants\");\n}\n","import React from \"react\";\nimport type { View } from \"@player-ui/player\";\nimport { ReactAsset } from \"./asset\";\n\nexport interface ReactPlayerProps {\n /**\n * The Content view object to render\n */\n view: View;\n}\n\n/**\n * The entry for the ReactPlayer's React tree\n */\nconst ReactPlayer = ({ view }: ReactPlayerProps) => {\n return <ReactAsset {...view} />;\n};\n\nexport default ReactPlayer;\n","import type { Player, PlayerPlugin, ViewInstance } from \"@player-ui/player\";\n\nexport type OnUpdateCallback = (update: any) => void;\n\n/**\n * A plugin that listens for view updates and publishes an event for when a view is updated\n */\nexport default class OnUpdatePlugin implements PlayerPlugin {\n name = \"view-update\";\n\n private readonly onUpdateCallback: OnUpdateCallback;\n\n constructor(onUpdate: OnUpdateCallback) {\n this.onUpdateCallback = onUpdate;\n }\n\n apply(player: Player) {\n /** Trigger the callback for the view update */\n const updateTap = (updatedView: any) => {\n this.onUpdateCallback(updatedView);\n };\n\n /** Trigger the callback for the view creation */\n const viewTap = (view: ViewInstance) => {\n view.hooks.onUpdate.tap(this.name, updateTap);\n };\n\n // Attach hooks for any new vc that gets created\n player.hooks.view.tap(this.name, viewTap);\n\n // Attach listeners and publish an update event for a view already in progress\n const currentPlayerState = player.getState();\n\n if (currentPlayerState.status === \"in-progress\") {\n const { currentView } = currentPlayerState.controllers.view;\n\n if (currentView) {\n viewTap(currentView);\n const { lastUpdate } = currentView;\n\n if (lastUpdate) {\n this.onUpdateCallback(lastUpdate);\n }\n }\n }\n }\n}\n","import type { Player, PlayerFlowState } from \"@player-ui/player\";\nimport { NOT_STARTED_STATE } from \"@player-ui/player\";\nimport React from \"react\";\nimport type { ReactPlayerOptions } from \"./player\";\nimport { ReactPlayer } from \"./player\";\nimport { StateTapPlugin } from \"./plugins/tapstate-plugin\";\n\nexport interface UseReactPlayerReturn {\n /** The web-player instance */\n reactPlayer: ReactPlayer;\n /** Player instance */\n player: Player;\n /** The state of Player */\n playerState: PlayerFlowState;\n}\n\n/**\n * The `useReactPlayer` hook is an easy way to integrate the web-player into your React app.\n * Simply supply your config, plugins, and an optional flow, which will be automatically started for you when changed.\n */\nexport const useReactPlayer = (\n options?: ReactPlayerOptions,\n): UseReactPlayerReturn => {\n const [playerState, setPlayerState] =\n React.useState<PlayerFlowState>(NOT_STARTED_STATE);\n\n const reactPlayer = React.useMemo(() => {\n const rp = new ReactPlayer({\n player: options?.player,\n plugins: [\n ...(options?.plugins ?? []),\n new StateTapPlugin(setPlayerState),\n ],\n });\n\n return rp;\n }, []);\n\n const { player } = reactPlayer;\n\n return {\n reactPlayer,\n player,\n playerState,\n };\n};\n","import type { PlayerFlowState, Player } from \"@player-ui/player\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\n/**\n * A plugin to tap into state transition changes and call an arbitrary update function\n */\nexport class StateTapPlugin implements ReactPlayerPlugin {\n name = \"statetap\";\n private callbackFunction: (state: PlayerFlowState) => void;\n\n constructor(callback: (state: PlayerFlowState) => void) {\n this.callbackFunction = callback;\n }\n\n apply(player: Player) {\n player.hooks.state.tap(\"usePlayer\", (newPlayerState: PlayerFlowState) => {\n this.callbackFunction(newPlayerState);\n });\n }\n}\n","import React, { useEffect, useRef } from \"react\";\nimport type {\n FlowManager,\n ManagedPlayerProps,\n ManagedPlayerState,\n ManagerMiddleware,\n ManagedPlayerContext,\n MiddlewareMethod,\n} from \"./types\";\nimport { useRequestTime } from \"./request-time\";\nimport type { ReactPlayerOptions } from \"../player\";\nimport { ReactPlayer } from \"../player\";\n\n/** noop middleware */\nfunction identityMiddleware<T>(next: Promise<T>) {\n return next;\n}\n\ninterface ManagedPlayerStateKey {\n /** the storage key for the state (outside of the react tree) */\n _key: symbol;\n}\n\nexport interface StateChangeCallback {\n /** Trigger for state changes */\n onState: (s: ManagedPlayerState) => void;\n}\n\n/**\n * An object to store the state of the managed player\n */\nclass ManagedState {\n public state?: ManagedPlayerState;\n private callbacks: Array<StateChangeCallback>;\n private middleware?: ManagerMiddleware;\n\n constructor({\n middleware,\n }: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n }) {\n this.middleware = middleware;\n this.callbacks = [];\n }\n\n /** Add a listener to state changes */\n public addListener(callback: StateChangeCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n this.callbacks = this.callbacks.filter((s) => s !== callback);\n };\n }\n\n /** start the managed flow */\n public start(options: {\n /** the flow manager to use */\n manager: FlowManager;\n\n /** the config to use when creating a player */\n playerConfig: ReactPlayerOptions;\n }): this {\n const initialState: ManagedPlayerState = {\n value: \"not_started\",\n context: {\n playerConfig: options.playerConfig,\n reactPlayer: new ReactPlayer(options.playerConfig),\n manager: options.manager,\n },\n };\n\n this.setState(initialState);\n\n return this;\n }\n\n public sync(options: {\n /** middleware to use in the managed player */\n middleware?: ManagerMiddleware;\n\n /** the config to use when creating a player */\n playerConfig?: ReactPlayerOptions;\n }): void {\n if (options.middleware) {\n this.middleware = options.middleware;\n }\n\n if (options.playerConfig) {\n if (this?.state?.context) {\n this.state.context.playerConfig = options.playerConfig;\n this.state.context.reactPlayer = new ReactPlayer(options.playerConfig);\n }\n }\n }\n\n /** reset starts from nothing */\n public reset(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager } = this.state.context;\n this.start({ playerConfig, manager });\n } else {\n throw new Error(\"Flow must be in error state to reset\");\n }\n }\n\n /** restart starts from the last result */\n public restart(): void {\n if (this.state?.value === \"error\") {\n const { playerConfig, manager, prevResult, reactPlayer } =\n this.state.context;\n this.setState({\n value: \"completed\",\n context: {\n playerConfig,\n manager,\n result: prevResult,\n reactPlayer,\n },\n });\n } else {\n throw new Error(\"Flow must be in error state to restart\");\n }\n }\n\n private async setState(state: ManagedPlayerState) {\n this.state = state;\n this.callbacks.forEach((c) => {\n c.onState(state);\n });\n\n const { manager, reactPlayer, playerConfig } = state.context;\n\n try {\n const nextState = await this.processState(state, {\n manager,\n reactPlayer,\n playerConfig,\n });\n\n if (nextState) {\n this.setState(nextState);\n }\n } catch (e) {\n this.setState({\n value: \"error\",\n context: {\n manager,\n reactPlayer,\n playerConfig,\n error: e as Error,\n },\n });\n }\n }\n\n private async processState(\n state: ManagedPlayerState,\n context: ManagedPlayerContext,\n ): Promise<ManagedPlayerState | undefined> {\n if (state.value === \"not_started\" || state.value === \"completed\") {\n const prevResult =\n state.value === \"completed\" ? state.context.result : undefined;\n\n const middleware = this.middleware?.next ?? identityMiddleware;\n\n return {\n value: \"pending\",\n context: {\n ...context,\n prevResult,\n next: middleware(state.context.manager.next(prevResult)),\n },\n };\n }\n\n if (state.value === \"pending\") {\n const nextResult = await state.context.next;\n\n if (nextResult.done) {\n return {\n value: \"ended\",\n context: {\n ...context,\n result: state.context.prevResult,\n },\n };\n }\n\n return {\n value: \"loaded\",\n context: {\n ...context,\n prevResult: state.context.prevResult,\n flow: nextResult.value,\n },\n };\n }\n\n if (state.value === \"loaded\") {\n return {\n value: \"running\",\n context: {\n ...context,\n flow: state.context.flow,\n prevResult: state.context.prevResult,\n result: state.context.reactPlayer.start(state.context.flow),\n },\n };\n }\n\n if (state.value === \"running\") {\n const result = await state.context.result;\n\n return {\n value: \"completed\",\n context: {\n ...context,\n result,\n },\n };\n }\n }\n}\n\nconst managedPlayerStateMachines = new WeakMap<\n ManagedPlayerStateKey,\n ManagedState\n>();\n\n/** Creates an x-state state machine that persists when this component is no longer 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 keyRef = React.useRef<ManagedPlayerStateKey>({\n _key: Symbol(\"managed-player\"),\n });\n\n const managedState =\n managedPlayerStateMachines.get(keyRef.current) ??\n new ManagedState({ middleware: options.middleware });\n managedPlayerStateMachines.set(keyRef.current, managedState);\n const [state, setState] = React.useState(managedState.state);\n\n React.useEffect(() => {\n const unsub = managedState.addListener({\n onState: (s) => {\n setState(s);\n },\n });\n\n if (managedState.state === undefined) {\n managedState.start(options);\n }\n\n return unsub;\n }, []);\n\n return { managedState, state };\n};\n\nfunction composeMiddleware<T>(...functions: MiddlewareMethod<T>[]) {\n if (functions.length === 1) {\n return functions[0];\n }\n\n const [fn, ...fns] = functions;\n\n return fns.reduceRight(\n (a, b) => (input) => {\n return a(b(input));\n },\n fn as MiddlewareMethod<T>,\n );\n}\n\nfunction usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n });\n\n return ref.current;\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 const previousMiddleware = usePrevious(props.middleware);\n const previousPlugins = usePrevious(props.plugins);\n\n const { state, managedState } = usePersistentStateMachine({\n manager: props.manager,\n middleware: {\n next: composeMiddleware(\n ...(props?.middleware ?? []),\n withRequestTime,\n ) as any,\n },\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n player: props.player,\n },\n });\n\n if (state && state.value !== \"running\") {\n if (previousMiddleware !== props.middleware) {\n managedState.sync({\n middleware: {\n next: composeMiddleware(\n ...(props?.middleware ?? []),\n withRequestTime,\n ) as any,\n },\n });\n }\n\n if (previousPlugins !== props.plugins) {\n managedState.sync({\n playerConfig: {\n plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],\n },\n });\n }\n }\n\n React.useEffect(() => {\n if (state?.value === \"ended\") {\n props.onComplete?.(state?.context.result);\n } else if (state?.value === \"error\") {\n props.onError?.(state?.context.error);\n } else if (state?.value === \"running\") {\n props.onStartedFlow?.();\n }\n }, [state]);\n\n React.useEffect(() => {\n return () => {\n const playerState = state?.context.reactPlayer.player.getState();\n\n if (state?.value === \"running\" && playerState?.status === \"in-progress\") {\n props.manager.terminate?.(playerState.controllers.data.serialize());\n }\n };\n }, [props.manager, state?.context.reactPlayer.player, state?.value]);\n\n if (state?.value === \"error\") {\n if (props.fallbackComponent) {\n return (\n <props.fallbackComponent\n reset={() => {\n managedState.reset();\n }}\n retry={() => {\n managedState.restart();\n }}\n error={state.context.error}\n />\n );\n }\n\n if (!props.onError) {\n throw state.context.error;\n }\n }\n\n if (state?.context.reactPlayer) {\n const { Component } = state.context.reactPlayer;\n\n return <Component />;\n }\n\n return null;\n};\n","import { useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type { Player } from \"@player-ui/player\";\nimport type { MetricsCorePlugin } from \"@player-ui/metrics-plugin\";\nimport {\n MetricsCorePluginSymbol,\n RequestTimeWebPlugin,\n} from \"@player-ui/metrics-plugin\";\nimport type { ReactPlayerPlugin } from \"../player\";\n\ntype RequestTime = {\n /** request start time */\n start?: number;\n /** request end time */\n end?: number;\n};\n\n/** hook to time a promise and add it to the metrics plugin */\nexport const useRequestTime = () => {\n const requestTimeRef = useRef<RequestTime>({});\n\n useEffect(() => {\n return () => {\n requestTimeRef.current = {};\n };\n }, [requestTimeRef]);\n\n const getRequestTime = useCallback(() => {\n const { end, start } = requestTimeRef.current;\n\n if (end && start) {\n return end - start;\n }\n }, [requestTimeRef]);\n\n /** wrap a promise with tracking it's time in flight */\n function withRequestTime<Type>(nextPromise: Promise<Type>): Promise<Type> {\n const getTime = typeof performance === \"undefined\" ? Date : performance;\n requestTimeRef.current = { start: getTime.now() };\n\n return nextPromise.finally(() => {\n requestTimeRef.current = {\n ...requestTimeRef.current,\n end: getTime.now(),\n };\n });\n }\n\n const RequestTimeMetricsPlugin: ReactPlayerPlugin = useMemo(() => {\n return {\n name: \"RequestTimeMetricsPlugin\",\n apply(player: Player): void {\n player.applyTo<MetricsCorePlugin>(\n MetricsCorePluginSymbol,\n (metricsCorePlugin) => {\n new RequestTimeWebPlugin(getRequestTime).apply(metricsCorePlugin);\n },\n );\n },\n };\n }, [getRequestTime]);\n\n return { withRequestTime, RequestTimeMetricsPlugin };\n};\n"],"mappings":"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","names":["React","React","React","React","ReactPlayer","React","React","React","ReactPlayer","React","useEffect","useRef","ReactPlayer","React","useRef","useEffect"]}
|
package/package.json
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
"types"
|
|
7
7
|
],
|
|
8
8
|
"name": "@player-ui/react",
|
|
9
|
-
"version": "0.10.3--canary.
|
|
9
|
+
"version": "0.10.3--canary.597.20124",
|
|
10
10
|
"main": "dist/cjs/index.cjs",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@player-ui/metrics-plugin": "0.10.3--canary.
|
|
13
|
-
"@player-ui/partial-match-registry": "0.10.3--canary.
|
|
14
|
-
"@player-ui/player": "0.10.3--canary.
|
|
15
|
-
"@player-ui/react-subscribe": "0.10.3--canary.
|
|
12
|
+
"@player-ui/metrics-plugin": "0.10.3--canary.597.20124",
|
|
13
|
+
"@player-ui/partial-match-registry": "0.10.3--canary.597.20124",
|
|
14
|
+
"@player-ui/player": "0.10.3--canary.597.20124",
|
|
15
|
+
"@player-ui/react-subscribe": "0.10.3--canary.597.20124",
|
|
16
16
|
"react-error-boundary": "^3.1.3",
|
|
17
17
|
"tapable-ts": "^0.2.3",
|
|
18
18
|
"leven": "3.1.0",
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useEffect, useRef } from "react";
|
|
2
2
|
import type {
|
|
3
3
|
FlowManager,
|
|
4
4
|
ManagedPlayerProps,
|
|
5
5
|
ManagedPlayerState,
|
|
6
6
|
ManagerMiddleware,
|
|
7
7
|
ManagedPlayerContext,
|
|
8
|
+
MiddlewareMethod,
|
|
8
9
|
} from "./types";
|
|
9
10
|
import { useRequestTime } from "./request-time";
|
|
10
11
|
import type { ReactPlayerOptions } from "../player";
|
|
@@ -74,6 +75,25 @@ class ManagedState {
|
|
|
74
75
|
return this;
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
public sync(options: {
|
|
79
|
+
/** middleware to use in the managed player */
|
|
80
|
+
middleware?: ManagerMiddleware;
|
|
81
|
+
|
|
82
|
+
/** the config to use when creating a player */
|
|
83
|
+
playerConfig?: ReactPlayerOptions;
|
|
84
|
+
}): void {
|
|
85
|
+
if (options.middleware) {
|
|
86
|
+
this.middleware = options.middleware;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (options.playerConfig) {
|
|
90
|
+
if (this?.state?.context) {
|
|
91
|
+
this.state.context.playerConfig = options.playerConfig;
|
|
92
|
+
this.state.context.reactPlayer = new ReactPlayer(options.playerConfig);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
77
97
|
/** reset starts from nothing */
|
|
78
98
|
public reset(): void {
|
|
79
99
|
if (this.state?.value === "error") {
|
|
@@ -208,18 +228,6 @@ const managedPlayerStateMachines = new WeakMap<
|
|
|
208
228
|
ManagedState
|
|
209
229
|
>();
|
|
210
230
|
|
|
211
|
-
function getOrCreateNewManagedState(
|
|
212
|
-
key: ManagedPlayerStateKey,
|
|
213
|
-
middleware?: ManagerMiddleware,
|
|
214
|
-
): ManagedState {
|
|
215
|
-
const newManagedState =
|
|
216
|
-
managedPlayerStateMachines.get(key) ??
|
|
217
|
-
new ManagedState({ middleware: middleware });
|
|
218
|
-
managedPlayerStateMachines.set(key, newManagedState);
|
|
219
|
-
|
|
220
|
-
return newManagedState;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
231
|
/** Creates an x-state state machine that persists when this component is no longer renders (due to Suspense) */
|
|
224
232
|
export const usePersistentStateMachine = (options: {
|
|
225
233
|
/** the flow manager to use */
|
|
@@ -230,30 +238,17 @@ export const usePersistentStateMachine = (options: {
|
|
|
230
238
|
|
|
231
239
|
/** Any middleware for the manager */
|
|
232
240
|
middleware?: ManagerMiddleware;
|
|
233
|
-
}): {
|
|
241
|
+
}): { managedState: ManagedState; state?: ManagedPlayerState } => {
|
|
234
242
|
const keyRef = React.useRef<ManagedPlayerStateKey>({
|
|
235
243
|
_key: Symbol("managed-player"),
|
|
236
244
|
});
|
|
237
245
|
|
|
238
|
-
const
|
|
239
|
-
keyRef.current
|
|
240
|
-
options.middleware
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
const managedStateRef = React.useRef(initialManagedState);
|
|
244
|
-
let managedState = managedStateRef.current;
|
|
246
|
+
const managedState =
|
|
247
|
+
managedPlayerStateMachines.get(keyRef.current) ??
|
|
248
|
+
new ManagedState({ middleware: options.middleware });
|
|
249
|
+
managedPlayerStateMachines.set(keyRef.current, managedState);
|
|
245
250
|
const [state, setState] = React.useState(managedState.state);
|
|
246
251
|
|
|
247
|
-
React.useEffect(() => {
|
|
248
|
-
if (state?.value === "completed") {
|
|
249
|
-
const newManagedState = getOrCreateNewManagedState(
|
|
250
|
-
keyRef.current,
|
|
251
|
-
options.middleware,
|
|
252
|
-
);
|
|
253
|
-
managedState = newManagedState;
|
|
254
|
-
}
|
|
255
|
-
}, [options.manager, options.playerConfig]);
|
|
256
|
-
|
|
257
252
|
React.useEffect(() => {
|
|
258
253
|
const unsub = managedState.addListener({
|
|
259
254
|
onState: (s) => {
|
|
@@ -266,11 +261,36 @@ export const usePersistentStateMachine = (options: {
|
|
|
266
261
|
}
|
|
267
262
|
|
|
268
263
|
return unsub;
|
|
269
|
-
}, [
|
|
264
|
+
}, []);
|
|
270
265
|
|
|
271
|
-
return {
|
|
266
|
+
return { managedState, state };
|
|
272
267
|
};
|
|
273
268
|
|
|
269
|
+
function composeMiddleware<T>(...functions: MiddlewareMethod<T>[]) {
|
|
270
|
+
if (functions.length === 1) {
|
|
271
|
+
return functions[0];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const [fn, ...fns] = functions;
|
|
275
|
+
|
|
276
|
+
return fns.reduceRight(
|
|
277
|
+
(a, b) => (input) => {
|
|
278
|
+
return a(b(input));
|
|
279
|
+
},
|
|
280
|
+
fn as MiddlewareMethod<T>,
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function usePrevious<T>(value: T): T | undefined {
|
|
285
|
+
const ref = useRef<T>();
|
|
286
|
+
|
|
287
|
+
useEffect(() => {
|
|
288
|
+
ref.current = value;
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
return ref.current;
|
|
292
|
+
}
|
|
293
|
+
|
|
274
294
|
/**
|
|
275
295
|
* A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.
|
|
276
296
|
* Provide a valid `FlowManager` to handle fetching the next flow.
|
|
@@ -279,18 +299,46 @@ export const usePersistentStateMachine = (options: {
|
|
|
279
299
|
*/
|
|
280
300
|
export const ManagedPlayer = (
|
|
281
301
|
props: ManagedPlayerProps,
|
|
282
|
-
): React.
|
|
302
|
+
): React.JSX.Element | null => {
|
|
283
303
|
const { withRequestTime, RequestTimeMetricsPlugin } = useRequestTime();
|
|
304
|
+
const previousMiddleware = usePrevious(props.middleware);
|
|
305
|
+
const previousPlugins = usePrevious(props.plugins);
|
|
284
306
|
|
|
285
307
|
const { state, managedState } = usePersistentStateMachine({
|
|
286
308
|
manager: props.manager,
|
|
287
|
-
middleware: {
|
|
309
|
+
middleware: {
|
|
310
|
+
next: composeMiddleware(
|
|
311
|
+
...(props?.middleware ?? []),
|
|
312
|
+
withRequestTime,
|
|
313
|
+
) as any,
|
|
314
|
+
},
|
|
288
315
|
playerConfig: {
|
|
289
316
|
plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],
|
|
290
317
|
player: props.player,
|
|
291
318
|
},
|
|
292
319
|
});
|
|
293
320
|
|
|
321
|
+
if (state && state.value !== "running") {
|
|
322
|
+
if (previousMiddleware !== props.middleware) {
|
|
323
|
+
managedState.sync({
|
|
324
|
+
middleware: {
|
|
325
|
+
next: composeMiddleware(
|
|
326
|
+
...(props?.middleware ?? []),
|
|
327
|
+
withRequestTime,
|
|
328
|
+
) as any,
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
if (previousPlugins !== props.plugins) {
|
|
334
|
+
managedState.sync({
|
|
335
|
+
playerConfig: {
|
|
336
|
+
plugins: [...(props?.plugins ?? []), RequestTimeMetricsPlugin],
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
294
342
|
React.useEffect(() => {
|
|
295
343
|
if (state?.value === "ended") {
|
|
296
344
|
props.onComplete?.(state?.context.result);
|
package/src/manager/types.ts
CHANGED
|
@@ -58,6 +58,9 @@ export interface ManagedPlayerProps extends ReactPlayerOptions {
|
|
|
58
58
|
/** A callback for any errors */
|
|
59
59
|
onError?: (e: Error) => void;
|
|
60
60
|
|
|
61
|
+
/** middleware to use in the managed player */
|
|
62
|
+
middleware?: MiddlewareMethod<unknown>[];
|
|
63
|
+
|
|
61
64
|
/** A component to render when there are errors */
|
|
62
65
|
fallbackComponent?: React.ComponentType<FallbackProps>;
|
|
63
66
|
}
|
|
@@ -160,3 +163,5 @@ export interface ManagerMiddleware {
|
|
|
160
163
|
/** Middleware for a response from the managed-player */
|
|
161
164
|
next?: <Type>(nextPromise: Promise<Type>) => Promise<Type>;
|
|
162
165
|
}
|
|
166
|
+
|
|
167
|
+
export type MiddlewareMethod<T> = (value: Promise<T>) => Promise<T>;
|
|
@@ -25,6 +25,12 @@ declare class ManagedState {
|
|
|
25
25
|
/** the config to use when creating a player */
|
|
26
26
|
playerConfig: ReactPlayerOptions;
|
|
27
27
|
}): this;
|
|
28
|
+
sync(options: {
|
|
29
|
+
/** middleware to use in the managed player */
|
|
30
|
+
middleware?: ManagerMiddleware;
|
|
31
|
+
/** the config to use when creating a player */
|
|
32
|
+
playerConfig?: ReactPlayerOptions;
|
|
33
|
+
}): void;
|
|
28
34
|
/** reset starts from nothing */
|
|
29
35
|
reset(): void;
|
|
30
36
|
/** restart starts from the last result */
|
|
@@ -41,8 +47,8 @@ export declare const usePersistentStateMachine: (options: {
|
|
|
41
47
|
/** Any middleware for the manager */
|
|
42
48
|
middleware?: ManagerMiddleware;
|
|
43
49
|
}) => {
|
|
44
|
-
state: ManagedPlayerState | undefined;
|
|
45
50
|
managedState: ManagedState;
|
|
51
|
+
state?: ManagedPlayerState;
|
|
46
52
|
};
|
|
47
53
|
/**
|
|
48
54
|
* A ManagedPlayer is a component responsible for orchestrating multi-flow experiences using Player.
|
|
@@ -50,6 +56,6 @@ export declare const usePersistentStateMachine: (options: {
|
|
|
50
56
|
*
|
|
51
57
|
* `suspense` must be enabled to wait for results in flight.
|
|
52
58
|
*/
|
|
53
|
-
export declare const ManagedPlayer: (props: ManagedPlayerProps) => React.
|
|
59
|
+
export declare const ManagedPlayer: (props: ManagedPlayerProps) => React.JSX.Element | null;
|
|
54
60
|
export {};
|
|
55
61
|
//# sourceMappingURL=managed-player.d.ts.map
|
package/types/manager/types.d.ts
CHANGED
|
@@ -43,6 +43,8 @@ export interface ManagedPlayerProps extends ReactPlayerOptions {
|
|
|
43
43
|
onComplete?: (finalState?: CompletedState) => void;
|
|
44
44
|
/** A callback for any errors */
|
|
45
45
|
onError?: (e: Error) => void;
|
|
46
|
+
/** middleware to use in the managed player */
|
|
47
|
+
middleware?: MiddlewareMethod<unknown>[];
|
|
46
48
|
/** A component to render when there are errors */
|
|
47
49
|
fallbackComponent?: React.ComponentType<FallbackProps>;
|
|
48
50
|
}
|
|
@@ -122,4 +124,5 @@ export interface ManagerMiddleware {
|
|
|
122
124
|
/** Middleware for a response from the managed-player */
|
|
123
125
|
next?: <Type>(nextPromise: Promise<Type>) => Promise<Type>;
|
|
124
126
|
}
|
|
127
|
+
export type MiddlewareMethod<T> = (value: Promise<T>) => Promise<T>;
|
|
125
128
|
//# sourceMappingURL=types.d.ts.map
|