#websocket #proxy #cli

app sockethook

Rust 编写的 Webhook 到 WebSocket 代理

1 个不稳定版本

0.1.0 2019年10月26日

#337 in #proxy

MIT 许可证

21KB
268 代码行

SocketHook

注意:这是一个 Rust 实现/移植自 sockethook 实现。

SocketHook 是一个用 Rust 编写的 Webhook 到 WebSocket 代理。它旨在构建围绕提供 Webhooks 的第三方 API 的实时应用程序。例如,SocketHook 可以用来创建 Github 部署的实时流或 Shopify 订单的实时视图。

用法

SocketHook 是用 Rust 编写的,可以通过运行以下命令安装:

$cargo install sockethook

使用以下命令启动工具:

$ sockethook
2019-10-26T17:15:56Z INFO  sockethook] Sockethook is ready and listening at 0.0.0.0:1234 ✅

SocketHook 现在已准备好开始接收 Webhooks!可以通过 /socket 后跟您想要订阅的端点来连接 WebSocket,例如:/socket/order/created。现在将向所有监听特定端点的订阅者广播发送到 /hook/order/created 的任何 Webhook 请求。

广播的消息将被 JSON 编码,并包含有关 Webhook 请求的信息。以下是从 Shopify Webhook 中的一个示例消息:

{
  "headers": {
    "accept": "*\/*",
    "accept-encoding": "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
    "connection": "close",
    "content-length": "4264",
    "content-type": "application\/json",
    "user-agent": "Ruby",
    "x-forwarded-for": "35.231.14.37",
    "x-forwarded-proto": "https",
    "x-shopify-hmac-sha256": "wa5ZVAJPjbtr4Oj8xVnt\/jLWwfD9JdGFcdrjY4VgORQ=",
    "x-shopify-order-id": "820982911946154508",
    "x-shopify-shop-domain": "fabianlindfors.myshopify.com",
    "x-shopify-test": "true",
    "x-shopify-topic": "orders\/create"
  },
  "endpoint": "\/order\/created",
  "data": {
    "app_id": null,
    "billing_address": {
      "address1": "123 Billing Street",
      "address2": null,
      "city": "Billtown",
      "company": "My Company",
      "country": "United States",
      "country_code": "US",
      "first_name": "Bob",
      "last_name": "Biller",
      "latitude": null,
      "longitude": null,
      "name": "Bob Biller",
      "phone": "555-555-BILL",
      "province": "Kentucky",
      "province_code": "KY",
      "zip": "K2P0B0"
    }
    ...
  }
}

如果请求的内容类型是 JSON,则 data 字段将包含 JSON 主体。否则,data 将是主体的字符串。

命令行选项

可以将两个可能的选项传递给 SocketHook,即 --port--address--port 指定要监听的端口(默认为 1234)和 --address 设置要绑定的特定地址。

$ sockethook --port 8000
$ sockethook --address 127.0.0.1

身份验证

SocketHook 不包含任何身份验证,这意味着默认情况下所有端点和套接字都是公开可用的。推荐的方式是使用反向代理或类似工具,这提供了很多灵活性。示例包括 nginxCaddyTraefik

许可证

SocketHook 在 MIT 许可证下发布。

改进

以下是与原始的 sockethooks(用 Go 编写)相比,此实现中的改进列表

  • 在断开连接时清理 WebSocket 连接
  • 处理 Cors
  • 在客户端套接字管理周围使用 RWLock
  • 允许将套接字和挂钩扩展到多台计算机

依赖关系

~26–37MB
~649K SLoC