@r-delfino/mux-sync-engine
Version:
Mux Sync Engine to sync Mux data based on webhooks to Postgres
1 lines • 46.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/database/postgres.ts","../src/schemas/mux_assets.ts","../src/schemas/mux_live_streams.ts","../src/schemas/mux_uploads.ts","../src/schemas/mux_webhook_events.ts","../src/muxSync.ts","../src/database/migrate.ts"],"names":["pg","sql","Mux","DEFAULT_SCHEMA","path","fs","fileURLToPath","migrate","Client"],"mappings":"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","file":"index.cjs","sourcesContent":["import pg, { QueryResult } from 'pg';\nimport { pg as sql } from 'yesql';\nimport { EntitySchema } from '../schemas/types';\n\ntype PostgresConfig = {\n databaseUrl: string;\n schema: string;\n maxConnections?: number;\n};\n\nexport class PostgresClient {\n pool: pg.Pool;\n\n constructor(private config: PostgresConfig) {\n this.pool = new pg.Pool({\n connectionString: config.databaseUrl,\n max: config.maxConnections || 10,\n keepAlive: true,\n });\n }\n\n async deleteByField(\n table: string,\n field: string,\n value: string\n ): Promise<boolean> {\n const prepared = sql(`\n delete from \"${this.config.schema}\".\"${table}\" \n where \"${field}\" = :value\n returning id;\n `)({ value });\n const { rows } = await this.query(prepared.text, prepared.values);\n return rows.length > 0;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async query(text: string, params?: any[]): Promise<QueryResult> {\n return this.pool.query(text, params);\n }\n\n async upsertMany<\n T extends {\n [Key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n },\n >(\n entries: T[],\n table: string,\n tableSchema: EntitySchema,\n options?: { conflict?: string }\n ): Promise<T[]> {\n if (!entries.length) return [];\n\n // Max 5 in parallel to avoid exhausting connection pool\n const chunkSize = 5;\n const results: pg.QueryResult<T>[] = [];\n\n for (let i = 0; i < entries.length; i += chunkSize) {\n const chunk = entries.slice(i, i + chunkSize);\n\n const queries: Promise<pg.QueryResult<T>>[] = [];\n chunk.forEach((entry) => {\n // Inject the values\n const cleansed = this.cleanseArrayField(entry);\n const upsertSql = this.constructUpsertSql(\n this.config.schema,\n table,\n tableSchema,\n options\n );\n\n const prepared = sql(upsertSql, {\n useNullForMissing: true,\n })(cleansed);\n\n queries.push(this.pool.query(prepared.text, prepared.values));\n });\n\n results.push(...(await Promise.all(queries)));\n }\n\n return results.flatMap((it) => it.rows);\n }\n\n async findMissingEntries(\n idField: string = 'id',\n table: string,\n ids: string[]\n ): Promise<string[]> {\n if (!ids.length) return [];\n\n const prepared = sql(`\n select ${idField} from \"${this.config.schema}\".\"${table}\"\n where ${idField} in (:ids);\n `)({ ids });\n\n const { rows } = await this.query(prepared.text, prepared.values);\n const existingIds = rows.map((it) => it[idField]);\n\n const missingIds = ids.filter((it) => !existingIds.includes(it));\n\n return missingIds;\n }\n\n /**\n * Returns an (yesql formatted) upsert function based on the key/vals of an object.\n * eg,\n * insert into customers (\"id\", \"name\")\n * values (:id, :name)\n * on conflict (id)\n * do update set (\n * \"id\" = :id,\n * \"name\" = :name\n * )\n */\n private constructUpsertSql(\n schema: string,\n table: string,\n tableSchema: EntitySchema,\n options?: {\n conflict?: string;\n }\n ): string {\n const { conflict = 'id' } = options || {};\n const properties = tableSchema.properties;\n\n return `\n insert into \"${schema}\".\"${table}\" (\n ${properties.map((x) => `\"${x}\"`).join(',')}\n )\n values (\n ${properties.map((x) => `:${x}`).join(',')}\n )\n on conflict (\n ${conflict}\n )\n do update set \n ${properties.map((x) => `\"${x}\" = :${x}`).join(',')}\n ;`;\n }\n\n /**\n * For array object field\n * ex: [{\"name\":\"Project name\",\"value\":\"Test Project\"}]\n *\n * we need to stringify it first cos passing array object directly will end up with\n * {\n * invalid input syntax for type json\n * detail: 'Expected \":\", but found \"}\".',\n * where: 'JSON data, line 1: ...\\\\\":\\\\\"Project name\\\\\",\\\\\"value\\\\\":\\\\\"Test Project\\\\\"}\"}',\n * }\n */\n\n private cleanseArrayField(obj: {\n [Key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n }): {\n [Key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n } {\n const cleansed = { ...obj };\n Object.keys(cleansed).map((k) => {\n const data = cleansed[k];\n if (Array.isArray(data)) {\n cleansed[k] = JSON.stringify(data);\n }\n });\n return cleansed;\n }\n}\n","import type { EntitySchema } from './types';\n\nexport const muxAssetsSchema: EntitySchema = {\n properties: [\n 'id',\n 'status',\n 'created_at',\n 'duration_seconds',\n 'max_stored_frame_rate',\n 'aspect_ratio',\n 'playback_ids',\n 'tracks',\n 'errors',\n 'master_access',\n 'normalize_audio',\n 'static_renditions',\n 'test',\n 'passthrough',\n 'live_stream_id',\n 'ingest_type',\n 'source_asset_id',\n 'upload_id',\n 'input_info',\n 'video_quality',\n 'resolution_tier',\n 'non_standard_input_reasons',\n 'progress',\n 'meta',\n 'max_resolution_tier',\n 'is_live',\n 'master',\n 'recording_times',\n ],\n} as const;\n","import type { EntitySchema } from './types';\n\nexport const muxLiveStreamsSchema: EntitySchema = {\n properties: [\n 'id',\n 'status',\n 'created_at',\n 'stream_key',\n 'active_asset_id',\n 'recent_asset_ids',\n 'playback_ids',\n 'new_asset_settings',\n 'passthrough',\n 'audio_only',\n 'embedded_subtitles',\n 'generated_subtitles',\n 'latency_mode',\n 'test',\n 'max_continuous_duration_seconds',\n 'reconnect_window_seconds',\n 'use_slate_for_standard_latency',\n 'reconnect_slate_url',\n 'active_ingest_protocol',\n 'meta',\n 'simulcast_targets',\n 'srt_passphrase',\n ],\n} as const;\n","import type { EntitySchema } from './types';\n\nexport const muxUploadsSchema: EntitySchema = {\n properties: [\n 'id',\n 'status',\n 'timeout_seconds',\n 'asset_id',\n 'cors_origin',\n 'url',\n 'error',\n 'test',\n ],\n} as const;\n","import type { EntitySchema } from './types';\n\nexport const muxWebhookEventsSchema: EntitySchema = {\n properties: [\n 'id',\n 'type',\n 'created_at',\n 'attempts',\n 'environment',\n 'object',\n 'raw_body',\n 'headers',\n ],\n} as const;\n","import { Mux } from '@mux/mux-node';\nimport { PostgresClient } from './database/postgres';\nimport { muxAssetsSchema } from './schemas/mux_assets';\nimport { muxLiveStreamsSchema } from './schemas/mux_live_streams';\nimport { muxUploadsSchema } from './schemas/mux_uploads';\nimport { muxWebhookEventsSchema } from './schemas/mux_webhook_events';\nimport {\n MuxSyncConfig,\n Sync,\n SyncBackfill,\n SyncBackfillParams,\n Logger,\n SimulcastTargetData,\n StaticRenditionData,\n TrackData,\n EntitySchema,\n} from './types';\nimport { HeadersLike } from '@mux/mux-node/core';\n\nconst DEFAULT_SCHEMA = 'mux';\n\nexport class MuxSync {\n mux: Mux;\n postgresClient: PostgresClient;\n private logger: Logger;\n\n constructor(private config: MuxSyncConfig) {\n this.logger = config.logger || console;\n this.mux = new Mux({\n tokenId: config.muxTokenId,\n tokenSecret: config.muxTokenSecret,\n webhookSecret: config.muxWebhookSecret,\n });\n\n this.logger.info('MuxSync initialized');\n\n this.postgresClient = new PostgresClient({\n databaseUrl: config.databaseUrl,\n schema: DEFAULT_SCHEMA,\n maxConnections: config.maxPostgresConnections,\n });\n }\n\n async processWebhook(payload: string, headers: HeadersLike) {\n const event = this.mux.webhooks.unwrap(payload, headers);\n this.logger.info(`Received webhook ${event.id}: ${event.type}`);\n\n // Store the webhook event and payload\n await this.upsertWebhookEvent(event, headers);\n\n const eventType = event.type as string;\n\n try {\n switch (eventType) {\n // Assets\n case 'video.asset.created':\n case 'video.asset.ready':\n case 'video.asset.updated':\n case 'video.asset.errored':\n case 'video.asset.live_stream_completed':\n case 'video.asset.static_renditions.ready':\n case 'video.asset.static_renditions.preparing':\n case 'video.asset.static_renditions.deleted':\n case 'video.asset.static_renditions.errored':\n case 'video.asset.master.ready':\n case 'video.asset.master.preparing':\n case 'video.asset.master.deleted':\n case 'video.asset.warning':\n case 'video.asset.non_standard_input_detected':\n case 'video.asset.master.errored': {\n const asset: Mux.Video.Assets.Asset =\n await this.fetchOrUseWebhookData(\n event.data as Mux.Video.Assets.Asset,\n async (id) => {\n const response = await this.mux.video.assets.retrieve(id);\n return (\n (response as { data?: Mux.Video.Assets.Asset }).data ??\n (response as Mux.Video.Assets.Asset)\n );\n }\n );\n await this.upsertAssets([asset]);\n break;\n }\n\n // Asset deletion\n case 'video.asset.deleted': {\n const assetData = event.data as Mux.Video.Assets.Asset;\n if (assetData.id) {\n await this.deleteAsset(assetData.id);\n } else {\n this.logger.warn(\n 'Asset deletion event received but no asset id found'\n );\n }\n break;\n }\n // Uploads\n case 'video.upload.created':\n case 'video.upload.asset_created':\n case 'video.upload.cancelled':\n case 'video.upload.errored': {\n const upload = await this.fetchOrUseWebhookData(\n event.data as Mux.Video.Uploads.Upload,\n async (id) => {\n const response = await this.mux.video.uploads.retrieve(id);\n return (\n (response as { data?: Mux.Video.Uploads.Upload }).data ??\n (response as Mux.Video.Uploads.Upload)\n );\n }\n );\n await this.upsertUploads([upload]);\n break;\n }\n\n // Tracks\n case 'video.asset.track.created':\n case 'video.asset.track.ready':\n case 'video.asset.track.errored':\n case 'video.asset.track.deleted': {\n const track = event.data as Mux.Video.Assets.Track;\n await this.handleAssetTrackEvent(track);\n break;\n }\n\n // Live streams\n case 'video.live_stream.warning':\n case 'video.live_stream.created':\n case 'video.live_stream.connected':\n case 'video.live_stream.recording':\n case 'video.live_stream.active':\n case 'video.live_stream.disconnected':\n case 'video.live_stream.idle':\n case 'video.live_stream.updated':\n case 'video.live_stream.enabled':\n case 'video.live_stream.disabled': {\n const liveStream = await this.fetchOrUseWebhookData(\n event.data as Mux.Video.LiveStreams.LiveStream,\n async (id) => {\n const response = await this.mux.video.liveStreams.retrieve(id);\n return (\n (response as { data?: Mux.Video.LiveStreams.LiveStream })\n .data ?? (response as Mux.Video.LiveStreams.LiveStream)\n );\n }\n );\n await this.upsertLiveStreams([liveStream]);\n break;\n }\n\n // Live stream deletion\n case 'video.live_stream.deleted': {\n const liveStreamData = event.data as Mux.Video.LiveStreams.LiveStream;\n if (liveStreamData.id) {\n await this.deleteLiveStream(liveStreamData.id);\n } else {\n this.logger.warn(\n 'Live stream deletion event received but no live stream id found'\n );\n }\n break;\n }\n\n // Static rendition\n case 'video.asset.static_rendition.created':\n case 'video.asset.static_rendition.ready':\n case 'video.asset.static_rendition.errored':\n case 'video.asset.static_rendition.skipped':\n case 'video.asset.static_rendition.deleted': {\n const staticRendition = event.data as StaticRenditionData;\n await this.handleAssetStaticRenditionEvent(staticRendition);\n break;\n }\n\n // Simulcast targets\n case 'video.live_stream.simulcast_target.created':\n case 'video.live_stream.simulcast_target.idle':\n case 'video.live_stream.simulcast_target.starting':\n case 'video.live_stream.simulcast_target.broadcasting':\n case 'video.live_stream.simulcast_target.errored':\n case 'video.live_stream.simulcast_target.deleted':\n case 'video.live_stream.simulcast_target.updated': {\n const simulcastTargetData = event.data as SimulcastTargetData;\n await this.handleLiveStreamSimulcastTargetEvent(simulcastTargetData);\n break;\n }\n\n default:\n this.logger.warn('Unhandled webhook event', event.type);\n break;\n }\n this.logger.info(`Successfully processed webhook ${event.type}`);\n } catch (error) {\n this.logger.error(\n error as Error,\n `Error processing webhook ${event.type}`\n );\n throw error;\n }\n }\n\n async syncBackfill(params?: SyncBackfillParams): Promise<SyncBackfill> {\n const { object } = params ?? {};\n let muxAssets, muxLiveStreams, muxUploads;\n\n switch (object) {\n case 'all':\n muxAssets = await this.syncMuxAssets();\n [muxLiveStreams, muxUploads] = await Promise.all([\n this.syncMuxLiveStreams(),\n this.syncMuxUploads(),\n ]);\n break;\n case 'mux_assets':\n muxAssets = await this.syncMuxAssets();\n break;\n case 'mux_live_streams':\n muxLiveStreams = await this.syncMuxLiveStreams();\n break;\n case 'mux_uploads':\n muxUploads = await this.syncMuxUploads();\n break;\n default:\n break;\n }\n\n return {\n muxAssets,\n muxLiveStreams,\n muxUploads,\n };\n }\n\n private async fetchOrUseWebhookData<T extends { id?: string }>(\n entity: T,\n fetchFn: (id: string) => Promise<T>\n ): Promise<T> {\n if (!entity.id) return entity;\n\n if (this.config.revalidateEntityViaMuxApi) {\n return fetchFn(entity.id);\n }\n\n return entity;\n }\n\n private async upsertAssets(\n assets: Mux.Video.Assets.Asset[]\n ): Promise<unknown[]> {\n const transformedAssets = assets.map((asset) => ({\n ...asset,\n duration_seconds: asset.duration,\n created_at: asset.created_at\n ? new Date(Number(asset.created_at) * 1000).toISOString()\n : null,\n }));\n\n return this.postgresClient.upsertMany(\n transformedAssets,\n 'assets',\n muxAssetsSchema,\n { conflict: 'id' }\n );\n }\n\n private async genericSync<T>(\n resourceName: string,\n listFn: (\n params: Record<string, unknown>\n ) => Promise<{ data: T[]; next_cursor?: string }>,\n upsertFn: (items: T[]) => Promise<unknown[]>\n ): Promise<Sync> {\n this.logger.info(`Starting Mux ${resourceName} sync...`);\n\n let nextCursor: string | undefined;\n let totalSynced = 0;\n let pageCount = 0;\n\n do {\n pageCount++;\n this.logger.info(`Fetching page ${pageCount} of Mux ${resourceName}...`);\n\n const listParams: Record<string, unknown> = { limit: 100 };\n if (nextCursor) listParams.cursor = nextCursor;\n\n const response = await listFn(listParams);\n const items = response.data;\n\n if (items.length) {\n this.logger.info(\n `Processing ${items.length} ${resourceName} from page ${pageCount}...`\n );\n await upsertFn(items);\n totalSynced += items.length;\n this.logger.info(\n `✓ Page ${pageCount} completed. Total ${resourceName} synced so far: ${totalSynced}`\n );\n } else {\n this.logger.info(`No ${resourceName} found on page ${pageCount}`);\n }\n\n nextCursor = response.next_cursor;\n } while (nextCursor);\n\n this.logger.info(\n `✅ Mux ${resourceName} sync completed! Total ${resourceName} synced: ${totalSynced}`\n );\n return { synced: totalSynced };\n }\n\n private async syncMuxAssets(assetIds?: string[]): Promise<Sync> {\n if (assetIds?.length) {\n const result: Sync = { synced: 0 };\n const missing = await this.postgresClient.findMissingEntries(\n 'id',\n 'assets',\n assetIds\n );\n if (missing.length) {\n const fetchedAssets: Mux.Video.Assets.Asset[] = [];\n for (const id of missing) {\n try {\n const asset = await this.mux.video.assets.retrieve(id);\n fetchedAssets.push(asset);\n } catch {\n this.logger.warn?.(`Failed fetching asset ${id}`);\n }\n }\n if (fetchedAssets.length) {\n const rows = await this.upsertAssets(fetchedAssets);\n result.synced = rows.length;\n }\n }\n return result;\n }\n\n return this.genericSync<Mux.Video.Assets.Asset>(\n 'assets',\n (params) => this.mux.video.assets.list(params),\n (assets) => this.upsertAssets(assets)\n );\n }\n\n private async upsertEntitiesWithRelatedAssets<\n T,\n R extends Record<string, unknown> = Record<string, unknown>,\n >(\n entities: T[],\n tableName: string,\n schema: EntitySchema,\n config: {\n assetIds?: string[];\n transformEntity: (entity: T) => R;\n }\n ): Promise<unknown[]> {\n if (this.config.backfillRelatedEntities && config.assetIds?.length) {\n await this.syncMuxAssets(config.assetIds);\n }\n\n const transformedEntities = entities.map(config.transformEntity);\n\n return this.postgresClient.upsertMany(\n transformedEntities,\n tableName,\n schema,\n {\n conflict: 'id',\n }\n );\n }\n\n private async upsertLiveStreams(\n liveStreams: Mux.Video.LiveStreams.LiveStream[]\n ): Promise<unknown[]> {\n // Extract asset IDs for backfill\n const assetIds = liveStreams\n .filter((ls) => ls.active_asset_id != null)\n .map((ls) => ls.active_asset_id!);\n\n return this.upsertEntitiesWithRelatedAssets(\n liveStreams,\n 'live_streams',\n muxLiveStreamsSchema,\n {\n assetIds,\n transformEntity: (ls: Mux.Video.LiveStreams.LiveStream) => ({\n ...ls,\n created_at: ls.created_at\n ? new Date(Number(ls.created_at) * 1000).toISOString()\n : null,\n max_continuous_duration_seconds: ls.max_continuous_duration,\n reconnect_window_seconds: ls.reconnect_window,\n }),\n }\n );\n }\n\n private async upsertUploads(\n uploads: Mux.Video.Uploads.Upload[]\n ): Promise<unknown[]> {\n // Extract asset IDs for backfill\n const assetIds = uploads\n .filter((u) => u.asset_id != null)\n .map((u) => u.asset_id!);\n\n return this.upsertEntitiesWithRelatedAssets(\n uploads,\n 'uploads',\n muxUploadsSchema,\n {\n assetIds,\n transformEntity: (u: Mux.Video.Uploads.Upload) => ({\n ...u,\n timeout_seconds: u.timeout,\n }),\n }\n );\n }\n\n private async syncMuxLiveStreams(): Promise<Sync> {\n return this.genericSync<Mux.Video.LiveStreams.LiveStream>(\n 'live streams',\n (params) => this.mux.video.liveStreams.list(params),\n (liveStreams) => this.upsertLiveStreams(liveStreams)\n );\n }\n\n private async syncMuxUploads(): Promise<Sync> {\n return this.genericSync<Mux.Video.Uploads.Upload>(\n 'uploads',\n (params) => this.mux.video.uploads.list(params),\n (uploads) => this.upsertUploads(uploads)\n );\n }\n\n private async handleAssetUpdateEvent(\n assetId: string | undefined,\n eventType: string\n ): Promise<void> {\n if (!assetId) {\n this.logger.warn?.(\n `${eventType} event received but no asset_id found in webhook data`\n );\n return;\n }\n\n try {\n const response = await this.mux.video.assets.retrieve(assetId);\n const asset =\n (response as { data?: Mux.Video.Assets.Asset }).data ??\n (response as Mux.Video.Assets.Asset);\n await this.upsertAssets([asset]);\n } catch (error) {\n this.logger.warn?.(\n `${eventType} event received but asset ${assetId} not found (likely deleted): ${error}`\n );\n return;\n }\n }\n\n private async handleAssetTrackEvent(\n track: Mux.Video.Assets.Track\n ): Promise<void> {\n const assetId = (track as TrackData).asset_id;\n await this.handleAssetUpdateEvent(assetId, 'track');\n }\n\n private async handleLiveStreamUpdateEvent(\n liveStreamId: string | undefined,\n eventType: string\n ): Promise<void> {\n if (!liveStreamId) {\n this.logger.warn?.(\n `${eventType} event received but no live_stream_id found in webhook data`\n );\n return;\n }\n\n try {\n const response = await this.mux.video.liveStreams.retrieve(liveStreamId);\n const liveStream =\n (response as { data?: Mux.Video.LiveStreams.LiveStream }).data ??\n (response as Mux.Video.LiveStreams.LiveStream);\n await this.upsertLiveStreams([liveStream]);\n } catch (error) {\n this.logger.warn?.(\n `${eventType} event received but live stream ${liveStreamId} not found (likely deleted): ${error}`\n );\n return;\n }\n }\n\n private async handleLiveStreamSimulcastTargetEvent(\n simulcastTargetData: SimulcastTargetData\n ): Promise<void> {\n const liveStreamId = simulcastTargetData?.live_stream_id;\n await this.handleLiveStreamUpdateEvent(liveStreamId, 'simulcast_target');\n }\n\n private async handleAssetStaticRenditionEvent(\n staticRendition: StaticRenditionData\n ): Promise<void> {\n const assetId = staticRendition.asset_id;\n await this.handleAssetUpdateEvent(assetId, 'static_rendition');\n }\n\n private async deleteAsset(muxAssetId: string): Promise<boolean> {\n return await this.postgresClient.deleteByField('assets', 'id', muxAssetId);\n }\n\n private async deleteLiveStream(muxLiveStreamId: string): Promise<boolean> {\n return await this.postgresClient.deleteByField(\n 'live_streams',\n 'id',\n muxLiveStreamId\n );\n }\n\n private async upsertWebhookEvent(\n event: Mux.Webhooks.UnwrapWebhookEvent,\n headers: HeadersLike\n ): Promise<void> {\n const transformedEvent = {\n ...event,\n created_at: event.created_at,\n attempts: event.attempts || [],\n environment: event.environment || {},\n object: event.object || {},\n raw_body: event.data,\n headers,\n };\n\n try {\n await this.postgresClient.upsertMany(\n [transformedEvent],\n 'webhook_events',\n muxWebhookEventsSchema,\n { conflict: 'id' }\n );\n\n this.logger.info(`Stored webhook event ${event.id}`);\n } catch (error) {\n this.logger.error(`Failed to store webhook event ${event.id}:`, error);\n throw error;\n }\n }\n}\n","import { Client } from 'pg';\nimport { migrate } from 'pg-node-migrations';\nimport fs from 'node:fs';\nimport type { Logger } from '../types';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst DEFAULT_SCHEMA = 'mux';\n\nfunction getMigrationsPath(): string {\n try {\n const packageJsonPath = require.resolve(\n '@r-delfino/mux-sync-engine/package.json'\n );\n const packageDir = path.dirname(packageJsonPath);\n\n // Check if migrations exist in dist/migrations (compiled package)\n const distMigrationsPath = path.join(packageDir, 'dist', 'migrations');\n if (fs.existsSync(distMigrationsPath)) {\n return distMigrationsPath;\n }\n\n // Check if migrations exist in src/database/migrations (source)\n const srcMigrationsPath = path.join(\n packageDir,\n 'src',\n 'database',\n 'migrations'\n );\n if (fs.existsSync(srcMigrationsPath)) {\n return srcMigrationsPath;\n }\n\n // Fallback: try to use __dirname approach\n let baseDir: string;\n if (typeof import.meta !== 'undefined' && import.meta.url) {\n const __filename = fileURLToPath(import.meta.url);\n baseDir = path.dirname(__filename);\n } else {\n // @ts-ignore - __dirname is available in CommonJS context\n baseDir = __dirname;\n }\n\n // Try migrations relative to current file\n const relativeMigrationsPath = path.resolve(baseDir, 'migrations');\n if (fs.existsSync(relativeMigrationsPath)) {\n return relativeMigrationsPath;\n }\n\n throw new Error('Could not find migrations directory');\n } catch (error) {\n throw new Error(\n `Failed to locate migrations: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\ntype MigrationConfig = {\n databaseUrl: string;\n logger?: Logger;\n};\n\nasync function connectAndMigrate(\n client: Client,\n migrationsDirectory: string,\n logger: Logger,\n logOnError = false\n) {\n if (!fs.existsSync(migrationsDirectory)) {\n logger.info(\n `Migrations directory ${migrationsDirectory} not found, skipping`\n );\n return;\n }\n\n const optionalConfig = {\n schemaName: DEFAULT_SCHEMA,\n tableName: 'migrations',\n };\n\n try {\n await migrate({ client }, migrationsDirectory, optionalConfig);\n } catch (error) {\n if (logOnError && error instanceof Error) {\n logger.error(error, 'Migration error:');\n } else {\n throw error;\n }\n }\n}\n\nexport async function runMigrations(config: MigrationConfig): Promise<void> {\n // Init DB\n const client = new Client({\n connectionString: config.databaseUrl,\n connectionTimeoutMillis: 10_000,\n });\n\n const logger: Logger = config.logger || console;\n\n try {\n // Run migrations\n await client.connect();\n\n // Ensure schema exists, not doing it via migration to not break current migration checksums\n await client.query(`CREATE SCHEMA IF NOT EXISTS ${DEFAULT_SCHEMA};`);\n\n logger.info('Running migrations');\n\n // Find the migrations directory\n const migrationsPath = getMigrationsPath();\n logger.info(`Looking for migrations in: ${migrationsPath}`);\n\n await connectAndMigrate(client, migrationsPath, logger);\n } catch (err) {\n logger.error(err as Error, 'Error running migrations');\n } finally {\n await client.end();\n logger.info('Finished migrations');\n }\n}\n"]}