Add README (docs covering SDK and example cli app) and LICENSE files
This commit is contained in:
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Ownwire
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
146
README.md
Normal file
146
README.md
Normal file
@@ -0,0 +1,146 @@
|
||||
# Ownwire Go SDK
|
||||
|
||||
A minimal Go SDK for connecting to an Ownwire backend over WebSockets, plus a small CLI example that demonstrates the SDK end-to-end.
|
||||
|
||||
The SDK handles:
|
||||
- session creation and resumption
|
||||
- cryptographic handshake
|
||||
- encrypted message send/receive
|
||||
- ordered delivery via sequence numbers
|
||||
|
||||
The CLI is intentionally simple and exists only as a working example.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
Add the module to your project:
|
||||
|
||||
```sh
|
||||
go get ownwire.net/ownwire-sdk
|
||||
```
|
||||
|
||||
Then import it in your code:
|
||||
|
||||
```go
|
||||
import sdk "ownwire.net/ownwire-sdk"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Using the SDK
|
||||
|
||||
### Creating a client and connecting
|
||||
|
||||
```go
|
||||
client := sdk.NewClient(sdk.ClientOptions{
|
||||
Url: "ws://localhost:8080/ownwire",
|
||||
})
|
||||
```
|
||||
|
||||
To connect and create a **new session**:
|
||||
|
||||
```go
|
||||
ctx := context.Background()
|
||||
err := client.Connect(ctx, "")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
```
|
||||
|
||||
To **resume an existing session**, pass the session ID:
|
||||
|
||||
```go
|
||||
err := client.Connect(ctx, "cb653f53-6f7d-4aeb-ba0d-d2b17c290d8a")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Receiving messages
|
||||
|
||||
The SDK uses channels in a Go-idiomatic way.
|
||||
|
||||
```go
|
||||
for ev := range client.Events() {
|
||||
switch ev.Kind {
|
||||
case sdk.EventOpened:
|
||||
fmt.Println("connection opened")
|
||||
|
||||
case sdk.EventMessage:
|
||||
fmt.Println("received:", ev.Message.Content)
|
||||
|
||||
case sdk.EventError:
|
||||
log.Println("error:", ev.Err)
|
||||
|
||||
case sdk.EventClosed:
|
||||
fmt.Println("connection closed")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
All messages delivered via `EventMessage` are already decrypted.
|
||||
|
||||
---
|
||||
|
||||
### Sending messages
|
||||
|
||||
```go
|
||||
err := client.Send(ctx, "hello world", "")
|
||||
if err != nil {
|
||||
log.Println("send failed:", err)
|
||||
}
|
||||
```
|
||||
|
||||
Messages are automatically encrypted once the session handshake is complete.
|
||||
|
||||
---
|
||||
|
||||
### Closing the connection
|
||||
|
||||
```go
|
||||
client.Close()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example CLI
|
||||
|
||||
The repository includes a small CLI app that demonstrates the SDK working against a real Ownwire backend.
|
||||
|
||||
### Building the CLI
|
||||
|
||||
From the repository root:
|
||||
|
||||
```sh
|
||||
go build -o ownwire-cli ./example/cli
|
||||
```
|
||||
|
||||
### Running the CLI
|
||||
|
||||
```sh
|
||||
./ownwire-cli -url ws://localhost:8080/ownwire
|
||||
```
|
||||
|
||||
To resume an existing session:
|
||||
|
||||
```sh
|
||||
./ownwire-cli -url ws://localhost:8080/ownwire -resume <session-id>
|
||||
```
|
||||
|
||||
### What the CLI demonstrates
|
||||
|
||||
- dialing an Ownwire WebSocket endpoint
|
||||
- creating or resuming a session
|
||||
- printing incoming messages
|
||||
- sending stdin lines as encrypted messages
|
||||
- clean shutdown on Ctrl-C
|
||||
|
||||
The CLI is intentionally minimal and meant only as a reference implementation.
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- The SDK exposes only a small, stable API (`Client`, `Event`, `Message`).
|
||||
- Internal protocol and crypto helpers are intentionally not documented as part of the public API.
|
||||
- Unit tests cover handshake, crypto, and client behavior without requiring a server.
|
||||
Reference in New Issue
Block a user