summaryrefslogtreecommitdiff
path: root/bs5/universal/js/ReactServerDOMWebpack.re
diff options
context:
space:
mode:
Diffstat (limited to 'bs5/universal/js/ReactServerDOMWebpack.re')
-rw-r--r--bs5/universal/js/ReactServerDOMWebpack.re78
1 files changed, 78 insertions, 0 deletions
diff --git a/bs5/universal/js/ReactServerDOMWebpack.re b/bs5/universal/js/ReactServerDOMWebpack.re
new file mode 100644
index 0000000..a2067cd
--- /dev/null
+++ b/bs5/universal/js/ReactServerDOMWebpack.re
@@ -0,0 +1,78 @@
+type callServer('arg, 'result) =
+ (string, list('arg)) => Js.Promise.t('result);
+
+type options('arg, 'result) = {callServer: callServer('arg, 'result)};
+
+[@mel.module "react-server-dom-webpack/client"]
+external createFromReadableStreamImpl:
+ (Webapi.ReadableStream.t, ~options: options('arg, 'result)=?, unit) =>
+ Js.Promise.t('result) =
+ "createFromReadableStream";
+
+[@mel.module "react-server-dom-webpack/client"]
+external createFromFetchImpl:
+ (Js.Promise.t(Fetch.response), ~options: options('arg, 'result)=?, unit) =>
+ React.element =
+ "createFromFetch";
+
+[@mel.module "react-server-dom-webpack/client"]
+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 "react-server-dom-webpack/client"]
+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, functionName) => {
+ createServerReferenceImpl(
+ serverReferenceId,
+ callServer,
+ None,
+ None,
+ functionName,
+ );
+};