use-api-server-streaming.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Run the server first with `npm run server`
  2. import { fetchEventSource } from '@waylaidwanderer/fetch-event-source';
  3. const opts = {
  4. method: 'POST',
  5. headers: {
  6. 'Content-Type': 'application/json',
  7. },
  8. body: JSON.stringify({
  9. message: 'Hello',
  10. // Set stream to true to receive each token as it is generated.
  11. stream: true,
  12. }),
  13. };
  14. try {
  15. let reply = '';
  16. const controller = new AbortController();
  17. await fetchEventSource('http://localhost:3001/conversation', {
  18. ...opts,
  19. signal: controller.signal,
  20. onopen(response) {
  21. if (response.status === 200) {
  22. return;
  23. }
  24. throw new Error(`Failed to send message. HTTP ${response.status} - ${response.statusText}`);
  25. },
  26. onclose() {
  27. throw new Error('Failed to send message. Server closed the connection unexpectedly.');
  28. },
  29. onerror(err) {
  30. throw err;
  31. },
  32. onmessage(message) {
  33. // { data: 'Hello', event: '', id: '', retry: undefined }
  34. if (message.data === '[DONE]') {
  35. controller.abort();
  36. console.log(message);
  37. return;
  38. }
  39. if (message.event === 'result') {
  40. const result = JSON.parse(message.data);
  41. console.log(result);
  42. return;
  43. }
  44. console.log(message);
  45. reply += JSON.parse(message.data);
  46. },
  47. });
  48. console.log(reply);
  49. } catch (err) {
  50. console.log('ERROR', err);
  51. }