openpencil/packages/core/src/canvaskit.ts
2026-05-21 14:54:17 +03:00

31 lines
860 B
TypeScript

/// <reference types="vite/client" />
import CanvasKitInit, { type CanvasKit } from 'canvaskit-wasm'
import { IS_BROWSER } from './constants'
let instance: CanvasKit | null = null
export interface CanvasKitOptions {
locateFile?: (file: string) => string
}
export async function getCanvasKit(options?: CanvasKitOptions): Promise<CanvasKit> {
if (instance) return instance
const defaultLocate = (file: string) => {
if (!IS_BROWSER) {
const ckPath = import.meta.resolve('canvaskit-wasm')
return decodeURIComponent(new URL(file, ckPath).pathname)
}
const base = 'env' in import.meta ? import.meta.env.BASE_URL : '/'
const prefix = base === '/' ? '' : base.replace(/\/$/, '')
return `${prefix}/${file}`
}
instance = await CanvasKitInit({
locateFile: options?.locateFile ?? defaultLocate
})
return instance
}