{"version":3,"file":"worker.cjs","names":[],"sources":["../src/orchestration/worker.ts"],"sourcesContent":["import { rollup } from \"@rollup/browser\";\nimport { VizContent, VizId } from \"@vizhub/viz-types\";\nimport type { RollupBuild, RollupOptions } from \"rollup\";\nimport {\n  svelteCompilerUrl,\n  createVizCache,\n  createSlugCache,\n} from \"../v3\";\nimport { generateRequestId } from \"./generateRequestId\";\nimport { BuildWorkerMessage } from \"./types\";\nimport { build } from \"../build\";\n\n// Flag for debugging\nconst DEBUG = false;\n\nexport const initWorker = () => {\n  DEBUG && console.log(\"[worker] initializing...\");\n  // Inspired by\n  // https://github.com/sveltejs/sites/blob/master/packages/repl/src/lib/workers/bundler/index.js#L44\n  // unpkg doesn't set the correct MIME type for .cjs files\n  // https://github.com/mjackson/unpkg/issues/355\n  const getSvelteCompiler = async () => {\n    const compiler = await fetch(svelteCompilerUrl).then(\n      (r) => r.text(),\n    );\n    (0, eval)(compiler);\n\n    // @ts-ignore\n    return self.svelte.compile;\n  };\n\n  // Tracks pending promises for 'contentResponse' messages\n  const pendingContentResponsePromises = new Map();\n\n  // Tracks pending promises for 'resolveSlugResponse' messages\n  const pendingResolveSlugResponsePromises = new Map();\n\n  // Create a viz cache that's backed by the main thread\n  const vizCache = createVizCache({\n    initialContents: [],\n    handleCacheMiss: async (\n      vizId: VizId,\n    ): Promise<VizContent> => {\n      const message = {\n        type: \"contentRequest\",\n        vizId,\n      };\n\n      if (DEBUG) {\n        console.log(\n          \"[worker] sending content request message to main thread\",\n          message,\n        );\n      }\n      postMessage(message);\n\n      return new Promise((resolve) => {\n        pendingContentResponsePromises.set(vizId, resolve);\n      });\n    },\n  });\n\n  // Create a slug cache that's backed by the main thread\n  const slugCache = createSlugCache({\n    initialMappings: {},\n    handleCacheMiss: async (slug) => {\n      const requestId = generateRequestId();\n      const message = {\n        type: \"resolveSlugRequest\",\n        slugKey: slug,\n        requestId,\n      };\n\n      if (DEBUG) {\n        console.log(\n          \"[worker] sending resolve slug request message to main thread\",\n          message,\n        );\n      }\n      postMessage(message);\n\n      return new Promise((resolve) => {\n        pendingResolveSlugResponsePromises.set(\n          requestId,\n          resolve,\n        );\n      });\n    },\n  });\n\n  // Handle messages from the main thread\n  addEventListener(\"message\", async (event) => {\n    const data: BuildWorkerMessage = event.data;\n\n    DEBUG &&\n      console.log(\n        \"[worker] received message:\",\n        JSON.stringify(data, null, 2).substring(0, 1000),\n      );\n\n    switch (data.type) {\n      case \"buildRequest\": {\n        const { files, enableSourcemap, requestId, vizId } =\n          data;\n\n        try {\n          // Build HTML from the files\n          const buildResult = await build({\n            files,\n            enableSourcemap,\n            rollup: rollup as (\n              options: RollupOptions,\n            ) => Promise<RollupBuild>,\n            getSvelteCompiler,\n            vizCache,\n            vizId,\n            slugCache,\n          });\n          const message: BuildWorkerMessage = {\n            type: \"buildResponse\",\n            buildResult,\n            requestId,\n          };\n          // Send the built HTML back to the main thread\n          postMessage(message);\n        } catch (error) {\n          DEBUG &&\n            console.log(\"[worker] build error:\", error);\n\n          const message: BuildWorkerMessage = {\n            type: \"buildResponse\",\n            error: \"\" + error,\n            requestId,\n          };\n\n          // Send the error back to the main thread\n          postMessage(message);\n        }\n        break;\n      }\n\n      case \"contentResponse\": {\n        // Resolve pending promises for content snapshots\n        const resolver = pendingContentResponsePromises.get(\n          data.vizId,\n        );\n        if (resolver) {\n          resolver(data.content);\n          pendingContentResponsePromises.delete(data.vizId);\n        }\n        break;\n      }\n\n      case \"invalidateVizCacheRequest\": {\n        if (DEBUG) {\n          console.log(\n            \"[worker] received invalidateVizCacheRequest\",\n            data,\n          );\n        }\n        const { changedVizIds } = data;\n\n        // Invalidate the viz cache for the changed vizzes\n        for (const vizId of changedVizIds) {\n          vizCache.invalidate(vizId);\n        }\n\n        postMessage({\n          type: \"invalidateVizCacheResponse\",\n        });\n        break;\n      }\n\n      case \"resolveSlugResponse\": {\n        // Resolve pending promises for slug resolution\n        const resolver =\n          pendingResolveSlugResponsePromises.get(\n            data.requestId,\n          );\n        if (resolver) {\n          resolver(data.vizId);\n          pendingResolveSlugResponsePromises.delete(\n            data.requestId,\n          );\n        }\n        break;\n      }\n    }\n  });\n};\n"],"mappings":"4IAeA,IAAa,MAAmB,CAM9B,IAAM,EAAoB,SAAY,CACpC,IAAM,EAAW,MAAM,MAAM,EAAA,CAAiB,CAAC,CAAC,KAC7C,GAAM,EAAE,KAAK,CAChB,EAIA,OAHC,EAAG,KAAA,CAAM,CAAQ,EAGX,KAAK,OAAO,OACrB,EAGM,EAAiC,IAAI,IAGrC,EAAqC,IAAI,IAGzC,EAAW,EAAA,EAAe,CAC9B,gBAAiB,CAAC,EAClB,gBAAiB,KACf,KAaA,YAAY,CAVV,KAAM,iBACN,OASU,CAAO,EAEZ,IAAI,QAAS,GAAY,CAC9B,EAA+B,IAAI,EAAO,CAAO,CACnD,CAAC,EAEL,CAAC,EAGK,EAAY,EAAA,EAAgB,CAChC,gBAAiB,CAAC,EAClB,gBAAiB,KAAO,IAAS,CAC/B,IAAM,EAAY,EAAA,EAAkB,EAepC,OAFA,YAAY,CAXV,KAAM,qBACN,QAAS,EACT,WASU,CAAO,EAEZ,IAAI,QAAS,GAAY,CAC9B,EAAmC,IACjC,EACA,CACF,CACF,CAAC,CACH,CACF,CAAC,EAGD,iBAAiB,UAAW,KAAO,IAAU,CAC3C,IAAM,EAA2B,EAAM,KAQvC,OAAQ,EAAK,KAAb,CACE,IAAK,eAAgB,CACnB,GAAM,CAAE,QAAO,kBAAiB,YAAW,SACzC,EAEF,GAAI,CAaF,IAAM,EAA8B,CAClC,KAAM,gBACN,YAAA,MAbwB,EAAA,EAAM,CAC9B,QACA,kBACQ,OAAA,EAAA,OAGR,oBACA,WACA,QACA,WACF,CAAC,EAIC,WACF,EAEA,YAAY,CAAO,CACrB,OAAS,EAAO,CAId,IAAM,EAA8B,CAClC,KAAM,gBACN,MAAO,GAAK,EACZ,WACF,EAGA,YAAY,CAAO,CACrB,CACA,KACF,CAEA,IAAK,kBAAmB,CAEtB,IAAM,EAAW,EAA+B,IAC9C,EAAK,KACP,EACI,IACF,EAAS,EAAK,OAAO,EACrB,EAA+B,OAAO,EAAK,KAAK,GAElD,KACF,CAEA,IAAK,4BAA6B,CAOhC,GAAM,CAAE,iBAAkB,EAG1B,IAAK,IAAM,KAAS,EAClB,EAAS,WAAW,CAAK,EAG3B,YAAY,CACV,KAAM,4BACR,CAAC,EACD,KACF,CAEA,IAAK,sBAAuB,CAE1B,IAAM,EACJ,EAAmC,IACjC,EAAK,SACP,EACE,IACF,EAAS,EAAK,KAAK,EACnB,EAAmC,OACjC,EAAK,SACP,GAEF,KACF,CACF,CACF,CAAC,CACH"}