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);
};
|