Skip to content

govm/nostr-relay-apigw-rust

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nostr-relay-apigw-rust

Overview

API Gateway の背後の Lambda 上で動作する、 DynamoDB に状態を保持する nostr relay です。

This code is for PoC. You should never use it for production purposes.

NIP

Deploy

% cargo lambda build --release --arm64
% cargo lambda deploy

しかし次のものも必要です。

  • WebSocket 用 API Gateway
  • HTTP 用 API Gateway (for NIP-11)
  • DynamoDB (event用, subscription用の2つのテーブル)
  • CloudFront (wss と nip-11 用の接続を同じエンドポイントで受け付けるようにみせかけるために、CloudFront で受けて CloudFront Functions でうまくやるとよい)

Hint

Lambda には次の環境変数を与えるとよい

  • NOSTR_EVENT_TABLE: Event用のテーブル名
  • NOSTR_EVENT_TTL: Event用テーブルのレコードのTTL(秒)
  • NOSTR_SUBSCRIPTION_TABLE: Subscription用のテーブル名
  • NOSTR_SUBSCRIPTION_TTL: Subscription用テーブルのレコードのTTL(秒)

DynmoDB には次のテーブルを作成するとよい

  • Event用テーブル
    • Primary Key
      • Partition Key: id (String)
      • Sort Key: type (String)
    • GSI: pubkey-created_at-index
      • Partition Key: pubkey (String)
      • Sort Key: created_id (Number)
      • projected attributes: id, kind
    • TTL: _ttl
  • Event用テーブル
    • Primary Key
      • Partition Key: id (String)
      • Sort Key: type (String)
    • GSI: value-id-index
      • Partition Key: value (String)
      • Sort Key: id (String)
      • projected attributes: Only Keys
    • TTL: _ttl

API Gateway で次のようなAPIを作成するとよい

  • WebSokcet 用 API
    • ルート式: $request.body.[0]
    • ルート: これらのルートの宛先を作成した Lambda 関数にする
      • REQ
      • EVENT
      • CLOSE
      • $disconnect
  • HTTP 用 API
    • WebSocket 用 API が HTTP を受け取れないための措置
    • Lambda に向けとくと NIP-11 を応答します

CloudFront を API Gateway の前段に置くと良い

次のような関数を設定するなどして、NIP-11のリクエストだけよろしくリダイレクトしてください

function handler(event) {
    var request = event.request;
    var headers = request.headers;
    var host = request.headers.host.value;
    
    if (headers.accept) {
        if (headers.accept.value == 'application/nostr+json') {
            var response =  {
                statusCode: 302,
                statusDescription: 'Found',
                headers: { 'location': { 'value': `https://${host}/nip11` }}
            }
            return response;
        }
    }
    return request;
}

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages