-
-
Save goswinr/ad840d497a6f18731be66b29348fd5b6 to your computer and use it in GitHub Desktop.
Fast inter-process RPC using shared memory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open SharedMemory | |
open MBrace.FsPickler | |
module Rpc = | |
type RpcContext<'command, 'message> = | |
{ name: string; buffer: RpcBuffer; post: 'command -> Async<'message>} with | |
interface IDisposable with | |
member this.Dispose() = this.buffer.Dispose() | |
let createHost name (handler : 'command -> Async<'message>) = | |
let pickler = FsPickler.CreateBinarySerializer() | |
let onReceive data = Async.StartAsTask <| async { | |
let command = pickler.UnPickle data | |
let! message = handler command | |
return pickler.Pickle message | |
} | |
{ name = name; buffer = new RpcBuffer(name, (fun _ data -> onReceive data)); post = handler } | |
let createClient name = | |
let pickler = FsPickler.CreateBinarySerializer() | |
let buffer = new RpcBuffer(name) | |
let onSend command = async { | |
let data = pickler.Pickle command | |
let! response = buffer.RemoteRequestAsync data |> Async.AwaitTask | |
if not response.Success then | |
failwith "Failed to get response" | |
return pickler.UnPickle response.Data | |
} | |
{ name = name; buffer = new RpcBuffer(name); post = onSend } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
usage
https://twitter.com/deviousasti/status/1289247538319462400
I'll make do with this for now - to be replaced Fable.Remoting.Ipc someday. 😉