Skip to content

Data transfer

After a contract negotiation reaches FINALIZED, the consumer can initiate a data transfer. RUN-DSP implements the IDSA Dataspace Protocol transfer process state machine.

States

stateDiagram-v2
    [*] --> REQUESTED : Consumer requests transfer
    REQUESTED --> STARTED : Provider starts transfer
    STARTED --> COMPLETED : Transfer completed
    STARTED --> SUSPENDED : Either party suspends
    SUSPENDED --> STARTED : Either party resumes
    STARTED --> TERMINATED : Either party
    SUSPENDED --> TERMINATED : Either party
    COMPLETED --> [*]
    TERMINATED --> [*]

Download (pull flow)

The consumer application requests download coordinates from RUN-DSP via gRPC. RUN-DSP negotiates the transfer with the provider over DSP, then returns a signed URL and auth token. The consumer retrieves the file directly from the provider's storage endpoint and signals completion back to RUN-DSP.

sequenceDiagram
    participant A as Consumer application
    participant CR as Consumer RUN-DSP
    participant PR as Provider RUN-DSP
    participant B as Provider backend
    participant S as Storage

    A->>CR: gRPC — getProviderDatasetDownloadInformation<br/>{ provider_url, dataset_id }
    CR->>PR: DSP transfer request (REQUESTED)
    PR->>B: gRPC — request download URL for dataset
    B-->>PR: Signed URL + auth token
    PR->>CR: DSP transfer start with PublishInfo<br/>{ url, authType, token, transferId } (STARTED)
    CR-->>A: PublishInfo { url, authType, token, transferId }
    A->>S: HTTP GET — download file<br/>Authorization: <token>
    S-->>A: File bytes
    A->>CR: gRPC — signalTransferComplete(transferId)
    CR->>PR: DSP transfer completion (COMPLETED)

Upload (push flow)

The consumer application requests upload coordinates from RUN-DSP via gRPC. RUN-DSP negotiates the transfer with the provider, then returns an upload URL and auth token. The consumer posts the file directly to the provider's storage endpoint and signals completion back to RUN-DSP.

sequenceDiagram
    participant A as Consumer application
    participant CR as Consumer RUN-DSP
    participant PR as Provider RUN-DSP
    participant B as Provider backend
    participant S as Storage

    A->>CR: gRPC — getProviderDatasetUploadInformation<br/>{ provider_url, dataset_id }
    CR->>PR: DSP transfer request (REQUESTED)
    PR->>B: gRPC — request upload URL for dataset
    B-->>PR: Signed URL + auth token
    PR->>CR: DSP transfer start with PublishInfo<br/>{ url, authType, token, transferId } (STARTED)
    CR-->>A: PublishInfo { url, authType, token, transferId }
    A->>S: HTTP POST multipart/form-data<br/>Authorization: <token>
    S-->>A: 200 OK
    A->>CR: gRPC — signalTransferComplete(transferId)
    CR->>PR: DSP transfer completion (COMPLETED)

Transfer states

From To Actor DSP endpoint
REQUESTED Consumer provider.dsp/transfers/request
REQUESTED STARTED Provider consumer.dsp/:callback/transfers/:consumerPID/start
STARTED COMPLETED Consumer consumer.dsp/transfers/:providerPID/completion
STARTED SUSPENDED Either suspension endpoint
SUSPENDED STARTED Either start endpoint
* TERMINATED Either termination endpoint