@whop/iframe
Version:
Powers communication between Whop and your embedded app
1 lines • 29.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/sdk/apps-server.ts","../src/sdk/utils.ts","../src/sdk/transport/utils.ts","../src/sdk/transport/sdk.ts","../src/sdk/transport/postmessage.ts","../src/sdk/transport/index.ts","../src/sdk/transport/handler.ts","../src/sdk/whop-server.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { frostedV2Theme } from \"./utils\";\n\nexport const appsServerSchema = z.discriminatedUnion(\"event\", [\n\tz.object({\n\t\tevent: z.literal(\"appPing\"),\n\t\trequest: z.literal(\"app_ping\"),\n\t\tresponse: z.literal(\"app_pong\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"onColorThemeChange\"),\n\t\trequest: frostedV2Theme,\n\t\tresponse: z.void(),\n\t}),\n]);\n\nexport type AppsServerSchema = z.TypeOf<typeof appsServerSchema>;\n","import { type ZodSchema, z } from \"zod\";\n\nexport const withError = <T extends ZodSchema, E extends ZodSchema>(\n\tschema: T,\n\terror: E,\n) => {\n\treturn z.discriminatedUnion(\"status\", [\n\t\tz.object({\n\t\t\tstatus: z.literal(\"ok\"),\n\t\t\tdata: schema,\n\t\t}),\n\t\tz.object({\n\t\t\tstatus: z.literal(\"error\"),\n\t\t\terror: error,\n\t\t}),\n\t]);\n};\n\nexport const frostedV2Theme = z\n\t.object({\n\t\tappearance: z.enum([\"light\", \"dark\"]),\n\t\taccentColor: z.string(),\n\t\tdangerColor: z.string(),\n\t\tgrayColor: z.string(),\n\t\tinfoColor: z.string(),\n\t\tsuccessColor: z.string(),\n\t\twarningColor: z.string(),\n\t})\n\t.partial();\n","export class TimeoutError extends Error {\n\tconstructor() {\n\t\tsuper(\"Timeout\");\n\t}\n}\n\nexport function randomId(length: number) {\n\tconst alphabet =\n\t\t\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\tlet str = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tstr += alphabet[Math.floor(Math.random() * alphabet.length)];\n\t}\n\treturn str;\n}\n","import type {\n\tZodDiscriminatedUnion,\n\tZodLiteral,\n\tZodObject,\n\tZodRawShape,\n\tZodTypeAny,\n\tz,\n} from \"zod\";\nimport { TimeoutError, randomId } from \"./utils\";\n\nexport type ValidZodEventSchema = ZodDiscriminatedUnion<\n\t\"event\",\n\tZodObject<\n\t\t{\n\t\t\tevent: ZodLiteral<string>;\n\t\t\trequest: ZodTypeAny;\n\t\t\tresponse: ZodTypeAny;\n\t\t} & ZodRawShape\n\t>[]\n>;\n\ntype MaybePromise<T> = Promise<T> | T;\n\ntype T = z.infer<ValidZodEventSchema>;\n\ntype FullServerImplementation<Schema extends ValidZodEventSchema> = {\n\t[K in NonNullable<z.infer<Schema>[\"event\"]>]: (\n\t\trequest: Extract<z.infer<Schema>, { event: K }>[\"request\"],\n\t) => MaybePromise<Extract<z.infer<Schema>, { event: K }>[\"response\"]>;\n};\n\nexport type ClientSDK<\n\tClientSchema extends ValidZodEventSchema,\n\tComplete extends boolean,\n> = {\n\t[K in NonNullable<z.infer<ClientSchema>[\"event\"]>]: (\n\t\treq: Extract<z.infer<ClientSchema>, { event: K }>[\"request\"],\n\t) => Promise<\n\t\tComplete extends true\n\t\t\t? Extract<z.infer<ClientSchema>, { event: K }>[\"response\"]\n\t\t\t: Extract<z.infer<ClientSchema>, { event: K }>[\"response\"] | undefined\n\t>;\n};\n\nexport type ServerImplementation<\n\tSchema extends ValidZodEventSchema,\n\tForceCompleteness extends boolean = false,\n> = ForceCompleteness extends true\n\t? FullServerImplementation<Schema>\n\t: Partial<FullServerImplementation<Schema>>;\n\ntype FullServerMiddlewareImplementation<\n\tSchema extends ValidZodEventSchema,\n\tForceCompleteness extends boolean = false,\n> = {\n\t[K in NonNullable<z.infer<Schema>[\"event\"]>]: (\n\t\trequest: Extract<z.infer<Schema>, { event: K }>[\"request\"],\n\t\tnext: ForceCompleteness extends true\n\t\t\t? (\n\t\t\t\t\trequest: Extract<z.infer<Schema>, { event: K }>[\"request\"],\n\t\t\t\t) => MaybePromise<Extract<z.infer<Schema>, { event: K }>[\"response\"]>\n\t\t\t:\n\t\t\t\t\t| ((\n\t\t\t\t\t\t\trequest: Extract<z.infer<Schema>, { event: K }>[\"request\"],\n\t\t\t\t\t ) => MaybePromise<\n\t\t\t\t\t\t\tExtract<z.infer<Schema>, { event: K }>[\"response\"]\n\t\t\t\t\t >)\n\t\t\t\t\t| undefined,\n\t) => MaybePromise<\n\t\tForceCompleteness extends true\n\t\t\t? Extract<z.infer<Schema>, { event: K }>[\"response\"]\n\t\t\t: Extract<z.infer<Schema>, { event: K }>[\"response\"] | undefined\n\t>;\n};\nexport type ServerMiddleware<\n\tSchema extends ValidZodEventSchema,\n\tForceCompleteness extends boolean = false,\n> = Partial<FullServerMiddlewareImplementation<Schema, ForceCompleteness>>;\n\nexport type Transport<ServerSchema extends ValidZodEventSchema | undefined> = {\n\tsend: (\n\t\tevent: string,\n\t\tdata: unknown,\n\t\tparams: { localAppId: string; remoteAppId: string },\n\t) => unknown;\n\trecv: (\n\t\thandler: (\n\t\t\tevent: string,\n\t\t\tdata: unknown,\n\t\t) => Promise<\n\t\t\t| (ServerSchema extends ValidZodEventSchema\n\t\t\t\t\t? z.infer<ServerSchema>[\"response\"]\n\t\t\t\t\t: undefined)\n\t\t\t| undefined\n\t\t>,\n\t\tparams: { localAppId: string; remoteAppId: string },\n\t\t// biome-ignore lint/suspicious/noConfusingVoidType: idk\n\t) => void | (() => void);\n\tcleanup?: () => void;\n};\n\nexport function createSDK<\n\tClientSchema extends ValidZodEventSchema | undefined,\n\tServerSchema extends ValidZodEventSchema | undefined,\n\tForceCompleteness extends boolean = false,\n\tServerComplete extends boolean = false,\n>({\n\tclientSchema,\n\tserverSchema,\n\tserverComplete,\n\ttransport,\n\ttimeout = 1000,\n\ttimeouts,\n\tlocalAppId,\n\tremoteAppId,\n\tserverImplementation = {},\n\tserverMiddleware,\n}: {\n\tclientSchema: ClientSchema;\n\tserverSchema: ServerSchema;\n\tforceCompleteness?: ForceCompleteness;\n\tserverComplete?: ServerComplete;\n\tlocalAppId: string;\n\tremoteAppId: string;\n\tserverMiddleware?: ServerSchema extends ValidZodEventSchema\n\t\t? ServerMiddleware<ServerSchema, ForceCompleteness>[]\n\t\t: undefined;\n\tserverImplementation: ServerSchema extends ValidZodEventSchema\n\t\t? ServerImplementation<ServerSchema, ForceCompleteness>\n\t\t: undefined;\n\ttransport: Transport<ServerSchema>;\n\ttimeout?: number;\n\ttimeouts?: ClientSchema extends ValidZodEventSchema\n\t\t? {\n\t\t\t\t[K in NonNullable<z.infer<ClientSchema>[\"event\"]>]?: number;\n\t\t\t}\n\t\t: never;\n}): (ClientSchema extends ValidZodEventSchema\n\t? ClientSDK<ClientSchema, ServerComplete>\n\t: object) & {\n\t_cleanupTransport: () => void;\n} {\n\tconst callbacks: {\n\t\tid: string;\n\t\tresolve: (data: unknown) => void;\n\t}[] = [];\n\n\tconst keys =\n\t\tclientSchema?.options.map(\n\t\t\t(option) => option._def.shape().event._def.value,\n\t\t) ?? [];\n\n\tconst client = Object.fromEntries(\n\t\tkeys.map((key) => [\n\t\t\tkey,\n\t\t\tasync (req: unknown) => {\n\t\t\t\t// We make event id unique so that we can fire many requests at the same time.\n\t\t\t\tconst eventId = `${localAppId}:${key}:${randomId(8)}`;\n\n\t\t\t\tconsole.debug(\"[typed-transport] app. Created eventId\", eventId);\n\n\t\t\t\tconst responseData = new Promise((resolve, reject) => {\n\t\t\t\t\t// Timeout the request after the specified timeout\n\t\t\t\t\tconst customTimeout = timeouts?.[key];\n\n\t\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\t\tconst index = callbacks.findIndex((cb) => cb.id === eventId);\n\t\t\t\t\t\tif (index !== -1) callbacks.splice(index, 1);\n\t\t\t\t\t\tif (serverComplete) {\n\t\t\t\t\t\t\tconsole.debug(\"[typed-transport] app. Timeout error\");\n\t\t\t\t\t\t\treject(new TimeoutError());\n\t\t\t\t\t\t} else resolve(undefined);\n\t\t\t\t\t}, customTimeout ?? timeout);\n\n\t\t\t\t\tif (customTimeout && customTimeout > timeout && !serverComplete) {\n\t\t\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\t\t\tconst index = callbacks.findIndex((cb) => cb.id === eventId);\n\t\t\t\t\t\t\tif (index !== -1) callbacks.splice(index, 1);\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}, timeout);\n\t\t\t\t\t\tcallbacks.push({\n\t\t\t\t\t\t\tid: `${eventId}:processing`,\n\t\t\t\t\t\t\tresolve: () => clearTimeout(timeoutId),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tcallbacks.push({\n\t\t\t\t\t\tid: eventId,\n\t\t\t\t\t\tresolve: (data) => {\n\t\t\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconsole.debug(\"[typed-transport] app sending event\", {\n\t\t\t\t\teventId,\n\t\t\t\t\tlocalAppId,\n\t\t\t\t\tremoteAppId,\n\t\t\t\t});\n\t\t\t\tawait transport.send?.(eventId, req, { localAppId, remoteAppId });\n\n\t\t\t\tconst data = await responseData;\n\n\t\t\t\tconsole.debug(\"[typed-transport] received response\", data);\n\n\t\t\t\treturn data;\n\t\t\t},\n\t\t]),\n\t) as (ClientSchema extends ValidZodEventSchema\n\t\t? ClientSDK<ClientSchema, ServerComplete>\n\t\t: object) & {\n\t\t_cleanupTransport: () => void;\n\t};\n\n\tconst cleanupRecv = transport.recv(\n\t\tasync (event, dataAny) => {\n\t\t\tconst [app, key, _randomId, type] = event.split(\":\");\n\t\t\tif (app === localAppId) {\n\t\t\t\t// Here we are receiving a response from a request we made.\n\t\t\t\tconst idx = callbacks.findIndex((cb) => cb.id === event);\n\t\t\t\tif (idx === -1) return;\n\t\t\t\tconst dataSchema = clientSchema?.optionsMap.get(key);\n\t\t\t\tif (!dataSchema) return;\n\t\t\t\tconst cb = callbacks[idx];\n\t\t\t\tif (type === \"processing\") {\n\t\t\t\t\tcb.resolve(undefined);\n\t\t\t\t} else {\n\t\t\t\t\tconst data = dataSchema.shape.response.parse(dataAny);\n\t\t\t\t\tcallbacks.splice(idx, 1);\n\t\t\t\t\tcb.resolve(data);\n\t\t\t\t}\n\t\t\t} else if (app === remoteAppId) {\n\t\t\t\tif (serverImplementation === undefined) return;\n\t\t\t\t// Here we are responding to a request from a client.\n\n\t\t\t\t// final handler\n\t\t\t\tlet handler = (\n\t\t\t\t\tserverImplementation as unknown as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\t(data: unknown) => Promise<unknown>\n\t\t\t\t\t>\n\t\t\t\t)[key];\n\n\t\t\t\t// Build a linked list of middleware invocations that will call the final handler.\n\t\t\t\tif (serverMiddleware) {\n\t\t\t\t\tfor (let i = serverMiddleware.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst middlewareDef = serverMiddleware[i];\n\t\t\t\t\t\tconst middleware = middlewareDef[key] as (\n\t\t\t\t\t\t\tdata: unknown,\n\t\t\t\t\t\t\tnext: unknown,\n\t\t\t\t\t\t) => Promise<unknown>;\n\t\t\t\t\t\tif (!middleware) continue;\n\t\t\t\t\t\tconst ref = handler;\n\t\t\t\t\t\thandler = (data: unknown) => middleware(data, ref);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!handler) return;\n\t\t\t\tconst dataSchema = serverSchema?.optionsMap.get(key);\n\t\t\t\tif (!dataSchema) return;\n\t\t\t\tconst data = dataSchema.shape.request.parse(dataAny);\n\n\t\t\t\t// If our handler doesn't complete in 80% of the default message timeout, we send a message to the caller, saying that we are expecting an answer.\n\t\t\t\tconst timeoutId = setTimeout(async () => {\n\t\t\t\t\tawait transport.send(\n\t\t\t\t\t\t`${event}:processing`,\n\t\t\t\t\t\t{},\n\t\t\t\t\t\t{ localAppId, remoteAppId },\n\t\t\t\t\t);\n\t\t\t\t}, 50);\n\n\t\t\t\tconst response = await handler(data);\n\n\t\t\t\tclearTimeout(timeoutId);\n\n\t\t\t\tawait transport.send(event, response, { localAppId, remoteAppId });\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: will fix at some point\n\t\t\t\treturn response as any;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tlocalAppId,\n\t\t\tremoteAppId,\n\t\t},\n\t);\n\n\tconst cleanupFunctions: (() => void)[] = [];\n\tif (transport.cleanup) cleanupFunctions.push(transport.cleanup);\n\tif (cleanupRecv) cleanupFunctions.push(cleanupRecv);\n\n\tclient._cleanupTransport = () => {\n\t\tfor (const fn of cleanupFunctions) fn();\n\t};\n\n\treturn client;\n}\n","import type { Transport, ValidZodEventSchema } from \"./sdk\";\n\nexport const MESSAGE_TAG = \"typed-transport\";\n\nexport function postmessageTransport<\n\tServerSchema extends ValidZodEventSchema | undefined = undefined,\n>({\n\tremoteWindow,\n\ttargetOrigins,\n}: {\n\tremoteWindow: Window | undefined;\n\ttargetOrigins: string[];\n}): Transport<ServerSchema> {\n\treturn {\n\t\tsend(event, data, { remoteAppId, localAppId }) {\n\t\t\tif (!remoteWindow) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"No remote window. Is the SDK running on a server without a global window object?\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsole.debug(\n\t\t\t\t\"[typed-transport] postmessagetransport. Sending event\",\n\t\t\t\tevent,\n\t\t\t\tdata,\n\t\t\t);\n\t\t\tconsole.debug(\n\t\t\t\t\"[typed-transport] postmessagetransport. target origins =\",\n\t\t\t\ttargetOrigins,\n\t\t\t);\n\n\t\t\tfor (const targetOrigin of targetOrigins) {\n\t\t\t\tconsole.debug(\"[typed-transport] remoteWindow.postMessage\", {\n\t\t\t\t\tevent,\n\t\t\t\t\tlibId: MESSAGE_TAG,\n\t\t\t\t\treceiverAppId: remoteAppId,\n\t\t\t\t\tsenderAppId: localAppId,\n\t\t\t\t});\n\t\t\t\tconsole.debug(\n\t\t\t\t\t\"[typed-transport] remoteWindow.postMessage.data\",\n\t\t\t\t\tdata,\n\t\t\t\t\tJSON.stringify(data),\n\t\t\t\t);\n\n\t\t\t\tremoteWindow.postMessage(\n\t\t\t\t\t{\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tlibId: MESSAGE_TAG,\n\t\t\t\t\t\treceiverAppId: remoteAppId,\n\t\t\t\t\t\tsenderAppId: localAppId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttargetOrigin,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (targetOrigins.length === 0) {\n\t\t\t\tremoteWindow.postMessage({\n\t\t\t\t\tevent,\n\t\t\t\t\tdata,\n\t\t\t\t\tlibId: MESSAGE_TAG,\n\t\t\t\t\treceiverAppId: remoteAppId,\n\t\t\t\t\tsenderAppId: localAppId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\trecv(handler, { localAppId, remoteAppId }) {\n\t\t\tconst listener = (event: MessageEvent) => {\n\t\t\t\tconsole.debug(\n\t\t\t\t\t\"[typed-transport] postmessagetransport. Receiving event\",\n\t\t\t\t\tevent,\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\tevent.source !== remoteWindow ||\n\t\t\t\t\t(!targetOrigins.includes(event.origin) && targetOrigins.length > 0) ||\n\t\t\t\t\t!event.data ||\n\t\t\t\t\t!event.data.event ||\n\t\t\t\t\tevent.data.libId !== MESSAGE_TAG ||\n\t\t\t\t\tevent.data.receiverAppId !== localAppId ||\n\t\t\t\t\tevent.data.senderAppId !== remoteAppId\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\thandler(event.data.event, event.data.data);\n\t\t\t};\n\n\t\t\tif (typeof window === \"undefined\") {\n\t\t\t\t// Stop logging this as it's causing more confusion than it's worth.\n\t\t\t\t// console.warn(\n\t\t\t\t// 'No window. Is the SDK running on a server without a global window object?',\n\t\t\t\t// );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.addEventListener(\"message\", listener);\n\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener(\"message\", listener);\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function reactNativeClientTransport<\n\tServerSchema extends ValidZodEventSchema | undefined = undefined,\n>({\n\tpostMessage,\n\ttargetOrigin,\n}: {\n\tpostMessage: (data: string) => void;\n\ttargetOrigin: string;\n}): Transport<ServerSchema> {\n\treturn {\n\t\tsend(event, data, { remoteAppId, localAppId }) {\n\t\t\tpostMessage(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tevent,\n\t\t\t\t\tdata,\n\t\t\t\t\tlibId: MESSAGE_TAG,\n\t\t\t\t\treceiverAppId: remoteAppId,\n\t\t\t\t\tsenderAppId: localAppId,\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\trecv(handler, { localAppId, remoteAppId }) {\n\t\t\tconst listener = (event: MessageEvent) => {\n\t\t\t\tconst dataString = typeof event.data === \"string\" ? event.data : null;\n\t\t\t\tif (!dataString) return;\n\n\t\t\t\tconst data = JSON.parse(dataString);\n\n\t\t\t\tif (\n\t\t\t\t\tevent.origin !== targetOrigin ||\n\t\t\t\t\t!data ||\n\t\t\t\t\t!data.event ||\n\t\t\t\t\t!data.data ||\n\t\t\t\t\tdata.libId !== MESSAGE_TAG ||\n\t\t\t\t\tdata.receiverAppId !== localAppId ||\n\t\t\t\t\tdata.senderAppId !== remoteAppId\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\thandler(data.event, data.data);\n\t\t\t};\n\n\t\t\tif (typeof window === \"undefined\") {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"No window. Is the SDK running on a server without a global window object?\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.addEventListener(\"message\", listener);\n\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener(\"message\", listener);\n\t\t\t};\n\t\t},\n\t};\n}\n","export { createHandler } from \"./handler\";\nexport { MESSAGE_TAG, postmessageTransport } from \"./postmessage\";\nexport { createSDK } from \"./sdk\";\n\nexport type {\n\tClientSDK,\n\tServerImplementation,\n\tTransport,\n\tValidZodEventSchema,\n} from \"./sdk\";\n\nexport { TimeoutError } from \"./utils\";\n","import type { z } from \"zod\";\nimport {\n\ttype ServerImplementation,\n\ttype ValidZodEventSchema,\n\tcreateSDK,\n} from \"./sdk\";\n\nexport function createHandler<\n\tSchema extends ValidZodEventSchema,\n\tForceCompleteness extends boolean = false,\n>({\n\tschema,\n\tforceCompleteness,\n\thandlers,\n}: {\n\tschema: Schema;\n\tforceCompleteness?: ForceCompleteness;\n\thandlers: Schema extends ValidZodEventSchema\n\t\t? ServerImplementation<Schema, ForceCompleteness>\n\t\t: undefined;\n}) {\n\tlet eventHandler: (\n\t\tevent: string,\n\t\tdata: unknown,\n\t) => Promise<\n\t\t| (Schema extends ValidZodEventSchema\n\t\t\t\t? z.TypeOf<Schema>[\"response\"]\n\t\t\t\t: undefined)\n\t\t| undefined\n\t>;\n\n\tcreateSDK<undefined, Schema, ForceCompleteness, false>({\n\t\tclientSchema: undefined,\n\t\tserverSchema: schema,\n\t\tlocalAppId: \"client\",\n\t\tremoteAppId: \"server\",\n\t\tforceCompleteness,\n\t\tserverImplementation: handlers,\n\t\ttransport: {\n\t\t\tsend() {\n\t\t\t\t// empty, only handling incoming events\n\t\t\t},\n\t\t\trecv(handler) {\n\t\t\t\teventHandler = handler;\n\t\t\t},\n\t\t},\n\t});\n\n\treturn (event: string, data: unknown) => {\n\t\treturn eventHandler(`server:${event}`, data);\n\t};\n}\n","import { z } from \"zod\";\nimport { frostedV2Theme, withError } from \"./utils\";\n\nexport const whopServerSchema = z.discriminatedUnion(\"event\", [\n\tz.object({\n\t\tevent: z.literal(\"ping\"),\n\t\trequest: z.literal(\"ping\"),\n\t\tresponse: z.literal(\"pong\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"getTopLevelUrlData\"),\n\t\trequest: z.object({}).optional(),\n\t\tresponse: z.object({\n\t\t\tcompanyRoute: z.string(),\n\t\t\texperienceRoute: z.string(),\n\t\t\texperienceId: z.string(),\n\t\t\tviewType: z.enum([\"app\", \"admin\", \"analytics\", \"preview\"]),\n\t\t\tbaseHref: z.string(),\n\t\t\tfullHref: z.string(),\n\t\t}),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"openExternalUrl\"),\n\t\trequest: z.object({\n\t\t\tnewTab: z.boolean().optional(),\n\t\t\turl: z.string(),\n\t\t}),\n\t\tresponse: z.literal(\"ok\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"onHrefChange\"),\n\t\trequest: z.object({\n\t\t\thref: z.string(),\n\t\t}),\n\t\tresponse: z.literal(\"ok\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"inAppPurchase\"),\n\t\trequest: z.object({\n\t\t\t/**\n\t\t\t * ID returned from the `chargeUser` API call.\n\t\t\t * @example \"ch_1234567890\"\n\t\t\t */\n\t\t\tid: z.string().optional(),\n\t\t\t/**\n\t\t\t * ID of the plan returned from the `chargeUser` API call.\n\t\t\t * @example \"plan_1234567890\"\n\t\t\t */\n\t\t\tplanId: z.string(),\n\t\t}),\n\t\tresponse: withError(\n\t\t\tz.object({\n\t\t\t\tsessionId: z.string(),\n\t\t\t\t/**\n\t\t\t\t * The receipt ID can be used to verify the purchase.\n\t\t\t\t *\n\t\t\t\t * NOTE: When receiving payments you should always listen to webhooks as a fallback\n\t\t\t\t * to process the payment. Do not solely rely on the client to process payments. The receipt ID\n\t\t\t\t * can be used to deduplicate payment events.\n\t\t\t\t */\n\t\t\t\treceiptId: z.string(),\n\t\t\t}),\n\t\t\tz.string(),\n\t\t),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"closeApp\"),\n\t\trequest: z.null(),\n\t\tresponse: z.literal(\"ok\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"openHelpChat\"),\n\t\trequest: z.null(),\n\t\tresponse: z.literal(\"ok\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"getColorTheme\"),\n\t\trequest: z.void(),\n\t\tresponse: frostedV2Theme,\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"earliestUnreadNotification\"),\n\t\trequest: z.object({\n\t\t\texperienceId: z.string(),\n\t\t}),\n\t\tresponse: z\n\t\t\t.object({\n\t\t\t\texternalId: z.string(),\n\t\t\t})\n\t\t\t.nullable(),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"markExperienceRead\"),\n\t\trequest: z.object({\n\t\t\texperienceId: z.string(),\n\t\t\tnotificationExternalId: z.string().optional(),\n\t\t}),\n\t\tresponse: z.literal(\"ok\"),\n\t}),\n\tz.object({\n\t\tevent: z.literal(\"performHaptic\"),\n\t\trequest: z.object({\n\t\t\ttype: z.enum([\"selection\", \"impact\", \"notification\"]),\n\t\t\tstyle: z.enum([\"light\", \"medium\", \"heavy\"]),\n\t\t}),\n\t\tresponse: z.literal(\"ok\"),\n\t}),\n]);\n\nexport type WhopServerSchema = z.TypeOf<typeof whopServerSchema>;\n"],"mappings":"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","names":["z","z","timeoutId","data","cb","z","z"]}