MCPcopy Index your code
hub / github.com/equinox-io/equinox

github.com/equinox-io/equinox @v1.2.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.2.0 ↗ · + Follow
139 symbols 463 edges 35 files 28 documented · 20%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

equinox client SDK godoc reference

Package equinox allows applications to remotely update themselves with the equinox.io service.

Minimal Working Example

import "github.com/equinox-io/equinox"

const appID = "<YOUR EQUINOX APP ID>"

var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtrVmBxQvheRArXjg2vG1xIprWGuCyESx
MMY8pjmjepSy2kuz+nl9aFLqmr+rDNdYvEBqQaZrYMc6k29gjvoQnQ==
-----END PUBLIC KEY-----
`)

func update(channel string) error {
    opts := equinox.Options{Channel: channel}
    if err := opts.SetPublicKeyPEM(publicKey); err != nil {
        return err
    }

    // check for the update
    resp, err := equinox.Check(appID, opts)
    switch {
    case err == equinox.NotAvailableErr:
        fmt.Println("No update available, already at the latest version!")
        return nil
    case err != nil:
        return err
    }

    // fetch the update and apply it
    err = resp.Apply()
    if err != nil {
        return err
    }

    fmt.Printf("Updated to new version: %s!\n", resp.ReleaseVersion)
    return nil
}

Update To Specific Version

When you specify a channel in the update options, equinox will try to update the application to the latest release of your application published to that channel. Instead, you may wish to update the application to a specific (possibly older) version. You can do this by explicitly setting Version in the Options struct:

opts := equinox.Options{Version: "0.1.2"}

Prompt For Update

You may wish to ask the user for approval before updating to a new version. This is as simple as calling the Check function and only calling Apply on the returned result if the user approves. Example:

// check for the update
resp, err := equinox.Check(appID, opts)
switch {
case err == equinox.NotAvailableErr:
    fmt.Println("No update available, already at the latest version!")
    return nil
case err != nil:
    return err
}

fmt.Println("New version available!")
fmt.Println("Version:", resp.ReleaseVersion)
fmt.Println("Name:", resp.ReleaseTitle)
fmt.Println("Details:", resp.ReleaseDescription)

ok := prompt("Would you like to update?")

if !ok {
    return
}

err = resp.Apply()
// ...

Generating Keys

All equinox releases must be signed with a private ECDSA key, and all updates verified with the public key portion. To do that, you'll need to generate a key pair. The equinox release tool can generate an ecdsa key pair for you easily:

equinox genkey

Extension points exported contracts — how you extend this code

Patcher (Interface)
Patcher defines an interface for applying binary patches to an old item to get an updated item.
internal/go-update/patcher.go
Verifier (Interface)
Verifier defines an interface for verfiying an update's signature with a public key.
internal/go-update/verifier.go

Core symbols most depended-on inside this repo

Close
called by 27
internal/go-update/internal/binarydist/bzip2.go
Apply
called by 15
internal/go-update/apply.go
Write
called by 14
internal/go-update/internal/binarydist/seek.go
Seek
called by 11
internal/go-update/internal/binarydist/seek.go
Executable
called by 7
internal/go-update/internal/osext/osext.go
Executable
called by 7
internal/osext/osext.go
SetPublicKeyPEM
called by 6
internal/go-update/apply.go
swap
called by 4
internal/go-update/internal/binarydist/diff.go

Shape

Function 94
Method 27
Struct 13
FuncType 2
Interface 2
TypeAlias 1

Languages

Go100%

Modules by API surface

internal/go-update/apply_test.go21 symbols
sdk.go13 symbols
internal/go-update/apply.go11 symbols
internal/osext/osext_test.go8 symbols
internal/go-update/verifier.go8 symbols
internal/go-update/internal/osext/osext_test.go8 symbols
internal/go-update/internal/binarydist/encoding.go8 symbols
internal/go-update/internal/binarydist/diff.go8 symbols
sdk_test.go6 symbols
internal/go-update/patcher.go5 symbols
proto/proto.go4 symbols
internal/go-update/internal/binarydist/common_test.go4 symbols

For agents

$ claude mcp add equinox \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page