API Gateway の背後の Lambda 上で動作する、 DynamoDB に状態を保持する nostr relay です。
This code is for PoC. You should never use it for production purposes.
- NIP-01: Basic protocol flow description
- ただし、ids も authors も指定しない filter に対して Stored Events を返しません
- NIP-02: Contact List and Petnames
- NIP-09: Event Deletion
- NIP-11: Relay Information Document
- NIP-15: End of Stored Events Notice
- NIP-16: Event Treatment
- NIP-20: Command Results
% 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 でうまくやるとよい)
- NOSTR_EVENT_TABLE: Event用のテーブル名
- NOSTR_EVENT_TTL: Event用テーブルのレコードのTTL(秒)
- NOSTR_SUBSCRIPTION_TABLE: Subscription用のテーブル名
- NOSTR_SUBSCRIPTION_TTL: Subscription用テーブルのレコードのTTL(秒)
- 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
- Primary Key
- 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
- Primary Key
- WebSokcet 用 API
- ルート式: $request.body.[0]
- ルート: これらのルートの宛先を作成した Lambda 関数にする
- REQ
- EVENT
- CLOSE
- $disconnect
- HTTP 用 API
- WebSocket 用 API が HTTP を受け取れないための措置
- Lambda に向けとくと NIP-11 を応答します
次のような関数を設定するなどして、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;
}