@whop/iframe
Version:
Powers communication between Whop and your embedded app
439 lines (435 loc) • 14.3 kB
TypeScript
import { ZodDiscriminatedUnion, ZodObject, ZodLiteral, ZodTypeAny, ZodRawShape, z } from 'zod';
type ValidZodEventSchema = ZodDiscriminatedUnion<"event", ZodObject<{
event: ZodLiteral<string>;
request: ZodTypeAny;
response: ZodTypeAny;
} & ZodRawShape>[]>;
type MaybePromise<T> = Promise<T> | T;
type FullServerImplementation<Schema extends ValidZodEventSchema> = {
[K in NonNullable<z.infer<Schema>["event"]>]: (request: Extract<z.infer<Schema>, {
event: K;
}>["request"]) => MaybePromise<Extract<z.infer<Schema>, {
event: K;
}>["response"]>;
};
type ClientSDK<ClientSchema extends ValidZodEventSchema, Complete extends boolean> = {
[K in NonNullable<z.infer<ClientSchema>["event"]>]: (req: Extract<z.infer<ClientSchema>, {
event: K;
}>["request"]) => Promise<Complete extends true ? Extract<z.infer<ClientSchema>, {
event: K;
}>["response"] : Extract<z.infer<ClientSchema>, {
event: K;
}>["response"] | undefined>;
};
type ServerImplementation<Schema extends ValidZodEventSchema, ForceCompleteness extends boolean = false> = ForceCompleteness extends true ? FullServerImplementation<Schema> : Partial<FullServerImplementation<Schema>>;
type FullServerMiddlewareImplementation<Schema extends ValidZodEventSchema, ForceCompleteness extends boolean = false> = {
[K in NonNullable<z.infer<Schema>["event"]>]: (request: Extract<z.infer<Schema>, {
event: K;
}>["request"], next: ForceCompleteness extends true ? (request: Extract<z.infer<Schema>, {
event: K;
}>["request"]) => MaybePromise<Extract<z.infer<Schema>, {
event: K;
}>["response"]> : ((request: Extract<z.infer<Schema>, {
event: K;
}>["request"]) => MaybePromise<Extract<z.infer<Schema>, {
event: K;
}>["response"]>) | undefined) => MaybePromise<ForceCompleteness extends true ? Extract<z.infer<Schema>, {
event: K;
}>["response"] : Extract<z.infer<Schema>, {
event: K;
}>["response"] | undefined>;
};
type ServerMiddleware<Schema extends ValidZodEventSchema, ForceCompleteness extends boolean = false> = Partial<FullServerMiddlewareImplementation<Schema, ForceCompleteness>>;
type Transport<ServerSchema extends ValidZodEventSchema | undefined> = {
send: (event: string, data: unknown, params: {
localAppId: string;
remoteAppId: string;
}) => unknown;
recv: (handler: (event: string, data: unknown) => Promise<(ServerSchema extends ValidZodEventSchema ? z.infer<ServerSchema>["response"] : undefined) | undefined>, params: {
localAppId: string;
remoteAppId: string;
}) => void | (() => void);
cleanup?: () => void;
};
declare function createSDK<ClientSchema extends ValidZodEventSchema | undefined, ServerSchema extends ValidZodEventSchema | undefined, ForceCompleteness extends boolean = false, ServerComplete extends boolean = false>({ clientSchema, serverSchema, serverComplete, transport, timeout, timeouts, localAppId, remoteAppId, serverImplementation, serverMiddleware, }: {
clientSchema: ClientSchema;
serverSchema: ServerSchema;
forceCompleteness?: ForceCompleteness;
serverComplete?: ServerComplete;
localAppId: string;
remoteAppId: string;
serverMiddleware?: ServerSchema extends ValidZodEventSchema ? ServerMiddleware<ServerSchema, ForceCompleteness>[] : undefined;
serverImplementation: ServerSchema extends ValidZodEventSchema ? ServerImplementation<ServerSchema, ForceCompleteness> : undefined;
transport: Transport<ServerSchema>;
timeout?: number;
timeouts?: ClientSchema extends ValidZodEventSchema ? {
[K in NonNullable<z.infer<ClientSchema>["event"]>]?: number;
} : never;
}): (ClientSchema extends ValidZodEventSchema ? ClientSDK<ClientSchema, ServerComplete> : object) & {
_cleanupTransport: () => void;
};
declare const whopServerSchema: z.ZodDiscriminatedUnion<"event", [z.ZodObject<{
event: z.ZodLiteral<"ping">;
request: z.ZodLiteral<"ping">;
response: z.ZodLiteral<"pong">;
}, "strip", z.ZodTypeAny, {
event: "ping";
request: "ping";
response: "pong";
}, {
event: "ping";
request: "ping";
response: "pong";
}>, z.ZodObject<{
event: z.ZodLiteral<"getTopLevelUrlData">;
request: z.ZodOptional<z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>>;
response: z.ZodObject<{
companyRoute: z.ZodString;
experienceRoute: z.ZodString;
experienceId: z.ZodString;
viewType: z.ZodEnum<["app", "admin", "analytics", "preview"]>;
baseHref: z.ZodString;
fullHref: z.ZodString;
}, "strip", z.ZodTypeAny, {
companyRoute: string;
experienceRoute: string;
experienceId: string;
viewType: "app" | "admin" | "analytics" | "preview";
baseHref: string;
fullHref: string;
}, {
companyRoute: string;
experienceRoute: string;
experienceId: string;
viewType: "app" | "admin" | "analytics" | "preview";
baseHref: string;
fullHref: string;
}>;
}, "strip", z.ZodTypeAny, {
event: "getTopLevelUrlData";
response: {
companyRoute: string;
experienceRoute: string;
experienceId: string;
viewType: "app" | "admin" | "analytics" | "preview";
baseHref: string;
fullHref: string;
};
request?: {} | undefined;
}, {
event: "getTopLevelUrlData";
response: {
companyRoute: string;
experienceRoute: string;
experienceId: string;
viewType: "app" | "admin" | "analytics" | "preview";
baseHref: string;
fullHref: string;
};
request?: {} | undefined;
}>, z.ZodObject<{
event: z.ZodLiteral<"openExternalUrl">;
request: z.ZodObject<{
newTab: z.ZodOptional<z.ZodBoolean>;
url: z.ZodString;
}, "strip", z.ZodTypeAny, {
url: string;
newTab?: boolean | undefined;
}, {
url: string;
newTab?: boolean | undefined;
}>;
response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
event: "openExternalUrl";
request: {
url: string;
newTab?: boolean | undefined;
};
response: "ok";
}, {
event: "openExternalUrl";
request: {
url: string;
newTab?: boolean | undefined;
};
response: "ok";
}>, z.ZodObject<{
event: z.ZodLiteral<"onHrefChange">;
request: z.ZodObject<{
href: z.ZodString;
}, "strip", z.ZodTypeAny, {
href: string;
}, {
href: string;
}>;
response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
event: "onHrefChange";
request: {
href: string;
};
response: "ok";
}, {
event: "onHrefChange";
request: {
href: string;
};
response: "ok";
}>, z.ZodObject<{
event: z.ZodLiteral<"inAppPurchase">;
request: z.ZodObject<{
/**
* ID returned from the `chargeUser` API call.
* @example "ch_1234567890"
*/
id: z.ZodOptional<z.ZodString>;
/**
* ID of the plan returned from the `chargeUser` API call.
* @example "plan_1234567890"
*/
planId: z.ZodString;
}, "strip", z.ZodTypeAny, {
planId: string;
id?: string | undefined;
}, {
planId: string;
id?: string | undefined;
}>;
response: z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
status: z.ZodLiteral<"ok">;
data: z.ZodObject<{
sessionId: z.ZodString;
/**
* The receipt ID can be used to verify the purchase.
*
* NOTE: When receiving payments you should always listen to webhooks as a fallback
* to process the payment. Do not solely rely on the client to process payments. The receipt ID
* can be used to deduplicate payment events.
*/
receiptId: z.ZodString;
}, "strip", z.ZodTypeAny, {
sessionId: string;
receiptId: string;
}, {
sessionId: string;
receiptId: string;
}>;
}, "strip", z.ZodTypeAny, {
status: "ok";
data: {
sessionId: string;
receiptId: string;
};
}, {
status: "ok";
data: {
sessionId: string;
receiptId: string;
};
}>, z.ZodObject<{
status: z.ZodLiteral<"error">;
error: z.ZodString;
}, "strip", z.ZodTypeAny, {
status: "error";
error: string;
}, {
status: "error";
error: string;
}>]>;
}, "strip", z.ZodTypeAny, {
event: "inAppPurchase";
request: {
planId: string;
id?: string | undefined;
};
response: {
status: "ok";
data: {
sessionId: string;
receiptId: string;
};
} | {
status: "error";
error: string;
};
}, {
event: "inAppPurchase";
request: {
planId: string;
id?: string | undefined;
};
response: {
status: "ok";
data: {
sessionId: string;
receiptId: string;
};
} | {
status: "error";
error: string;
};
}>, z.ZodObject<{
event: z.ZodLiteral<"closeApp">;
request: z.ZodNull;
response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
event: "closeApp";
request: null;
response: "ok";
}, {
event: "closeApp";
request: null;
response: "ok";
}>, z.ZodObject<{
event: z.ZodLiteral<"openHelpChat">;
request: z.ZodNull;
response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
event: "openHelpChat";
request: null;
response: "ok";
}, {
event: "openHelpChat";
request: null;
response: "ok";
}>, z.ZodObject<{
event: z.ZodLiteral<"getColorTheme">;
request: z.ZodVoid;
response: z.ZodObject<{
appearance: z.ZodOptional<z.ZodEnum<["light", "dark"]>>;
accentColor: z.ZodOptional<z.ZodString>;
dangerColor: z.ZodOptional<z.ZodString>;
grayColor: z.ZodOptional<z.ZodString>;
infoColor: z.ZodOptional<z.ZodString>;
successColor: z.ZodOptional<z.ZodString>;
warningColor: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
appearance?: "light" | "dark" | undefined;
accentColor?: string | undefined;
dangerColor?: string | undefined;
grayColor?: string | undefined;
infoColor?: string | undefined;
successColor?: string | undefined;
warningColor?: string | undefined;
}, {
appearance?: "light" | "dark" | undefined;
accentColor?: string | undefined;
dangerColor?: string | undefined;
grayColor?: string | undefined;
infoColor?: string | undefined;
successColor?: string | undefined;
warningColor?: string | undefined;
}>;
}, "strip", z.ZodTypeAny, {
event: "getColorTheme";
response: {
appearance?: "light" | "dark" | undefined;
accentColor?: string | undefined;
dangerColor?: string | undefined;
grayColor?: string | undefined;
infoColor?: string | undefined;
successColor?: string | undefined;
warningColor?: string | undefined;
};
request?: void | undefined;
}, {
event: "getColorTheme";
response: {
appearance?: "light" | "dark" | undefined;
accentColor?: string | undefined;
dangerColor?: string | undefined;
grayColor?: string | undefined;
infoColor?: string | undefined;
successColor?: string | undefined;
warningColor?: string | undefined;
};
request?: void | undefined;
}>, z.ZodObject<{
event: z.ZodLiteral<"earliestUnreadNotification">;
request: z.ZodObject<{
experienceId: z.ZodString;
}, "strip", z.ZodTypeAny, {
experienceId: string;
}, {
experienceId: string;
}>;
response: z.ZodNullable<z.ZodObject<{
externalId: z.ZodString;
}, "strip", z.ZodTypeAny, {
externalId: string;
}, {
externalId: string;
}>>;
}, "strip", z.ZodTypeAny, {
event: "earliestUnreadNotification";
request: {
experienceId: string;
};
response: {
externalId: string;
} | null;
}, {
event: "earliestUnreadNotification";
request: {
experienceId: string;
};
response: {
externalId: string;
} | null;
}>, z.ZodObject<{
event: z.ZodLiteral<"markExperienceRead">;
request: z.ZodObject<{
experienceId: z.ZodString;
notificationExternalId: z.ZodOptional<z.ZodString>;
}, "strip", z.ZodTypeAny, {
experienceId: string;
notificationExternalId?: string | undefined;
}, {
experienceId: string;
notificationExternalId?: string | undefined;
}>;
response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
event: "markExperienceRead";
request: {
experienceId: string;
notificationExternalId?: string | undefined;
};
response: "ok";
}, {
event: "markExperienceRead";
request: {
experienceId: string;
notificationExternalId?: string | undefined;
};
response: "ok";
}>, z.ZodObject<{
event: z.ZodLiteral<"performHaptic">;
request: z.ZodObject<{
type: z.ZodEnum<["selection", "impact", "notification"]>;
style: z.ZodEnum<["light", "medium", "heavy"]>;
}, "strip", z.ZodTypeAny, {
type: "selection" | "impact" | "notification";
style: "light" | "medium" | "heavy";
}, {
type: "selection" | "impact" | "notification";
style: "light" | "medium" | "heavy";
}>;
response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
event: "performHaptic";
request: {
type: "selection" | "impact" | "notification";
style: "light" | "medium" | "heavy";
};
response: "ok";
}, {
event: "performHaptic";
request: {
type: "selection" | "impact" | "notification";
style: "light" | "medium" | "heavy";
};
response: "ok";
}>]>;
export { type ClientSDK as C, type ServerImplementation as S, type Transport as T, type ValidZodEventSchema as V, createSDK as c, whopServerSchema as w };