Streaming & Upload

O callApiStream do Core lê a resposta NDJSON como JSON por linha e emite sequencialmente no Observable.


Uso direto do callApiStream no Core.

Use o callApiStream quando o servidor retornar NDJSON (um JSON por linha). Se não houver header Accept, application/x-ndjson é definido como padrão, e outros tipos de mídia podem ser sobrescritos com headers por solicitação.

ts
export const streamEvents = () => {
  return client.callApiStream<{
    eventName: string;
    content: unknown;
  }>({
    url: "/api/event/stream",
    method: "get",
    // headers: { Accept: "application/x-ndjson" },
  });
};

Formato de resposta NDJSON.

text
{"status":"STARTED","progress":0}
{"status":"PROGRESS","progress":35}
{"status":"PROGRESS","progress":80}
{"status":"DONE","progress":100}

callApiStreamDivide a resposta com base em quebras de linha e faz JSON.parse em cada linha. Espera-se NDJSON, não o formato padrão de frame data: do SSE.

Assinatura e cancelamento de Observable.

tsx
const subscription = streamEvents().subscribe({
  next: (event) => {
    setProgress(event.content);
  },
  error: (error) => {
    setErrorMessage(error.message);
  },
  complete: () => {
    setRunning(false);
  },
});

return () => subscription.unsubscribe();

unsubscribe() cancela também o leitor ReadableStream interno. Desinscreva-se em efeitos React ou na limpeza de tarefas.

Opcional: Uso do serviço de stream gerado.

Em projetos que usam o gerador OpenAPI, você pode fazer com que o serviço gerado chame callApiStream para o endpoint de stream. Na interface, importe e assine da mesma forma que um serviço gerado comum.

tsx
const subscription = jobProgress({
  path: { jobId },
}).subscribe({
  next: (event) => {
    setProgress(event.progress || 0);
  },
  error: (error) => {
    setErrorMessage(error.message);
  },
  complete: () => {
    setRunning(false);
  },
});

return () => subscription.unsubscribe();

uploadFile: Faz um PUT de arquivo para a URL especificada.

uploadFile.ts
ts
service.uploadFile({
  file,
  url: signedUploadUrl,
  headers: {
    "Content-Type": file.type || "application/octet-stream",
    "If-None-Match": "*",
  },
}).subscribe();
© 2026 Byeolnaerim. Todos os direitos reservados.IntroduçãoPolítica de Privacidade