summaryrefslogtreecommitdiff
path: root/bs5/universal/js/ReactServerDOMEsbuild.re
blob: 957d54b9d2c04ba3f0c0c1ffc3db02d34cc84fc4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
type callServer('arg, 'result) =
  (string, list('arg)) => Js.Promise.t('result);

type options('arg, 'result) = {callServer: callServer('arg, 'result)};

[@mel.module "./ReactServerDOMEsbuild.js"]
external createFromReadableStreamImpl:
  (Webapi.ReadableStream.t, ~options: options('arg, 'result)=?, unit) =>
  Js.Promise.t('result) =
  "createFromReadableStream";

[@mel.module "./ReactServerDOMEsbuild.js"]
external createFromFetchImpl:
  (Js.Promise.t(Fetch.response), ~options: options('arg, 'result)=?, unit) =>
  React.element =
  "createFromFetch";

[@mel.module "./ReactServerDOMEsbuild.js"]
external createServerReferenceImpl:
  (
    string, // ServerReferenceId
    callServer('arg, 'result),
    // EncodeFormActionCallback (optional) (We're not using this right now)
    option('encodeFormActionCallback),
    // FindSourceMapURLCallback (optional, DEV-only) (We're not using this right now)
    option('findSourceMapURLCallback),
    // functionName (optional)
    option(string)
  ) =>
  // actionCallback is a function that takes N arguments and returns a promise
  // As we don't have control over the number of arguments, we need to pass it as 'actionCallback
  'action =
  "createServerReference";

[@mel.module "./ReactServerDOMEsbuild.js"]
external encodeReply: list('arg) => Js.Promise.t(string) = "encodeReply";

let callServer = (path: string, args) => {
  let headers =
    Fetch.HeadersInit.make({
      "Accept": "application/react.action",
      "ACTION_ID": path,
    });
  encodeReply(args)
  |> Js.Promise.then_(body => {
       let body = Fetch.BodyInit.make(body);
       Fetch.fetchWithInit(
         "/",
         Fetch.RequestInit.make(~method=Fetch.Post, ~headers, ~body, ()),
       )
       |> Js.Promise.then_(result => {
            let body = Fetch.Response.body(result);
            createFromReadableStreamImpl(body, ());
          });
     });
};

let createFromReadableStream = stream => {
  createFromReadableStreamImpl(
    stream,
    ~options={callServer: callServer},
    (),
  );
};

let createFromFetch = promise => {
  createFromFetchImpl(promise, ~options={callServer: callServer}, ());
};

let createServerReference = serverReferenceId => {
  createServerReferenceImpl(serverReferenceId, callServer, None, None, None);
};