{
  "version": 3,
  "sources": ["../../../../src/packages/server/connectStoreController.ts"],
  "sourcesContent": ["import { fetch } from '../fetch/index.ts';\nimport type {\n  FetchPackageToStoreOptions,\n  FetchResponse,\n  PackageResponse,\n  PackageStoreManagerResponse,\n  RequestPackageOptions,\n  StoreController,\n} from '../store-controller-types/index.ts';\n\nimport pLimit, { type LimitFunction } from 'p-limit';\nimport pShare from 'promise-share';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { PackageManifest } from '../types/package.ts';\nimport type { WantedDependency } from '../resolve-dependencies/index.ts';\nimport type { PkgResolutionId } from '../types/index.ts';\nimport type { PackageFilesResponse } from '../cafs-types/index.ts';\nimport type {\n  DirectoryResolution,\n  Resolution,\n} from '../resolver-base/index.ts';\n\nexport type StoreServerController<RP, FP, IP> = StoreController<RP, FP, IP> & {\n  stop: () => Promise<void>;\n};\n\nexport async function connectStoreController(initOpts: {\n  remotePrefix: string;\n  concurrency?: number | undefined;\n}): Promise<\n  StoreServerController<\n    PackageResponse,\n    {\n      filesIndexFile?: string | undefined;\n      inStoreLocation?: string | undefined;\n    },\n    PackageResponse\n  >\n> {\n  const remotePrefix = initOpts.remotePrefix;\n\n  const limitedFetch = limitFetch.bind<\n    null,\n    [LimitFunction],\n    [url: string, body: object],\n    Promise<PackageResponse>\n  >(null, pLimit(initOpts.concurrency ?? 100));\n\n  return new Promise((resolve, _reject): void => {\n    resolve({\n      close: async () => {},\n      fetchPackage: fetchPackage.bind(null, remotePrefix, limitedFetch),\n      getFilesIndexFilePath: () => {\n        return { filesIndexFile: '', target: '' };\n      }, // NOT IMPLEMENTED\n      importPackage: async (\n        to: string,\n        opts: {\n          filesResponse: PackageFilesResponse;\n          force: boolean;\n        }\n      ): Promise<PackageResponse> => {\n        return limitedFetch(`${remotePrefix}/importPackage`, {\n          opts,\n          to,\n        });\n      },\n      prune: async () => {\n        await limitedFetch(`${remotePrefix}/prune`, {});\n      },\n      requestPackage: requestPackage.bind<\n        null,\n        [string, (url: string, body: object) => Promise<PackageResponse>],\n        [wantedDependency: WantedDependency, options: RequestPackageOptions],\n        Promise<PackageResponse>\n      >(null, remotePrefix, limitedFetch),\n      stop: async () => {\n        await limitedFetch(`${remotePrefix}/stop`, {});\n      },\n      upload: async (\n        builtPkgLocation: string,\n        opts: { filesIndexFile: string; sideEffectsCacheKey: string }\n      ) => {\n        await limitedFetch(`${remotePrefix}/upload`, {\n          builtPkgLocation,\n          opts,\n        });\n      },\n      clearResolutionCache: () => {},\n    });\n  });\n}\n\nexport async function connectStoreManagerController<IP>(initOpts: {\n  remotePrefix: string;\n  concurrency?: number | undefined;\n}): Promise<StoreServerController<PackageResponse, PackageResponse, IP>> {\n  const remotePrefix = initOpts.remotePrefix;\n\n  function limitStoreManagerFetch(\n    limit: (fn: () => PromiseLike<IP>) => Promise<IP>,\n    url: string,\n    body: object\n  ): Promise<IP> {\n    let newUrl = url;\n\n    return limit(async (): Promise<IP> => {\n      // TODO: the http://unix: should be also supported by the fetcher\n      // but it fails with node-fetch-unix as of v2.3.0\n      if (newUrl.startsWith('http://unix:')) {\n        newUrl = newUrl.replace('http://unix:', 'unix:');\n      }\n\n      const response = await fetch(url, {\n        body: JSON.stringify(body),\n        headers: { 'Content-Type': 'application/json' },\n        method: 'POST',\n        retry: {\n          retries: 100,\n        },\n      });\n\n      if (!response.ok) {\n        throw await response.json();\n      }\n\n      // TODO: valibot schema\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const json = (await response.json()) as any;\n\n      // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n      if (json.error) {\n        throw json.error;\n      }\n\n      return json as IP;\n    });\n  }\n\n  const limitedFetch = limitStoreManagerFetch.bind<\n    null,\n    [LimitFunction],\n    [url: string, body: object],\n    Promise<IP>\n  >(null, pLimit(initOpts.concurrency ?? 100));\n\n  return new Promise((resolve, _reject): void => {\n    resolve({\n      close: async () => {},\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      fetchPackage: fetchStoreManagerPackage.bind<\n        null,\n        [string, (url: string, body: object) => Promise<IP>],\n        [options: FetchPackageToStoreOptions],\n        Promise<{\n          filesIndexFile?: string | undefined;\n          inStoreLocation?: string | undefined;\n        }>\n      >(null, remotePrefix, limitedFetch),\n      getFilesIndexFilePath: () => {\n        return { filesIndexFile: '', target: '' };\n      }, // NOT IMPLEMENTED\n      importPackage: async (\n        to: string,\n        opts: {\n          filesResponse: PackageFilesResponse;\n          force: boolean;\n        }\n      ): Promise<IP> => {\n        return limitedFetch(`${remotePrefix}/importPackage`, {\n          opts,\n          to,\n        });\n      },\n      prune: async () => {\n        await limitedFetch(`${remotePrefix}/prune`, {});\n      },\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      requestPackage: requestStoreManagerPackage.bind<\n        null,\n        [\n          string,\n          (\n            url: string,\n            body: object\n          ) => Promise<{ isBuilt: boolean; importMethod?: string | undefined }>,\n        ],\n        [wantedDependency: WantedDependency, options: RequestPackageOptions],\n        Promise<{ isBuilt: boolean; importMethod?: string | undefined }>\n      >(null, remotePrefix, limitedFetch),\n      stop: async () => {\n        await limitedFetch(`${remotePrefix}/stop`, {});\n      },\n      upload: async (\n        builtPkgLocation: string,\n        opts: { filesIndexFile: string; sideEffectsCacheKey: string }\n      ) => {\n        await limitedFetch(`${remotePrefix}/upload`, {\n          builtPkgLocation,\n          opts,\n        });\n      },\n      clearResolutionCache: () => {},\n    });\n  });\n}\n\nfunction limitFetch(\n  limit: (fn: () => PromiseLike<PackageResponse>) => Promise<PackageResponse>,\n  url: string,\n  body: object\n): Promise<PackageResponse> {\n  let newUrl = url;\n\n  return limit(async (): Promise<PackageResponse> => {\n    // TODO: the http://unix: should be also supported by the fetcher\n    // but it fails with node-fetch-unix as of v2.3.0\n    if (newUrl.startsWith('http://unix:')) {\n      newUrl = newUrl.replace('http://unix:', 'unix:');\n    }\n\n    const response = await fetch(url, {\n      body: JSON.stringify(body),\n      headers: { 'Content-Type': 'application/json' },\n      method: 'POST',\n      retry: {\n        retries: 100,\n      },\n    });\n\n    if (!response.ok) {\n      throw await response.json();\n    }\n\n    // TODO: valibot schema\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const json = (await response.json()) as any;\n\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (json.error) {\n      throw json.error;\n    }\n\n    return json as PackageResponse;\n  });\n}\n\nasync function requestPackage(\n  remotePrefix: string,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  limitedFetch: (url: string, body: object) => any,\n  wantedDependency: WantedDependency,\n  options: RequestPackageOptions\n): Promise<PackageResponse> {\n  const msgId = uuidv4();\n\n  const packageResponseBody = await limitedFetch(\n    `${remotePrefix}/requestPackage`,\n    {\n      msgId,\n      options,\n      wantedDependency,\n    }\n  );\n\n  if (options.skipFetch === true) {\n    return { body: packageResponseBody };\n  }\n\n  const fetchingFiles = limitedFetch(`${remotePrefix}/packageFilesResponse`, {\n    msgId,\n  });\n\n  return {\n    body: packageResponseBody,\n    fetching: pShare(fetchingFiles),\n  };\n}\n\nasync function requestStoreManagerPackage(\n  remotePrefix: string,\n  limitedFetch: <R>(url: string, body: object) => Promise<R>,\n  wantedDependency: WantedDependency,\n  options: RequestPackageOptions\n): Promise<\n  PackageStoreManagerResponse<{\n    isBuilt: boolean;\n    importMethod?: string | undefined;\n  }>\n> {\n  const msgId = uuidv4();\n\n  const packageResponseBody:\n    | ({\n        isLocal: boolean;\n        isInstallable?: boolean | undefined;\n        resolution?: Resolution | undefined;\n        manifest?: PackageManifest | undefined;\n        id: PkgResolutionId;\n        normalizedPref?: string | undefined;\n        updated: boolean;\n        publishedAt?: string | undefined;\n        resolvedVia?: string | undefined;\n        latest?: string | undefined;\n      } & (\n        | {\n            isLocal: true;\n            resolution: DirectoryResolution;\n          }\n        | {\n            isLocal: false;\n          }\n      ))\n    | undefined = await limitedFetch(`${remotePrefix}/requestPackage`, {\n    msgId,\n    options,\n    wantedDependency,\n  });\n\n  if (options.skipFetch === true) {\n    return { body: packageResponseBody };\n  }\n\n  const fetchingFiles = limitedFetch<{\n    isBuilt: boolean;\n    importMethod?: string | undefined;\n  }>(`${remotePrefix}/packageFilesResponse`, {\n    msgId,\n  });\n\n  return {\n    body: packageResponseBody,\n    fetching: pShare(fetchingFiles),\n  };\n}\n\nasync function fetchPackage(\n  remotePrefix: string,\n  limitedFetch: (\n    url: string,\n    body: object\n  ) => Promise<{\n    filesIndexFile?: string | undefined;\n    inStoreLocation?: string | undefined;\n  }>,\n  options: FetchPackageToStoreOptions\n): Promise<\n  FetchResponse<{\n    filesIndexFile?: string | undefined;\n    inStoreLocation?: string | undefined;\n  }>\n> {\n  const msgId = uuidv4();\n\n  const fetchResponseBody = await limitedFetch(`${remotePrefix}/fetchPackage`, {\n    msgId,\n    options,\n  });\n\n  const fetching = limitedFetch(`${remotePrefix}/packageFilesResponse`, {\n    msgId,\n  });\n\n  return {\n    fetching: pShare(fetching),\n    filesIndexFile: fetchResponseBody.filesIndexFile,\n    inStoreLocation: fetchResponseBody.inStoreLocation,\n  };\n}\n\nasync function fetchStoreManagerPackage(\n  remotePrefix: string,\n  limitedFetch: <R>(url: string, body: object) => Promise<R>,\n  options: FetchPackageToStoreOptions\n): Promise<\n  FetchResponse<{ isBuilt: boolean; importMethod?: string | undefined }>\n> {\n  const msgId = uuidv4();\n\n  const fetchResponseBody = await limitedFetch<{\n    filesIndexFile?: string | undefined;\n    inStoreLocation?: string | undefined;\n  }>(`${remotePrefix}/fetchPackage`, {\n    msgId,\n    options,\n  });\n\n  const fetching = limitedFetch<{\n    isBuilt: boolean;\n    importMethod?: string | undefined;\n  }>(`${remotePrefix}/packageFilesResponse`, {\n    msgId,\n  });\n\n  return {\n    fetching: pShare(fetching),\n    filesIndexFile: fetchResponseBody.filesIndexFile,\n    inStoreLocation: fetchResponseBody.inStoreLocation,\n  };\n}\n"],
  "mappings": "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",
  "names": []
}
