-- SPDX-FileCopyrightText: 2026 Alexandra de Wit
--
-- SPDX-License-Identifier: MIT

-- | The first-party npm publish relay over the shared bounded transport.
module Ecluse.Core.Registry.Npm (
    -- * First-party publish relay
    relayPublishDocument,
) where

import Ecluse.Core.Package (PackageName)
import Ecluse.Core.Registry (
    FetchFault (FetchUrlUnformable),
    PublishRelayResponse,
 )

import Ecluse.Core.Registry.Exchange (boundedRelay, formThen)
import Ecluse.Core.Registry.Npm.Publish (publishRequest)
import Ecluse.Core.Registry.Origin (OriginClient (ocLimits, ocManager, ocToken), originBaseUrl)
import Ecluse.Core.Security (BodyLimit (MetadataBodyLimit), Limits (progressFloor), maxMetadataBytes)

-- | Relay a client's npm publish document to the publication target and return its own response.
relayPublishDocument ::
    OriginClient ->
    PackageName ->
    ByteString ->
    IO (Either FetchFault PublishRelayResponse)
relayPublishDocument :: OriginClient
-> PackageName
-> ByteString
-> IO (Either FetchFault PublishRelayResponse)
relayPublishDocument OriginClient
origin PackageName
name ByteString
document =
    (UrlFormationError -> FetchFault)
-> (Request -> IO (Either FetchFault PublishRelayResponse))
-> Either UrlFormationError Request
-> IO (Either FetchFault PublishRelayResponse)
forall fault a.
(UrlFormationError -> fault)
-> (Request -> IO (Either fault a))
-> Either UrlFormationError Request
-> IO (Either fault a)
formThen
        UrlFormationError -> FetchFault
FetchUrlUnformable
        (Manager
-> ProgressFloor
-> BodyLimit
-> Request
-> IO (Either FetchFault PublishRelayResponse)
boundedRelay (OriginClient -> Manager
ocManager OriginClient
origin) (Limits -> ProgressFloor
progressFloor (OriginClient -> Limits
ocLimits OriginClient
origin)) (Int -> BodyLimit
MetadataBodyLimit (Limits -> Int
maxMetadataBytes (OriginClient -> Limits
ocLimits OriginClient
origin))))
        (Text
-> Maybe ClientCredential
-> PackageName
-> ByteString
-> Either UrlFormationError Request
publishRequest (OriginClient -> Text
originBaseUrl OriginClient
origin) (OriginClient -> Maybe ClientCredential
ocToken OriginClient
origin) PackageName
name ByteString
document)