diff options
Diffstat (limited to 'bs5/universal/js/ReactServerDOMWebpack.re')
-rw-r--r-- | bs5/universal/js/ReactServerDOMWebpack.re | 78 |
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, + ); +}; |