@codatum/embed 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/utils.ts","../src/Embed.ts","../src/ParamMapper.ts"],"sourcesContent":["export const SDK_VERSION = __CODATUM_EMBED_JS_VERSION__;\n\n/** Parameter shape used in postMessage */\nexport type EncodedParam = {\n param_id: string;\n param_value: string;\n is_hidden?: boolean;\n};\n\nexport const SqlDisplayValues = [\"SHOW\", \"RESULT_ONLY\", \"HIDE\"] as const;\n\nexport type DisplayOptions = {\n sqlDisplay?: (typeof SqlDisplayValues)[number];\n hideParamsForm?: boolean;\n expandParamsFormByDefault?: boolean;\n};\n\n/** Return type of tokenProvider. params are sent to the embed with SET_TOKEN. */\nexport type TokenProviderResult = {\n token: string;\n params?: EncodedParam[];\n};\n\nexport const ThemeValues = [\"LIGHT\", \"DARK\", \"SYSTEM\"] as const;\n\nexport type IframeOptions = {\n theme?: (typeof ThemeValues)[number];\n locale?: string;\n className?: string;\n style?: Partial<CSSStyleDeclaration>;\n};\n\nexport type TokenOptions = {\n refreshBuffer?: number; // seconds\n retryCount?: number; // if 0, no retry\n initTimeout?: number; // seconds; if 0, no timeout\n onRefreshError?: (error: EmbedError) => void;\n};\n\nexport const TokenProviderTriggers = {\n INIT: \"INIT\",\n RELOAD: \"RELOAD\",\n REFRESH: \"REFRESH\",\n} as const;\n\nexport type TokenProviderContext = {\n trigger: (typeof TokenProviderTriggers)[keyof typeof TokenProviderTriggers];\n markNonRetryable: () => void;\n};\n\nexport type EmbedOptions = {\n container: HTMLElement | string;\n embedUrl: string;\n tokenProvider: (context: TokenProviderContext) => Promise<TokenProviderResult>;\n iframeOptions?: IframeOptions;\n tokenOptions?: TokenOptions;\n displayOptions?: DisplayOptions;\n};\n\nexport const EmbedMessageTypes = {\n READY_FOR_TOKEN: \"READY_FOR_TOKEN\",\n PARAM_CHANGED: \"PARAM_CHANGED\",\n EXECUTE_SQLS_TRIGGERED: \"EXECUTE_SQLS_TRIGGERED\",\n} as const;\n\nexport type ReadyForTokenMessage = {\n type: typeof EmbedMessageTypes.READY_FOR_TOKEN;\n};\nexport type ParamChangedMessage = {\n type: typeof EmbedMessageTypes.PARAM_CHANGED;\n params: EncodedParam[];\n};\nexport type ExecuteSqlsTriggeredMessage = {\n type: typeof EmbedMessageTypes.EXECUTE_SQLS_TRIGGERED;\n params: EncodedParam[];\n};\n\nexport type EmbedMessage = ReadyForTokenMessage | ParamChangedMessage | ExecuteSqlsTriggeredMessage;\n\nexport type EmbedEventMap = {\n paramChanged: (payload: ParamChangedMessage) => void;\n executeSqlsTriggered: (payload: ExecuteSqlsTriggeredMessage) => void;\n};\n\nexport const EmbedErrorCodes = {\n INVALID_OPTIONS: \"INVALID_OPTIONS\",\n CONTAINER_NOT_FOUND: \"CONTAINER_NOT_FOUND\",\n INIT_TIMEOUT: \"INIT_TIMEOUT\",\n TOKEN_PROVIDER_FAILED: \"TOKEN_PROVIDER_FAILED\",\n MISSING_REQUIRED_PARAM: \"MISSING_REQUIRED_PARAM\",\n INVALID_PARAM_VALUE: \"INVALID_PARAM_VALUE\",\n UNEXPECTED_ERROR: \"UNEXPECTED_ERROR\",\n} as const;\n\nexport type EmbedErrorCode = (typeof EmbedErrorCodes)[keyof typeof EmbedErrorCodes];\n\nexport class EmbedError extends Error {\n code: EmbedErrorCode;\n cause?: unknown;\n constructor(code: EmbedErrorCode, message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"EmbedError\";\n this.code = code;\n if (options?.cause !== undefined) {\n this.cause = options.cause;\n }\n }\n}\n\nexport type ParamMapping = Record<string, string>;\n\n/** Special value for resetting to default */\nexport const RESET_TO_DEFAULT = \"_RESET_TO_DEFAULT_\" as const;\n\nexport type ParamDatatype = \"STRING\" | \"NUMBER\" | \"BOOLEAN\" | \"DATE\" | \"STRING[]\" | \"[DATE, DATE]\";\n\nexport type ParamMeta = { hidden?: boolean; required?: boolean; datatype?: ParamDatatype };\n\nexport type DatatypeToTs<D extends ParamDatatype> = D extends \"STRING\"\n ? string | typeof RESET_TO_DEFAULT\n : D extends \"NUMBER\"\n ? number | typeof RESET_TO_DEFAULT\n : D extends \"BOOLEAN\"\n ? boolean | typeof RESET_TO_DEFAULT\n : D extends \"DATE\"\n ? string | typeof RESET_TO_DEFAULT\n : D extends \"STRING[]\"\n ? string[] | typeof RESET_TO_DEFAULT\n : D extends \"[DATE, DATE]\"\n ? [string, string] | typeof RESET_TO_DEFAULT\n : never;\n\nexport type ParamValueType<Meta extends ParamMeta> = Meta extends { datatype: infer D }\n ? D extends ParamDatatype\n ? DatatypeToTs<D>\n : unknown\n : unknown;\n\ntype ParamMetaMap<T extends ParamMapping> = Partial<Record<keyof T & string, ParamMeta>>;\n\ntype ResolvedMeta<T extends ParamMapping, M extends ParamMetaMap<T>> = M &\n Record<keyof T & string, ParamMeta>;\n\nexport type DecodedParams<\n T extends ParamMapping,\n M extends ParamMetaMap<T> = ParamMetaMap<ParamMapping>,\n> = {\n [K in keyof T & keyof ResolvedMeta<T, M> as ResolvedMeta<T, M>[K] extends { required: true }\n ? K\n : never]: ParamValueType<ResolvedMeta<T, M>[K]>;\n} & {\n [K in keyof T & keyof ResolvedMeta<T, M> as ResolvedMeta<T, M>[K] extends { required: true }\n ? never\n : K]?: ParamValueType<ResolvedMeta<T, M>[K]>;\n};\n\nexport type PickedDecodedParams<\n T extends ParamMapping,\n M extends ParamMetaMap<T>,\n K extends keyof T & string,\n> = {\n [P in K & keyof ResolvedMeta<T, M> as ResolvedMeta<T, M>[P] extends { required: true }\n ? P\n : never]: ParamValueType<ResolvedMeta<T, M>[P]>;\n} & {\n [P in K & keyof ResolvedMeta<T, M> as ResolvedMeta<T, M>[P] extends { required: true }\n ? never\n : P]?: ParamValueType<ResolvedMeta<T, M>[P]>;\n};\n\n/** Derives DecodedParams from meta only */\nexport type DefineDecodedParams<M extends Record<string, ParamMeta>> = DecodedParams<\n { [K in keyof M]: string },\n M\n>;\n\nexport type ParamMapperEncodeOptions<K extends string> = {\n /** Only encode the specified keys. */\n only?: K[];\n /** When true, skips required and datatype validation. */\n noValidate?: boolean;\n};\n\nexport type ParamMapperDecodeOptions<K extends string> = {\n /** Only decode the specified keys. */\n only?: K[];\n /** When true, skips required and datatype validation. */\n noValidate?: boolean;\n};\n\nexport interface ParamMapper<\n T extends ParamMapping,\n M extends ParamMetaMap<T> = ParamMetaMap<ParamMapping>,\n> {\n encode<K extends keyof T & string = keyof T & string>(\n values: PickedDecodedParams<T, M, K>,\n options?: ParamMapperEncodeOptions<K>,\n ): EncodedParam[];\n\n decode<K extends keyof T & string = keyof T & string>(\n params: EncodedParam[],\n options?: ParamMapperDecodeOptions<K>,\n ): PickedDecodedParams<T, M, K>;\n}\n\nexport type DefineParamMapper<M extends Record<string, ParamMeta>> = ParamMapper<\n { [K in keyof M]: string },\n M\n>;\n\nexport const EmbedStatuses = {\n CREATED: \"CREATED\",\n INITIALIZING: \"INITIALIZING\",\n READY: \"READY\",\n DESTROYED: \"DESTROYED\",\n} as const;\n\nexport type EmbedStatus = (typeof EmbedStatuses)[keyof typeof EmbedStatuses];\n\nexport interface EmbedInstance {\n init(): Promise<void>;\n reload(): Promise<void>;\n on<K extends keyof EmbedEventMap>(event: K, handler: EmbedEventMap[K]): void;\n off<K extends keyof EmbedEventMap>(event: K, handler: EmbedEventMap[K]): void;\n destroy(): void;\n readonly iframe: HTMLIFrameElement | null;\n readonly status: EmbedStatus;\n}\n","import type { EmbedOptions, IframeOptions } from \"./types\";\nimport { EmbedError, EmbedErrorCodes, SqlDisplayValues, ThemeValues } from \"./types\";\n\nexport const deepClone = <T>(source: T): T => {\n if (source === null || source === undefined || typeof source !== \"object\") return source;\n if (source instanceof Date) return new Date(source.getTime()) as unknown as T;\n if (typeof Node !== \"undefined\" && source instanceof Node) return source;\n if (Array.isArray(source)) return source.map(deepClone) as unknown as T;\n const result = {} as T;\n for (const key of Object.keys(source) as (keyof T)[]) {\n result[key] = deepClone(source[key]);\n }\n return result;\n};\n\nconst EMBED_URL_REGEX =\n /^https:\\/\\/app\\.codatum\\.com\\/protected\\/workspace\\/[a-fA-F0-9]{24}\\/notebook\\/[a-fA-F0-9]{24}(\\?.*)?$/;\n\nexport const isValidEmbedUrl = (url: string): boolean => {\n return EMBED_URL_REGEX.test(url);\n};\n\nexport const buildIframeSrc = (embedUrl: string, iframeOptions?: IframeOptions): string => {\n // iframeOptions overwrite embedUrl query params\n const url = new URL(embedUrl);\n if (iframeOptions?.theme) {\n url.searchParams.set(\"theme\", iframeOptions.theme);\n }\n if (iframeOptions?.locale) {\n url.searchParams.set(\"locale\", iframeOptions.locale);\n }\n return url.toString();\n};\n\nconst BASE_IFRAME_CLASS = \"codatum-embed-iframe\";\n\nexport const getIframeClassName = (iframeOptions?: IframeOptions): string => {\n return BASE_IFRAME_CLASS + (iframeOptions?.className ? ` ${iframeOptions.className}` : \"\");\n};\n\nexport const getTokenTtlMs = (token: string): number | null => {\n try {\n const base64 = token.split(\".\")[1].replace(/-/g, \"+\").replace(/_/g, \"/\");\n const payload = JSON.parse(atob(base64));\n return payload.exp * 1000 - Date.now();\n } catch (error: unknown) {\n // Unexpected behavior\n console.error(`Failed to parse token. Auto-refresh is disabled.`, error);\n return null;\n }\n};\n\n// throw EmbedError if options are invalid\nexport const validateEmbedOptions = (options: EmbedOptions): void => {\n const throwError = (message: string) => {\n throw new EmbedError(EmbedErrorCodes.INVALID_OPTIONS, message);\n };\n if (\n !options.container ||\n (typeof options.container !== \"string\" && !(options.container instanceof HTMLElement))\n ) {\n throwError(\"container must be an HTMLElement or a string selector\");\n }\n if (!options.embedUrl || !isValidEmbedUrl(options.embedUrl)) {\n throwError(\n \"embedUrl must match https://app.codatum.com/protected/workspace/{workspaceId}/notebook/{notebookId}\",\n );\n }\n if (!options.tokenProvider || typeof options.tokenProvider !== \"function\") {\n throwError(\"tokenProvider must be a function\");\n }\n if (options.iframeOptions) {\n if (typeof options.iframeOptions !== \"object\") {\n throwError(\"iframeOptions must be an object\");\n }\n const theme = options.iframeOptions.theme;\n if (theme !== undefined && !ThemeValues.includes(theme)) {\n throwError(`iframeOptions.theme must be one of ${ThemeValues.join(\", \")}`);\n }\n const locale = options.iframeOptions.locale;\n if (locale !== undefined && typeof locale !== \"string\") {\n throwError(\"iframeOptions.locale must be a string\");\n }\n const className = options.iframeOptions.className;\n if (className !== undefined && typeof className !== \"string\") {\n throwError(\"iframeOptions.className must be a string\");\n }\n const style = options.iframeOptions.style;\n if (style !== undefined && typeof style !== \"object\") {\n throwError(\"iframeOptions.style must be a CSSStyleDeclaration\");\n }\n }\n if (options.tokenOptions) {\n if (typeof options.tokenOptions !== \"object\") {\n throwError(\"tokenOptions must be an object\");\n }\n const refreshBuffer = options.tokenOptions.refreshBuffer;\n if (refreshBuffer !== undefined && (typeof refreshBuffer !== \"number\" || refreshBuffer < 0)) {\n throwError(\"tokenOptions.refreshBuffer must be a non-negative number\");\n }\n const retryCount = options.tokenOptions.retryCount;\n if (retryCount !== undefined && (typeof retryCount !== \"number\" || retryCount < 0)) {\n throwError(\"tokenOptions.retryCount must be a non-negative number\");\n }\n const initTimeout = options.tokenOptions.initTimeout;\n if (initTimeout !== undefined && (typeof initTimeout !== \"number\" || initTimeout < 0)) {\n throwError(\"tokenOptions.initTimeout must be a non-negative number\");\n }\n const onRefreshError = options.tokenOptions.onRefreshError;\n if (onRefreshError !== undefined && typeof onRefreshError !== \"function\") {\n throwError(\"tokenOptions.onRefreshError must be a function\");\n }\n }\n if (options.displayOptions) {\n if (typeof options.displayOptions !== \"object\") {\n throwError(\"displayOptions must be an object\");\n }\n const sqlDisplay = options.displayOptions.sqlDisplay;\n if (sqlDisplay !== undefined && !SqlDisplayValues.includes(sqlDisplay)) {\n throwError(`displayOptions.sqlDisplay must be one of ${SqlDisplayValues.join(\", \")}`);\n }\n const hideParamsForm = options.displayOptions.hideParamsForm;\n if (hideParamsForm !== undefined && typeof hideParamsForm !== \"boolean\") {\n throwError(\"displayOptions.hideParamsForm must be a boolean\");\n }\n const expandParamsFormByDefault = options.displayOptions.expandParamsFormByDefault;\n if (expandParamsFormByDefault !== undefined && typeof expandParamsFormByDefault !== \"boolean\") {\n throwError(\"displayOptions.expandParamsFormByDefault must be a boolean\");\n }\n }\n};\n","import type {\n EmbedEventMap,\n EmbedMessage,\n EmbedOptions,\n EmbedStatus,\n EmbedInstance as IEmbedInstance,\n TokenProviderContext,\n TokenProviderResult,\n} from \"./types\";\nimport {\n EmbedError,\n EmbedErrorCodes,\n EmbedStatuses,\n SDK_VERSION,\n type TokenOptions,\n TokenProviderTriggers,\n} from \"./types\";\nimport {\n buildIframeSrc,\n deepClone,\n getIframeClassName,\n getTokenTtlMs,\n validateEmbedOptions,\n} from \"./utils\";\n\nconst DEFAULT_REFRESH_BUFFER = 60;\nconst DEFAULT_RETRY_COUNT = 2;\nconst DEFAULT_INIT_TIMEOUT = 30;\n\nconst SHORT_TTL_THRESHOLD = 10 * 1000;\nconst SHORT_TTL_MAX_CONSECUTIVE = 3;\n\nexport class EmbedInstance implements IEmbedInstance {\n private iframeEl: HTMLIFrameElement | null = null;\n private readonly options: EmbedOptions;\n private readonly expectedOrigin: string;\n private readonly refreshBuffer: number;\n private readonly retryCount: number;\n private readonly onRefreshError?: TokenOptions[\"onRefreshError\"];\n private shortTtlCount = 0;\n\n private _status: EmbedStatus = EmbedStatuses.CREATED;\n private initTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private refreshTimerId: ReturnType<typeof setTimeout> | null = null;\n private reloadInProgress = false;\n private readyForTokenHandled = false;\n private readonly eventHandlers: {\n [K in keyof EmbedEventMap]: EmbedEventMap[K][];\n } = {\n paramChanged: [],\n executeSqlsTriggered: [],\n };\n\n private readonly initPromise: Promise<void>;\n private resolveInit!: () => void;\n private rejectInit!: (err: EmbedError) => void;\n\n private readonly boundHandleMessage = (event: MessageEvent) => this.handleMessage(event);\n\n constructor(options: EmbedOptions) {\n validateEmbedOptions(options);\n this.options = deepClone(options);\n this.expectedOrigin = new URL(this.options.embedUrl).origin;\n\n const tokenOptions = this.options.tokenOptions ?? {};\n this.refreshBuffer = (tokenOptions.refreshBuffer ?? DEFAULT_REFRESH_BUFFER) * 1000;\n this.retryCount = tokenOptions.retryCount ?? DEFAULT_RETRY_COUNT;\n this.onRefreshError = tokenOptions.onRefreshError;\n\n this.initPromise = new Promise<void>((resolve, reject) => {\n this.resolveInit = resolve;\n this.rejectInit = reject;\n });\n\n window.addEventListener(\"message\", this.boundHandleMessage);\n }\n\n /**\n * Creates the iframe, appends it to the container, and starts the token/connection flow.\n * Call this after createEmbed() to complete initialization.\n */\n init(): Promise<void> {\n if (this.isDestroyed) {\n return Promise.resolve();\n }\n if (this._status !== EmbedStatuses.CREATED) {\n return this.initPromise;\n }\n this._status = EmbedStatuses.INITIALIZING;\n\n const container =\n typeof this.options.container === \"string\"\n ? document.querySelector(this.options.container)\n : this.options.container;\n if (!container) {\n this.rejectInit(\n new EmbedError(EmbedErrorCodes.CONTAINER_NOT_FOUND, \"Container element not found\"),\n );\n return this.initPromise;\n }\n\n const iframeOptions = this.options.iframeOptions;\n const iframe = document.createElement(\"iframe\");\n iframe.src = buildIframeSrc(this.options.embedUrl, iframeOptions);\n iframe.className = getIframeClassName(iframeOptions);\n iframe.setAttribute(\"allow\", \"fullscreen; clipboard-write\");\n Object.assign(iframe.style, {\n width: \"100%\",\n height: \"100%\",\n border: \"none\",\n ...iframeOptions?.style,\n });\n\n this.iframeEl = iframe;\n container.appendChild(iframe);\n\n const initTimeoutMs = (this.options.tokenOptions?.initTimeout ?? DEFAULT_INIT_TIMEOUT) * 1000;\n if (initTimeoutMs > 0) {\n this.initTimeoutId = setTimeout(() => {\n this.initTimeoutId = null;\n if (this._status === EmbedStatuses.INITIALIZING) {\n this.destroy();\n this.rejectInit(\n new EmbedError(\n EmbedErrorCodes.INIT_TIMEOUT,\n `Initialization did not complete within ${initTimeoutMs}ms`,\n ),\n );\n }\n }, initTimeoutMs);\n }\n\n return this.initPromise;\n }\n\n get iframe(): HTMLIFrameElement | null {\n return this.isDestroyed ? null : this.iframeEl;\n }\n\n get status(): EmbedStatus {\n return this._status;\n }\n\n private get isDestroyed(): boolean {\n return this._status === EmbedStatuses.DESTROYED;\n }\n\n private clearInitTimeout(): void {\n if (this.initTimeoutId !== null) {\n clearTimeout(this.initTimeoutId);\n this.initTimeoutId = null;\n }\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimerId !== null) {\n clearTimeout(this.refreshTimerId);\n this.refreshTimerId = null;\n }\n }\n\n private sendSetToken(result: TokenProviderResult): void {\n if (!this.iframeEl) return;\n const win = this.iframeEl.contentWindow;\n if (!win || this.isDestroyed) return;\n const payload = {\n displayOptions: this.options.displayOptions,\n ...(result.params != null && result.params.length > 0 ? { params: result.params } : {}),\n };\n try {\n // avoid postMessage serialization error by deep cloning the payload\n const serialized = Object.keys(payload).length\n ? JSON.parse(JSON.stringify(payload))\n : undefined;\n win.postMessage(\n {\n type: \"SET_TOKEN\",\n token: result.token,\n sdkVersion: SDK_VERSION,\n ...serialized,\n },\n this.expectedOrigin,\n );\n } catch (err) {\n // JSON: circular reference, BigInt, function, or other non-JSON-serializable in payload.\n // postMessage: DataCloneError when structured clone fails (non-cloneable value in message).\n throw new EmbedError(\n EmbedErrorCodes.UNEXPECTED_ERROR,\n err instanceof Error ? err.message : String(err),\n { cause: err },\n );\n }\n }\n\n /**\n * Calls tokenProvider with context and retries with exponential backoff up to retryCount on failure,\n * unless context.markNonRetryable() was called. On success, schedules the next token refresh.\n */\n private fetchSessionWithRetry(\n trigger: TokenProviderContext[\"trigger\"],\n attempt = 0,\n delayMs = 1000,\n ): Promise<TokenProviderResult> {\n let nonRetryable = false;\n const context: TokenProviderContext = {\n trigger,\n markNonRetryable: () => {\n nonRetryable = true;\n },\n };\n return this.options\n .tokenProvider(context)\n .then((session) => {\n const ttlMs = getTokenTtlMs(session.token);\n if (ttlMs !== null) {\n this.scheduleRefresh(ttlMs);\n }\n return session;\n })\n .catch((err: unknown) => {\n if (this.isDestroyed) return Promise.reject(err);\n if (nonRetryable || attempt >= this.retryCount) {\n return Promise.reject(err);\n }\n return new Promise<TokenProviderResult>((resolve, reject) => {\n setTimeout(() => {\n this.fetchSessionWithRetry(trigger, attempt + 1, delayMs * 2).then(resolve, reject);\n }, delayMs);\n });\n });\n }\n\n private scheduleRefresh(ttlMs: number): void {\n if (this.isDestroyed) return;\n this.clearRefreshTimer();\n // avoid infinite refreshing loop\n const delayMs = Math.max(0, ttlMs - this.refreshBuffer);\n if (delayMs < SHORT_TTL_THRESHOLD) {\n this.shortTtlCount++;\n if (this.shortTtlCount > SHORT_TTL_MAX_CONSECUTIVE) {\n console.warn(\n `Auto-refresh disabled: token refresh interval has been too short (< ${SHORT_TTL_THRESHOLD}ms) for ${SHORT_TTL_MAX_CONSECUTIVE} consecutive attempts.`,\n );\n return;\n }\n } else {\n this.shortTtlCount = 0;\n }\n this.refreshTimerId = setTimeout(() => {\n this.refreshTimerId = null;\n this.runRefreshWithRetry();\n }, delayMs);\n }\n\n private runRefreshWithRetry(): void {\n if (this.isDestroyed) return;\n this.fetchSessionWithRetry(TokenProviderTriggers.REFRESH)\n .then((result) => {\n if (this.isDestroyed) return;\n this.sendSetToken(result);\n })\n .catch((err) => {\n if (this.isDestroyed) return;\n this.onRefreshError?.(\n new EmbedError(\n EmbedErrorCodes.TOKEN_PROVIDER_FAILED,\n err instanceof Error ? err.message : String(err),\n { cause: err },\n ),\n );\n });\n }\n\n private handleMessage(event: MessageEvent): void {\n if (\n !this.iframeEl ||\n event.source !== this.iframeEl.contentWindow ||\n event.origin !== this.expectedOrigin\n ) {\n return;\n }\n const data = event.data as EmbedMessage;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n if (data.type === \"READY_FOR_TOKEN\") {\n this.onReadyForToken();\n } else if (data.type === \"PARAM_CHANGED\") {\n for (const h of this.eventHandlers.paramChanged) {\n h(deepClone(data));\n }\n } else if (data.type === \"EXECUTE_SQLS_TRIGGERED\") {\n for (const h of this.eventHandlers.executeSqlsTriggered) {\n h(deepClone(data));\n }\n }\n }\n\n private onReadyForToken(): void {\n if (this.readyForTokenHandled || this._status !== EmbedStatuses.INITIALIZING) return;\n this.readyForTokenHandled = true;\n this.fetchSessionWithRetry(TokenProviderTriggers.INIT)\n .then((result) => {\n if (this.isDestroyed) return;\n this._status = EmbedStatuses.READY;\n this.clearInitTimeout();\n this.sendSetToken(result);\n this.resolveInit();\n })\n .catch((err) => {\n if (this.isDestroyed) return;\n this.clearInitTimeout();\n this.rejectInit(\n new EmbedError(\n EmbedErrorCodes.TOKEN_PROVIDER_FAILED,\n err instanceof Error ? err.message : String(err),\n { cause: err },\n ),\n );\n });\n }\n\n reload(): Promise<void> {\n if (this.isDestroyed) return Promise.resolve();\n if (this._status !== EmbedStatuses.READY) return Promise.resolve();\n if (this.reloadInProgress) return Promise.resolve();\n this.reloadInProgress = true;\n return this.fetchSessionWithRetry(TokenProviderTriggers.RELOAD).then(\n (result) => {\n this.reloadInProgress = false;\n if (this.isDestroyed) return;\n this.sendSetToken(result);\n },\n (err) => {\n this.reloadInProgress = false;\n if (this.isDestroyed) return;\n throw new EmbedError(\n EmbedErrorCodes.TOKEN_PROVIDER_FAILED,\n err instanceof Error ? err.message : String(err),\n { cause: err },\n );\n },\n );\n }\n\n on<K extends keyof EmbedEventMap>(event: K, handler: EmbedEventMap[K]): void {\n if (this.isDestroyed) return;\n (this.eventHandlers[event] as EmbedEventMap[K][]).push(handler);\n }\n\n off<K extends keyof EmbedEventMap>(event: K, handler: EmbedEventMap[K]): void {\n const list = this.eventHandlers[event] as EmbedEventMap[K][];\n const i = list.indexOf(handler);\n if (i !== -1) list.splice(i, 1);\n }\n\n destroy(): void {\n if (this.isDestroyed) return;\n this._status = EmbedStatuses.DESTROYED;\n this.clearInitTimeout();\n this.clearRefreshTimer();\n window.removeEventListener(\"message\", this.boundHandleMessage);\n this.iframeEl?.remove();\n this.iframeEl = null;\n }\n}\n\n/**\n * Creates a CodatumEmbed instance without creating the iframe or connecting.\n * Call instance.init() to create the iframe and start the token/connection flow.\n */\nexport function createEmbed(options: EmbedOptions): EmbedInstance {\n return new EmbedInstance(options);\n}\n","import type {\n DecodedParams,\n EncodedParam,\n ParamMapper as IParamMapper,\n ParamDatatype,\n ParamMapperDecodeOptions,\n ParamMapperEncodeOptions,\n ParamMapping,\n ParamMeta,\n PickedDecodedParams,\n} from \"./types\";\nimport { EmbedError, EmbedErrorCodes, RESET_TO_DEFAULT } from \"./types\";\n\n/** YYYY-MM-DD format (ISO 8601 date) */\nconst DATE_FORMAT_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst isValidDateFormat = (s: string): boolean => {\n return DATE_FORMAT_REGEX.test(s);\n};\n\nconst validateDatatype = (value: unknown, datatype: ParamDatatype, key: string): void => {\n if (value === RESET_TO_DEFAULT) return;\n switch (datatype) {\n case \"STRING\":\n if (typeof value !== \"string\") {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a string, got ${typeof value}`,\n );\n }\n return;\n case \"NUMBER\":\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a number, got ${typeof value}`,\n );\n }\n return;\n case \"BOOLEAN\":\n if (typeof value !== \"boolean\") {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a boolean, got ${typeof value}`,\n );\n }\n return;\n case \"DATE\":\n if (typeof value !== \"string\") {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a date string, got ${typeof value}`,\n );\n }\n if (!isValidDateFormat(value)) {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a date in YYYY-MM-DD format, got: ${value}`,\n );\n }\n return;\n case \"STRING[]\":\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a string array`,\n );\n }\n return;\n case \"[DATE, DATE]\":\n if (\n !Array.isArray(value) ||\n value.length !== 2 ||\n typeof value[0] !== \"string\" ||\n typeof value[1] !== \"string\"\n ) {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a [string, string] tuple (date range)`,\n );\n }\n if (!isValidDateFormat(value[0]) || !isValidDateFormat(value[1])) {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Parameter ${key} must be a date range in YYYY-MM-DD format, got: [${value[0]}, ${value[1]}]`,\n );\n }\n return;\n default: {\n const _: never = datatype;\n return;\n }\n }\n};\n\nexport class ParamMapper<\n T extends ParamMapping,\n M extends Partial<Record<keyof T & string, ParamMeta>> = Partial<Record<string, ParamMeta>>,\n> implements IParamMapper<T, M>\n{\n private readonly defs: Record<string, { paramId: string } & ParamMeta>;\n private readonly aliasByParamId: Map<string, keyof T & string>;\n\n constructor(mapping: T, meta?: M) {\n this.defs = {};\n for (const key of Object.keys(mapping) as (keyof T & string)[]) {\n const paramId = mapping[key];\n const m = meta?.[key];\n this.defs[key as string] = { paramId, ...m };\n }\n this.aliasByParamId = new Map();\n for (const [alias, paramId] of Object.entries(mapping)) {\n this.aliasByParamId.set(paramId, alias as keyof T & string);\n }\n }\n\n encode<K extends keyof T & string = keyof T & string>(\n values: PickedDecodedParams<T, M, K>,\n options?: ParamMapperEncodeOptions<K>,\n ): EncodedParam[] {\n const result: EncodedParam[] = [];\n const keys = options?.only ?? (Object.keys(this.defs) as (keyof T & string)[]);\n const valuesByKey = values as unknown as Record<string, unknown>;\n const skipValidation = options?.noValidate === true;\n for (const key of keys) {\n const def = this.defs[key as string];\n if (def == null) continue;\n const raw = valuesByKey[key];\n if (raw == null) {\n if (!skipValidation && def.required) {\n throw new EmbedError(\n EmbedErrorCodes.MISSING_REQUIRED_PARAM,\n `Missing required parameter: ${key}`,\n );\n }\n continue;\n }\n if (!skipValidation && def.datatype) {\n validateDatatype(raw, def.datatype, key as string);\n }\n result.push({\n param_id: def.paramId,\n param_value: raw === RESET_TO_DEFAULT ? RESET_TO_DEFAULT : JSON.stringify(raw),\n is_hidden: def.hidden ? true : undefined,\n });\n }\n return result;\n }\n\n decode<K extends keyof T & string = keyof T & string>(\n params: EncodedParam[],\n options?: ParamMapperDecodeOptions<K>,\n ): PickedDecodedParams<T, M, K> {\n const result: Partial<DecodedParams<T, M>> = {};\n const keys = options?.only ?? (Object.keys(this.defs) as (keyof T & string)[]);\n const skipValidation = options?.noValidate === true;\n for (const key of keys) {\n const def = this.defs[key as string];\n if (def == null) continue;\n const encodedParam = params.find((p) => p.param_id === def.paramId);\n if (encodedParam == null) {\n if (!skipValidation && def.required) {\n throw new EmbedError(\n EmbedErrorCodes.MISSING_REQUIRED_PARAM,\n `Missing required parameter: ${key}`,\n );\n }\n continue;\n }\n let decoded: unknown;\n try {\n decoded = JSON.parse(encodedParam.param_value) as unknown;\n } catch {\n throw new EmbedError(\n EmbedErrorCodes.INVALID_PARAM_VALUE,\n `Invalid parameter value: ${encodedParam.param_value}`,\n );\n }\n if (!skipValidation && def.datatype) {\n validateDatatype(decoded, def.datatype, key as string);\n }\n (result as Record<string, unknown>)[key] = decoded;\n }\n return result as unknown as PickedDecodedParams<T, M, K>;\n }\n}\n\nexport function createParamMapper<\n T extends ParamMapping,\n M extends Partial<Record<keyof T & string, ParamMeta>> = Partial<Record<string, ParamMeta>>,\n>(mapping: T, meta?: M): ParamMapper<T, M> {\n return new ParamMapper(mapping, meta);\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@codatum/embed",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript library for Codatum signed embedding",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup && tsup --config tsup.global.config.ts",
21
+ "dev": "tsup --watch",
22
+ "test": "vitest run --coverage",
23
+ "test:watch": "vitest",
24
+ "lint": "biome lint .",
25
+ "clean": "rm -rf dist"
26
+ },
27
+ "devDependencies": {
28
+ "@vitest/coverage-v8": "catalog:",
29
+ "jsdom": "catalog:",
30
+ "tsup": "catalog:",
31
+ "typescript": "catalog:",
32
+ "vitest": "catalog:"
33
+ },
34
+ "engines": {
35
+ "node": ">=18"
36
+ },
37
+ "license": "Apache-2.0",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/codatum/codatum-embed-js.git",
41
+ "directory": "packages/embed"
42
+ },
43
+ "homepage": "https://github.com/codatum/codatum-embed-js/tree/main/packages/embed#readme",
44
+ "bugs": {
45
+ "url": "https://github.com/codatum/codatum-embed-js/issues"
46
+ },
47
+ "keywords": [
48
+ "codatum",
49
+ "embed",
50
+ "iframe",
51
+ "signed-embed",
52
+ "analytics",
53
+ "notebook"
54
+ ],
55
+ "publishConfig": {
56
+ "access": "public"
57
+ }
58
+ }