import type { CreatePageInput, CreatePageResult, GetPageResult, GetUserResult, ListUsersInput, ListUsersResult, NotionPageId, NotionUserId, UpdatePageInput, UpdatePageResult, UseDataSourceOptions, } from "../types.js" import { type CustomBlockHostState, type DataSourceQueryView, getDataSourceQueryView as getDataSourceQueryViewWithBridge, } from "./hostState.js" import type { ManifestLoadResult } from "./loadManifest.js" import type { CustomBlockManifest } from "./manifest.js" import type { InitMessage } from "./messages/init.js" import { type MessageLogEntry, SandboxBridge } from "./SandboxBridge.js" export type { MessageLogEntry } const bridge = new SandboxBridge() export const customBlockHost = { sendReady: (manifestResult: ManifestLoadResult) => { bridge.sendReady(manifestResult) }, awaitInit: (signal?: AbortSignal): Promise => { return bridge.awaitInit(signal) }, subscribe: (listener: () => void) => { return bridge.subscribe(listener) }, getState: (): CustomBlockHostState => { return bridge.getHostState() }, getManifest: (): CustomBlockManifest | null => { return bridge.getManifest() }, /** * Apply an `init` payload directly, bypassing the postMessage handshake for * standalone preview state. */ setMockState: (message: InitMessage) => { bridge.setMockState(message) }, postResize: (height: number) => { bridge.postResize(height) }, } export const customBlockDataSources = { query: (key: string, options?: UseDataSourceOptions) => { bridge.queryDataSource(key, options) }, getView: ( hostState: CustomBlockHostState, key: string, ): DataSourceQueryView => { return getDataSourceQueryViewWithBridge(hostState, key, args => bridge.updateDataSourcePage(args), ) }, } export const messageLog = { getSnapshot: (): readonly MessageLogEntry[] => { return bridge.getMessageLog() }, subscribe: (listener: () => void) => { return bridge.subscribeToMessageLog(listener) }, } /** * Page-related SDK APIs exposed under `sdk.pages.*`. */ export const pages = { /** * Creates a new Notion page. */ create: (input: CreatePageInput): Promise => { return bridge.createPage(input) }, /** * Fetches a page by id. */ get: (pageId: NotionPageId): Promise => { return bridge.getPage(pageId) }, /** * Updates an existing page. */ update: (input: UpdatePageInput): Promise => { return bridge.updatePage(input) }, /** * Soft-delete a page by archiving it. */ delete: (pageId: NotionPageId): Promise => { return bridge.updatePage({ pageId, archived: true }) }, } /** * User-related SDK APIs exposed under `sdk.users.*`. */ export const users = { /** * Lists users visible in the current custom block workspace. */ list: (input?: ListUsersInput): Promise => { return bridge.listUsers(input) }, /** * Fetches a user by id. */ get: (userId: NotionUserId): Promise => { return bridge.getUser(userId) }, }