A simple Swift library for JSON-RPC
Features:
- type-safety
- flexible data transport support
- concurrency support
Integration
dependencies: [ .package(url: "https://github.com/ChimeHQ/JSONRPC", from: "0.9.0") ]
Usage
The core type you'll use is JSONRPCSession. It requires you set up a DataChannel object that handles reading and writing raw data.
let channel = DataChannel(...) let session = JSONRPCSession(channel: channel) let params = "hello" // any Encodable let response: Decodable = try await session.sendRequest(params, method: "my_method") Task { for await event in await session.eventSequence { switch event { case .request(let request, let handler, let data): // inspect request, possibly re-decode with more specific type, // and reply using the handler case .notification(let notification, let data): // inspect notification case .error(let error): print("Error: \(error)") } } }
DataChannel
The closures on the DataChannel allow different transport mechanisms to be used. The JSONRPC package provides a few basic variants:
- Predefined messages channel
- A channel that delivers a static set of messages
- Usage:
let channel = await DataChannel.predefinedMessagesChannel(with: messages)
- Stdio channel
- Using stdout + stdin as message transport.
- Note: When using this transport, make sure no non-protocol messages are sent to
stdout, eg usingprint - Usage:
let channel = DataChannel.stdioPipe()
- Actor channel
- Using swift actors to pass messages.
- Can eg be useful for testing, where both client and server are implemented in swift and running in the same process.
- Usage:
let (clientChannel, serverChannel) = DataChannel.withDataActor()
- WebSocket channel
- Uses
URLSessionWebSocketTaskas a message transport. - Usage:
let channel = DataChannel.webSocket(url: socketURL, terminationHandler: { print("socket closed" })
- Uses
Contributing and Collaboration
I would love to hear from you! Issues or pull requests work great. Both a Matrix space and Discord are available for live help, but I have a strong bias towards answering in the form of documentation. You can also find me on mastodon.
I prefer collaboration, and would love to find ways to work together if you have a similar project.
I prefer indentation with tabs for improved accessibility. But, I'd rather you use the system you want and make a PR than hesitate because of whitespace.
By participating in this project you agree to abide by the Contributor Code of Conduct.