nostr-websocket-utils 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__mocks__/extendedWsMock.d.ts +6 -8
- package/dist/__mocks__/extendedWsMock.d.ts.map +1 -0
- package/dist/__mocks__/extendedWsMock.js +1 -0
- package/dist/__mocks__/extendedWsMock.js.map +1 -0
- package/dist/__mocks__/mockLogger.d.ts +8 -7
- package/dist/__mocks__/mockLogger.d.ts.map +1 -0
- package/dist/__mocks__/mockLogger.js +1 -0
- package/dist/__mocks__/mockLogger.js.map +1 -0
- package/dist/__mocks__/mockserver.d.ts +7 -11
- package/dist/__mocks__/mockserver.d.ts.map +1 -0
- package/dist/__mocks__/mockserver.js +1 -0
- package/dist/__mocks__/mockserver.js.map +1 -0
- package/dist/__mocks__/wsMock.d.ts +1 -2
- package/dist/__mocks__/wsMock.d.ts.map +1 -0
- package/dist/__mocks__/wsMock.js +1 -0
- package/dist/__mocks__/wsMock.js.map +1 -0
- package/dist/cjs/__mocks__/extendedWsMock.d.ts +52 -0
- package/dist/cjs/__mocks__/extendedWsMock.d.ts.map +1 -0
- package/dist/cjs/__mocks__/extendedWsMock.js +161 -0
- package/dist/cjs/__mocks__/extendedWsMock.js.map +1 -0
- package/dist/cjs/__mocks__/mockLogger.d.ts +42 -0
- package/dist/cjs/__mocks__/mockLogger.d.ts.map +1 -0
- package/dist/cjs/__mocks__/mockLogger.js +53 -0
- package/dist/cjs/__mocks__/mockLogger.js.map +1 -0
- package/dist/cjs/__mocks__/mockserver.d.ts +27 -0
- package/dist/cjs/__mocks__/mockserver.d.ts.map +1 -0
- package/dist/cjs/__mocks__/mockserver.js +44 -0
- package/dist/cjs/__mocks__/mockserver.js.map +1 -0
- package/dist/cjs/__mocks__/wsMock.d.ts +25 -0
- package/dist/cjs/__mocks__/wsMock.d.ts.map +1 -0
- package/dist/cjs/__mocks__/wsMock.js +123 -0
- package/dist/cjs/__mocks__/wsMock.js.map +1 -0
- package/dist/cjs/core/client.d.ts +35 -0
- package/dist/cjs/core/client.d.ts.map +1 -0
- package/dist/cjs/core/client.js +161 -0
- package/dist/cjs/core/client.js.map +1 -0
- package/dist/{nostr-server.d.ts → cjs/core/nostr-server.d.ts} +3 -6
- package/dist/cjs/core/nostr-server.d.ts.map +1 -0
- package/dist/cjs/core/nostr-server.js +101 -0
- package/dist/cjs/core/nostr-server.js.map +1 -0
- package/dist/cjs/core/queue.d.ts +38 -0
- package/dist/cjs/core/queue.d.ts.map +1 -0
- package/dist/cjs/core/queue.js +105 -0
- package/dist/cjs/core/queue.js.map +1 -0
- package/dist/cjs/core/server.d.ts +29 -0
- package/dist/cjs/core/server.d.ts.map +1 -0
- package/dist/cjs/core/server.js +134 -0
- package/dist/cjs/core/server.js.map +1 -0
- package/dist/cjs/crypto/bech32.d.ts +27 -0
- package/dist/cjs/crypto/bech32.d.ts.map +1 -0
- package/dist/cjs/crypto/bech32.js +170 -0
- package/dist/cjs/crypto/bech32.js.map +1 -0
- package/dist/cjs/crypto/handlers.d.ts +19 -0
- package/dist/cjs/crypto/handlers.d.ts.map +1 -0
- package/dist/cjs/crypto/handlers.js +65 -0
- package/dist/cjs/crypto/handlers.js.map +1 -0
- package/dist/cjs/crypto/index.d.ts +6 -0
- package/dist/cjs/crypto/index.d.ts.map +1 -0
- package/dist/cjs/crypto/index.js +22 -0
- package/dist/cjs/crypto/index.js.map +1 -0
- package/dist/cjs/endpoints/metrics.d.ts +30 -0
- package/dist/cjs/endpoints/metrics.d.ts.map +1 -0
- package/dist/cjs/endpoints/metrics.js +106 -0
- package/dist/cjs/endpoints/metrics.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/nips/index.d.ts +20 -0
- package/dist/cjs/nips/index.d.ts.map +1 -0
- package/dist/cjs/nips/index.js +51 -0
- package/dist/cjs/nips/index.js.map +1 -0
- package/dist/cjs/nips/nip-01.d.ts +35 -0
- package/dist/cjs/nips/nip-01.d.ts.map +1 -0
- package/dist/cjs/nips/nip-01.js +142 -0
- package/dist/cjs/nips/nip-01.js.map +1 -0
- package/dist/cjs/nips/nip-02.d.ts +83 -0
- package/dist/cjs/nips/nip-02.d.ts.map +1 -0
- package/dist/cjs/nips/nip-02.js +119 -0
- package/dist/cjs/nips/nip-02.js.map +1 -0
- package/dist/cjs/nips/nip-04.d.ts +37 -0
- package/dist/cjs/nips/nip-04.d.ts.map +1 -0
- package/dist/cjs/nips/nip-04.js +104 -0
- package/dist/cjs/nips/nip-04.js.map +1 -0
- package/dist/cjs/nips/nip-05.d.ts +88 -0
- package/dist/cjs/nips/nip-05.d.ts.map +1 -0
- package/dist/cjs/nips/nip-05.js +158 -0
- package/dist/cjs/nips/nip-05.js.map +1 -0
- package/dist/cjs/nips/nip-09.d.ts +93 -0
- package/dist/cjs/nips/nip-09.d.ts.map +1 -0
- package/dist/cjs/nips/nip-09.js +180 -0
- package/dist/cjs/nips/nip-09.js.map +1 -0
- package/dist/cjs/nips/nip-11.d.ts +65 -0
- package/dist/cjs/nips/nip-11.d.ts.map +1 -0
- package/dist/cjs/nips/nip-11.js +161 -0
- package/dist/cjs/nips/nip-11.js.map +1 -0
- package/dist/cjs/nips/nip-13.d.ts +74 -0
- package/dist/cjs/nips/nip-13.d.ts.map +1 -0
- package/dist/cjs/nips/nip-13.js +136 -0
- package/dist/cjs/nips/nip-13.js.map +1 -0
- package/dist/cjs/nips/nip-15.d.ts +84 -0
- package/dist/cjs/nips/nip-15.d.ts.map +1 -0
- package/dist/cjs/nips/nip-15.js +102 -0
- package/dist/cjs/nips/nip-15.js.map +1 -0
- package/dist/cjs/nips/nip-16.d.ts +89 -0
- package/dist/cjs/nips/nip-16.d.ts.map +1 -0
- package/dist/cjs/nips/nip-16.js +157 -0
- package/dist/cjs/nips/nip-16.js.map +1 -0
- package/dist/cjs/nips/nip-19.d.ts +29 -0
- package/dist/cjs/nips/nip-19.d.ts.map +1 -0
- package/dist/cjs/nips/nip-19.js +112 -0
- package/dist/cjs/nips/nip-19.js.map +1 -0
- package/dist/cjs/nips/nip-20.d.ts +60 -0
- package/dist/cjs/nips/nip-20.d.ts.map +1 -0
- package/dist/cjs/nips/nip-20.js +102 -0
- package/dist/cjs/nips/nip-20.js.map +1 -0
- package/dist/cjs/nips/nip-22.d.ts +90 -0
- package/dist/cjs/nips/nip-22.d.ts.map +1 -0
- package/dist/cjs/nips/nip-22.js +149 -0
- package/dist/cjs/nips/nip-22.js.map +1 -0
- package/dist/cjs/nips/nip-26.d.ts +53 -0
- package/dist/cjs/nips/nip-26.d.ts.map +1 -0
- package/dist/cjs/nips/nip-26.js +147 -0
- package/dist/cjs/nips/nip-26.js.map +1 -0
- package/dist/cjs/nips/nip-28.d.ts +104 -0
- package/dist/cjs/nips/nip-28.d.ts.map +1 -0
- package/dist/cjs/nips/nip-28.js +164 -0
- package/dist/cjs/nips/nip-28.js.map +1 -0
- package/dist/cjs/nips/nip-33.d.ts +95 -0
- package/dist/cjs/nips/nip-33.d.ts.map +1 -0
- package/dist/cjs/nips/nip-33.js +135 -0
- package/dist/cjs/nips/nip-33.js.map +1 -0
- package/dist/cjs/transport/base.d.ts +54 -0
- package/dist/cjs/transport/base.d.ts.map +1 -0
- package/dist/cjs/transport/base.js +109 -0
- package/dist/cjs/transport/base.js.map +1 -0
- package/dist/cjs/transport/websocket.d.ts +24 -0
- package/dist/cjs/transport/websocket.d.ts.map +1 -0
- package/dist/cjs/transport/websocket.js +136 -0
- package/dist/cjs/transport/websocket.js.map +1 -0
- package/dist/cjs/types/events.d.ts +74 -0
- package/dist/cjs/types/events.d.ts.map +1 -0
- package/dist/cjs/types/events.js +7 -0
- package/dist/cjs/types/events.js.map +1 -0
- package/dist/cjs/types/filters.d.ts +20 -0
- package/dist/cjs/types/filters.d.ts.map +1 -0
- package/dist/cjs/types/filters.js +7 -0
- package/dist/cjs/types/filters.js.map +1 -0
- package/dist/cjs/types/handlers.d.ts +81 -0
- package/dist/cjs/types/handlers.d.ts.map +1 -0
- package/dist/cjs/types/handlers.js +7 -0
- package/dist/cjs/types/handlers.js.map +1 -0
- package/dist/cjs/types/index.d.ts +144 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +37 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/logger.d.ts +41 -0
- package/dist/cjs/types/logger.d.ts.map +1 -0
- package/dist/cjs/types/logger.js +7 -0
- package/dist/cjs/types/logger.js.map +1 -0
- package/dist/cjs/types/messages.d.ts +133 -0
- package/dist/cjs/types/messages.d.ts.map +1 -0
- package/dist/cjs/types/messages.js +46 -0
- package/dist/cjs/types/messages.js.map +1 -0
- package/dist/cjs/types/nostr.d.ts +134 -0
- package/dist/cjs/types/nostr.d.ts.map +1 -0
- package/dist/cjs/types/nostr.js +7 -0
- package/dist/cjs/types/nostr.js.map +1 -0
- package/dist/cjs/types/options.d.ts +155 -0
- package/dist/cjs/types/options.d.ts.map +1 -0
- package/dist/cjs/types/options.js +7 -0
- package/dist/cjs/types/options.js.map +1 -0
- package/dist/cjs/types/priority.d.ts +13 -0
- package/dist/cjs/types/priority.d.ts.map +1 -0
- package/dist/cjs/types/priority.js +17 -0
- package/dist/cjs/types/priority.js.map +1 -0
- package/dist/cjs/types/relays.d.ts +27 -0
- package/dist/cjs/types/relays.d.ts.map +1 -0
- package/dist/cjs/types/relays.js +7 -0
- package/dist/cjs/types/relays.js.map +1 -0
- package/dist/cjs/types/scoring.d.ts +59 -0
- package/dist/cjs/types/scoring.d.ts.map +1 -0
- package/dist/cjs/types/scoring.js +34 -0
- package/dist/cjs/types/scoring.js.map +1 -0
- package/dist/cjs/types/socket.d.ts +98 -0
- package/dist/cjs/types/socket.d.ts.map +1 -0
- package/dist/cjs/types/socket.js +7 -0
- package/dist/cjs/types/socket.js.map +1 -0
- package/dist/cjs/types/transport.d.ts +98 -0
- package/dist/cjs/types/transport.d.ts.map +1 -0
- package/dist/cjs/types/transport.js +7 -0
- package/dist/cjs/types/transport.js.map +1 -0
- package/dist/cjs/types/validation.d.ts +51 -0
- package/dist/cjs/types/validation.d.ts.map +1 -0
- package/dist/cjs/types/validation.js +7 -0
- package/dist/cjs/types/validation.js.map +1 -0
- package/dist/cjs/types/websocket.d.ts +250 -0
- package/dist/cjs/types/websocket.d.ts.map +1 -0
- package/dist/cjs/types/websocket.js +7 -0
- package/dist/cjs/types/websocket.js.map +1 -0
- package/dist/cjs/utils/http.d.ts +11 -0
- package/dist/cjs/utils/http.d.ts.map +1 -0
- package/dist/cjs/utils/http.js +28 -0
- package/dist/cjs/utils/http.js.map +1 -0
- package/dist/cjs/utils/logger.d.ts +26 -0
- package/dist/cjs/utils/logger.d.ts.map +1 -0
- package/dist/cjs/utils/logger.js +43 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/cjs/utils/metrics.d.ts +81 -0
- package/dist/cjs/utils/metrics.d.ts.map +1 -0
- package/dist/cjs/utils/metrics.js +211 -0
- package/dist/cjs/utils/metrics.js.map +1 -0
- package/dist/cjs/utils/rate-limiter.d.ts +86 -0
- package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
- package/dist/cjs/utils/rate-limiter.js +183 -0
- package/dist/cjs/utils/rate-limiter.js.map +1 -0
- package/dist/core/client.d.ts +1 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +1 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/nostr-server.d.ts +1 -0
- package/dist/core/nostr-server.d.ts.map +1 -0
- package/dist/core/nostr-server.js +1 -0
- package/dist/core/nostr-server.js.map +1 -0
- package/dist/core/queue.d.ts +1 -0
- package/dist/core/queue.d.ts.map +1 -0
- package/dist/core/queue.js +1 -0
- package/dist/core/queue.js.map +1 -0
- package/dist/core/server.d.ts +1 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +1 -0
- package/dist/core/server.js.map +1 -0
- package/dist/crypto/bech32.d.ts +1 -0
- package/dist/crypto/bech32.d.ts.map +1 -0
- package/dist/crypto/bech32.js +1 -0
- package/dist/crypto/bech32.js.map +1 -0
- package/dist/crypto/handlers.d.ts +1 -0
- package/dist/crypto/handlers.d.ts.map +1 -0
- package/dist/crypto/handlers.js +1 -0
- package/dist/crypto/handlers.js.map +1 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +1 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/endpoints/metrics.d.ts +1 -0
- package/dist/endpoints/metrics.d.ts.map +1 -0
- package/dist/endpoints/metrics.js +1 -0
- package/dist/endpoints/metrics.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/nips/index.d.ts +1 -0
- package/dist/nips/index.d.ts.map +1 -0
- package/dist/nips/index.js +1 -0
- package/dist/nips/index.js.map +1 -0
- package/dist/nips/nip-01.d.ts +1 -0
- package/dist/nips/nip-01.d.ts.map +1 -0
- package/dist/nips/nip-01.js +1 -0
- package/dist/nips/nip-01.js.map +1 -0
- package/dist/nips/nip-02.d.ts +1 -0
- package/dist/nips/nip-02.d.ts.map +1 -0
- package/dist/nips/nip-02.js +1 -0
- package/dist/nips/nip-02.js.map +1 -0
- package/dist/nips/nip-04.d.ts +1 -0
- package/dist/nips/nip-04.d.ts.map +1 -0
- package/dist/nips/nip-04.js +1 -0
- package/dist/nips/nip-04.js.map +1 -0
- package/dist/nips/nip-05.d.ts +1 -0
- package/dist/nips/nip-05.d.ts.map +1 -0
- package/dist/nips/nip-05.js +1 -0
- package/dist/nips/nip-05.js.map +1 -0
- package/dist/nips/nip-09.d.ts +1 -0
- package/dist/nips/nip-09.d.ts.map +1 -0
- package/dist/nips/nip-09.js +1 -0
- package/dist/nips/nip-09.js.map +1 -0
- package/dist/nips/nip-11.d.ts +1 -0
- package/dist/nips/nip-11.d.ts.map +1 -0
- package/dist/nips/nip-11.js +1 -0
- package/dist/nips/nip-11.js.map +1 -0
- package/dist/nips/nip-13.d.ts +1 -0
- package/dist/nips/nip-13.d.ts.map +1 -0
- package/dist/nips/nip-13.js +1 -0
- package/dist/nips/nip-13.js.map +1 -0
- package/dist/nips/nip-15.d.ts +1 -0
- package/dist/nips/nip-15.d.ts.map +1 -0
- package/dist/nips/nip-15.js +1 -0
- package/dist/nips/nip-15.js.map +1 -0
- package/dist/nips/nip-16.d.ts +1 -0
- package/dist/nips/nip-16.d.ts.map +1 -0
- package/dist/nips/nip-16.js +1 -0
- package/dist/nips/nip-16.js.map +1 -0
- package/dist/nips/nip-19.d.ts +1 -0
- package/dist/nips/nip-19.d.ts.map +1 -0
- package/dist/nips/nip-19.js +1 -0
- package/dist/nips/nip-19.js.map +1 -0
- package/dist/nips/nip-20.d.ts +1 -0
- package/dist/nips/nip-20.d.ts.map +1 -0
- package/dist/nips/nip-20.js +1 -0
- package/dist/nips/nip-20.js.map +1 -0
- package/dist/nips/nip-22.d.ts +1 -0
- package/dist/nips/nip-22.d.ts.map +1 -0
- package/dist/nips/nip-22.js +1 -0
- package/dist/nips/nip-22.js.map +1 -0
- package/dist/nips/nip-26.d.ts +1 -0
- package/dist/nips/nip-26.d.ts.map +1 -0
- package/dist/nips/nip-26.js +1 -0
- package/dist/nips/nip-26.js.map +1 -0
- package/dist/nips/nip-28.d.ts +1 -0
- package/dist/nips/nip-28.d.ts.map +1 -0
- package/dist/nips/nip-28.js +1 -0
- package/dist/nips/nip-28.js.map +1 -0
- package/dist/nips/nip-33.d.ts +1 -0
- package/dist/nips/nip-33.d.ts.map +1 -0
- package/dist/nips/nip-33.js +1 -0
- package/dist/nips/nip-33.js.map +1 -0
- package/dist/transport/base.d.ts +1 -1
- package/dist/transport/base.d.ts.map +1 -0
- package/dist/transport/base.js +1 -0
- package/dist/transport/base.js.map +1 -0
- package/dist/transport/websocket.d.ts +1 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +1 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types/events.d.ts +1 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +1 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/filters.d.ts +1 -0
- package/dist/types/filters.d.ts.map +1 -0
- package/dist/types/filters.js +1 -0
- package/dist/types/filters.js.map +1 -0
- package/dist/types/handlers.d.ts +1 -0
- package/dist/types/handlers.d.ts.map +1 -0
- package/dist/types/handlers.js +1 -0
- package/dist/types/handlers.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logger.d.ts +1 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/logger.js +1 -0
- package/dist/types/logger.js.map +1 -0
- package/dist/types/messages.d.ts +1 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +1 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/nostr.d.ts +1 -0
- package/dist/types/nostr.d.ts.map +1 -0
- package/dist/types/nostr.js +1 -0
- package/dist/types/nostr.js.map +1 -0
- package/dist/types/options.d.ts +1 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +1 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/priority.d.ts +1 -0
- package/dist/types/priority.d.ts.map +1 -0
- package/dist/types/priority.js +1 -0
- package/dist/types/priority.js.map +1 -0
- package/dist/types/relays.d.ts +1 -0
- package/dist/types/relays.d.ts.map +1 -0
- package/dist/types/relays.js +1 -0
- package/dist/types/relays.js.map +1 -0
- package/dist/types/scoring.d.ts +1 -2
- package/dist/types/scoring.d.ts.map +1 -0
- package/dist/types/scoring.js +1 -0
- package/dist/types/scoring.js.map +1 -0
- package/dist/types/socket.d.ts +1 -2
- package/dist/types/socket.d.ts.map +1 -0
- package/dist/types/socket.js +1 -0
- package/dist/types/socket.js.map +1 -0
- package/dist/types/transport.d.ts +1 -0
- package/dist/types/transport.d.ts.map +1 -0
- package/dist/types/transport.js +1 -0
- package/dist/types/transport.js.map +1 -0
- package/dist/types/validation.d.ts +1 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +1 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/types/websocket.d.ts +1 -0
- package/dist/types/websocket.d.ts.map +1 -0
- package/dist/types/websocket.js +1 -0
- package/dist/types/websocket.js.map +1 -0
- package/dist/utils/http.d.ts +1 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +1 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metrics.d.ts +1 -1
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +1 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +1 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +1 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/package.json +14 -2
- package/dist/__mocks__/logger.d.ts +0 -9
- package/dist/__mocks__/logger.js +0 -6
- package/dist/client.d.ts +0 -129
- package/dist/client.js +0 -259
- package/dist/crypto/schnorr.d.ts +0 -16
- package/dist/crypto/schnorr.js +0 -51
- package/dist/nostr-server.js +0 -107
- package/dist/server.d.ts +0 -27
- package/dist/server.js +0 -132
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file NIP-11: Relay Information Document
|
|
3
|
+
* @module nips/nip-11
|
|
4
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/11.md
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Relay information document structure
|
|
8
|
+
*/
|
|
9
|
+
export interface RelayInformation {
|
|
10
|
+
name?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
pubkey?: string;
|
|
13
|
+
contact?: string;
|
|
14
|
+
supported_nips?: number[];
|
|
15
|
+
software?: string;
|
|
16
|
+
version?: string;
|
|
17
|
+
limitation?: {
|
|
18
|
+
max_message_length?: number;
|
|
19
|
+
max_subscriptions?: number;
|
|
20
|
+
max_filters?: number;
|
|
21
|
+
max_limit?: number;
|
|
22
|
+
max_subid_length?: number;
|
|
23
|
+
min_prefix?: number;
|
|
24
|
+
max_event_tags?: number;
|
|
25
|
+
max_content_length?: number;
|
|
26
|
+
min_pow_difficulty?: number;
|
|
27
|
+
auth_required?: boolean;
|
|
28
|
+
payment_required?: boolean;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fetches relay information document
|
|
33
|
+
* @param url - Relay URL (ws:// or wss://)
|
|
34
|
+
* @returns {Promise<RelayInformation>} Relay information
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRelayInformation(url: string): Promise<RelayInformation>;
|
|
37
|
+
/**
|
|
38
|
+
* Checks if relay meets requirements
|
|
39
|
+
* @param relay - Relay information
|
|
40
|
+
* @param requirements - Required relay features
|
|
41
|
+
* @returns {boolean} True if relay meets all requirements
|
|
42
|
+
*/
|
|
43
|
+
export declare function checkRelayRequirements(relay: RelayInformation, requirements: Partial<RelayInformation>): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Validates relay capabilities against required features
|
|
46
|
+
* @param info - Relay information
|
|
47
|
+
* @param requiredNips - Required NIPs
|
|
48
|
+
* @param requiredFeatures - Required relay features
|
|
49
|
+
* @returns {boolean} True if relay supports all required features
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateRelayCapabilities(info: RelayInformation, requiredNips?: number[], requiredFeatures?: Partial<RelayInformation['limitation']>): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Creates a relay selection score based on capabilities
|
|
54
|
+
* @param info - Relay information
|
|
55
|
+
* @param preferences - Scoring preferences
|
|
56
|
+
* @returns {number} Relay score (higher is better)
|
|
57
|
+
*/
|
|
58
|
+
export declare function scoreRelayCapabilities(info: RelayInformation, preferences?: {
|
|
59
|
+
preferredNips?: number[];
|
|
60
|
+
minMessageLength?: number;
|
|
61
|
+
minSubscriptions?: number;
|
|
62
|
+
requireAuth?: boolean;
|
|
63
|
+
requirePayment?: boolean;
|
|
64
|
+
}): number;
|
|
65
|
+
//# sourceMappingURL=nip-11.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-11.d.ts","sourceRoot":"","sources":["../../../src/nips/nip-11.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE;QACX,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAUhF;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACtC,OAAO,CAqDT;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,EACtB,YAAY,GAAE,MAAM,EAAO,EAC3B,gBAAgB,GAAE,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAM,GAC7D,OAAO,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,EACtB,WAAW,GAAE;IACX,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,MAAM,CAoCR"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-11: Relay Information Document
|
|
4
|
+
* @module nips/nip-11
|
|
5
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/11.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.getRelayInformation = getRelayInformation;
|
|
9
|
+
exports.checkRelayRequirements = checkRelayRequirements;
|
|
10
|
+
exports.validateRelayCapabilities = validateRelayCapabilities;
|
|
11
|
+
exports.scoreRelayCapabilities = scoreRelayCapabilities;
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
const http_1 = require("../utils/http");
|
|
14
|
+
const logger = (0, logger_1.getLogger)('NIP-11');
|
|
15
|
+
/**
|
|
16
|
+
* Fetches relay information document
|
|
17
|
+
* @param url - Relay URL (ws:// or wss://)
|
|
18
|
+
* @returns {Promise<RelayInformation>} Relay information
|
|
19
|
+
*/
|
|
20
|
+
async function getRelayInformation(url) {
|
|
21
|
+
try {
|
|
22
|
+
const relayUrl = url.replace('ws://', 'http://').replace('wss://', 'https://');
|
|
23
|
+
const response = await (0, http_1.fetchJson)(`${relayUrl}/.well-known/nostr.json`);
|
|
24
|
+
return response;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
28
|
+
logger.error(`Failed to fetch relay information: ${errorMessage}`);
|
|
29
|
+
throw new Error(`Failed to fetch relay information: ${errorMessage}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Checks if relay meets requirements
|
|
34
|
+
* @param relay - Relay information
|
|
35
|
+
* @param requirements - Required relay features
|
|
36
|
+
* @returns {boolean} True if relay meets all requirements
|
|
37
|
+
*/
|
|
38
|
+
function checkRelayRequirements(relay, requirements) {
|
|
39
|
+
try {
|
|
40
|
+
// Check supported NIPs
|
|
41
|
+
if (requirements.supported_nips && relay.supported_nips) {
|
|
42
|
+
const missingNips = requirements.supported_nips.filter(nip => !relay.supported_nips?.includes(nip));
|
|
43
|
+
if (missingNips.length > 0) {
|
|
44
|
+
logger.debug(`Missing required NIPs: ${missingNips.join(', ')}`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check limitations
|
|
49
|
+
if (requirements.limitation && relay.limitation) {
|
|
50
|
+
for (const [key, value] of Object.entries(requirements.limitation)) {
|
|
51
|
+
const relayValue = relay.limitation[key];
|
|
52
|
+
// Skip if relay doesn't specify this limitation
|
|
53
|
+
if (relayValue === undefined)
|
|
54
|
+
continue;
|
|
55
|
+
// For maximum values, relay should support at least the required value
|
|
56
|
+
if (key.startsWith('max_') && typeof relayValue === 'number' && typeof value === 'number') {
|
|
57
|
+
if (relayValue < value) {
|
|
58
|
+
logger.debug(`Relay ${key} too low: ${relayValue} < ${value}`);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// For minimum values, relay should not require more than specified
|
|
63
|
+
if (key.startsWith('min_') && typeof relayValue === 'number' && typeof value === 'number') {
|
|
64
|
+
if (relayValue > value) {
|
|
65
|
+
logger.debug(`Relay ${key} too high: ${relayValue} > ${value}`);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// For boolean flags, values must match if specified
|
|
70
|
+
if (typeof relayValue === 'boolean' && typeof value === 'boolean') {
|
|
71
|
+
if (relayValue !== value) {
|
|
72
|
+
logger.debug(`Relay ${key} mismatch: ${relayValue} !== ${value}`);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
82
|
+
logger.error(`Error checking relay requirements: ${errorMessage}`);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Validates relay capabilities against required features
|
|
88
|
+
* @param info - Relay information
|
|
89
|
+
* @param requiredNips - Required NIPs
|
|
90
|
+
* @param requiredFeatures - Required relay features
|
|
91
|
+
* @returns {boolean} True if relay supports all required features
|
|
92
|
+
*/
|
|
93
|
+
function validateRelayCapabilities(info, requiredNips = [], requiredFeatures = {}) {
|
|
94
|
+
// Check NIP support
|
|
95
|
+
if (requiredNips.length > 0) {
|
|
96
|
+
if (!info.supported_nips)
|
|
97
|
+
return false;
|
|
98
|
+
if (!requiredNips.every(nip => info.supported_nips?.includes(nip))) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Check limitations
|
|
103
|
+
if (info.limitation) {
|
|
104
|
+
for (const [key, value] of Object.entries(requiredFeatures)) {
|
|
105
|
+
const relayValue = info.limitation[key];
|
|
106
|
+
if (relayValue === undefined)
|
|
107
|
+
return false;
|
|
108
|
+
// For maximum values, relay limit should be higher
|
|
109
|
+
if (key.startsWith('max_') && typeof relayValue === 'number' && typeof value === 'number') {
|
|
110
|
+
if (relayValue < value)
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// For minimum values, relay limit should be lower
|
|
114
|
+
if (key.startsWith('min_') && typeof relayValue === 'number' && typeof value === 'number') {
|
|
115
|
+
if (relayValue > value)
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
// For boolean flags, must match exactly
|
|
119
|
+
if (typeof relayValue === 'boolean' && typeof value === 'boolean') {
|
|
120
|
+
if (relayValue !== value)
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Creates a relay selection score based on capabilities
|
|
129
|
+
* @param info - Relay information
|
|
130
|
+
* @param preferences - Scoring preferences
|
|
131
|
+
* @returns {number} Relay score (higher is better)
|
|
132
|
+
*/
|
|
133
|
+
function scoreRelayCapabilities(info, preferences = {}) {
|
|
134
|
+
let score = 0;
|
|
135
|
+
// Score NIP support
|
|
136
|
+
if (info.supported_nips && preferences.preferredNips) {
|
|
137
|
+
score += preferences.preferredNips.filter(nip => info.supported_nips?.includes(nip)).length * 10;
|
|
138
|
+
}
|
|
139
|
+
// Score limitations
|
|
140
|
+
if (info.limitation) {
|
|
141
|
+
const limits = info.limitation;
|
|
142
|
+
// Message length
|
|
143
|
+
if (limits.max_message_length && preferences.minMessageLength) {
|
|
144
|
+
score += limits.max_message_length >= preferences.minMessageLength ? 5 : -5;
|
|
145
|
+
}
|
|
146
|
+
// Subscriptions
|
|
147
|
+
if (limits.max_subscriptions && preferences.minSubscriptions) {
|
|
148
|
+
score += limits.max_subscriptions >= preferences.minSubscriptions ? 5 : -5;
|
|
149
|
+
}
|
|
150
|
+
// Auth requirements
|
|
151
|
+
if (preferences.requireAuth !== undefined) {
|
|
152
|
+
score += (limits.auth_required === preferences.requireAuth) ? 5 : -10;
|
|
153
|
+
}
|
|
154
|
+
// Payment requirements
|
|
155
|
+
if (preferences.requirePayment !== undefined) {
|
|
156
|
+
score += (limits.payment_required === preferences.requirePayment) ? 5 : -10;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return score;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=nip-11.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-11.js","sourceRoot":"","sources":["../../../src/nips/nip-11.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file NIP-13: Proof of Work
|
|
3
|
+
* @module nips/nip-13
|
|
4
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/13.md
|
|
5
|
+
*/
|
|
6
|
+
import type { NostrWSMessage } from '../types/messages';
|
|
7
|
+
import type { Logger } from '../types/logger';
|
|
8
|
+
/**
|
|
9
|
+
* Calculates the number of leading zero bits in a hex string
|
|
10
|
+
* @param hex - Hex string to check
|
|
11
|
+
* @returns {number} Number of leading zero bits
|
|
12
|
+
*/
|
|
13
|
+
export declare function countLeadingZeroBits(hex: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Calculates event ID with proof of work
|
|
16
|
+
* @param event - Event object without ID
|
|
17
|
+
* @param targetDifficulty - Target number of leading zero bits
|
|
18
|
+
* @param maxAttempts - Maximum number of attempts
|
|
19
|
+
* @returns {Promise<string>} Event ID with sufficient proof of work
|
|
20
|
+
*/
|
|
21
|
+
export declare function calculatePowEventId(event: Record<string, unknown>, targetDifficulty: number, maxAttempts?: number): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Validates proof of work for an event
|
|
24
|
+
* @param message - Message containing event
|
|
25
|
+
* @param minDifficulty - Minimum required difficulty
|
|
26
|
+
* @param logger - Logger instance
|
|
27
|
+
* @returns {boolean} True if proof of work is valid
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateEventPoW(message: NostrWSMessage, minDifficulty: number, logger: Logger): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Dynamic difficulty calculator based on event type and content
|
|
32
|
+
*/
|
|
33
|
+
export interface DifficultyCalculator {
|
|
34
|
+
/**
|
|
35
|
+
* Calculates required difficulty for an event
|
|
36
|
+
* @param event - Event to check
|
|
37
|
+
* @returns {number} Required number of leading zero bits
|
|
38
|
+
*/
|
|
39
|
+
calculateRequiredDifficulty(event: Record<string, unknown>): number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Creates a default difficulty calculator
|
|
43
|
+
* @param baseDifficulty - Base difficulty for all events
|
|
44
|
+
* @param contentMultiplier - Multiplier based on content length
|
|
45
|
+
* @returns {DifficultyCalculator} Difficulty calculator
|
|
46
|
+
*/
|
|
47
|
+
export declare function createDifficultyCalculator(baseDifficulty?: number, contentMultiplier?: number): DifficultyCalculator;
|
|
48
|
+
/**
|
|
49
|
+
* Rate limiter interface for proof of work
|
|
50
|
+
*/
|
|
51
|
+
export interface PowRateLimiter {
|
|
52
|
+
/**
|
|
53
|
+
* Checks if an event should be rate limited
|
|
54
|
+
* @param pubkey - Publisher's public key
|
|
55
|
+
* @param currentTime - Current timestamp
|
|
56
|
+
* @returns {boolean} True if should be rate limited
|
|
57
|
+
*/
|
|
58
|
+
shouldRateLimit(pubkey: string, currentTime: number): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Records an event for rate limiting
|
|
61
|
+
* @param pubkey - Publisher's public key
|
|
62
|
+
* @param difficulty - Event difficulty
|
|
63
|
+
* @param currentTime - Current timestamp
|
|
64
|
+
*/
|
|
65
|
+
recordEvent(pubkey: string, difficulty: number, currentTime: number): void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates a default PoW rate limiter
|
|
69
|
+
* @param windowSeconds - Time window for rate limiting
|
|
70
|
+
* @param maxDifficulty - Maximum cumulative difficulty per window
|
|
71
|
+
* @returns {PowRateLimiter} Rate limiter
|
|
72
|
+
*/
|
|
73
|
+
export declare function createPowRateLimiter(windowSeconds?: number, maxDifficulty?: number): PowRateLimiter;
|
|
74
|
+
//# sourceMappingURL=nip-13.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-13.d.ts","sourceRoot":"","sources":["../../../src/nips/nip-13.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYxD;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,gBAAgB,EAAE,MAAM,EACxB,WAAW,GAAE,MAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAmBT;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;CACrE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,GAAE,MAAU,EAC1B,iBAAiB,GAAE,MAAc,GAChC,oBAAoB,CAmBtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAE9D;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,GAAE,MAAa,EAC5B,aAAa,GAAE,MAAY,GAC1B,cAAc,CA2BhB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-13: Proof of Work
|
|
4
|
+
* @module nips/nip-13
|
|
5
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/13.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.countLeadingZeroBits = countLeadingZeroBits;
|
|
9
|
+
exports.calculatePowEventId = calculatePowEventId;
|
|
10
|
+
exports.validateEventPoW = validateEventPoW;
|
|
11
|
+
exports.createDifficultyCalculator = createDifficultyCalculator;
|
|
12
|
+
exports.createPowRateLimiter = createPowRateLimiter;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
/**
|
|
15
|
+
* Calculates the number of leading zero bits in a hex string
|
|
16
|
+
* @param hex - Hex string to check
|
|
17
|
+
* @returns {number} Number of leading zero bits
|
|
18
|
+
*/
|
|
19
|
+
function countLeadingZeroBits(hex) {
|
|
20
|
+
let count = 0;
|
|
21
|
+
for (const char of hex) {
|
|
22
|
+
const nibble = parseInt(char, 16);
|
|
23
|
+
if (nibble === 0) {
|
|
24
|
+
count += 4;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
count += Math.clz32(nibble) - 28;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return count;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculates event ID with proof of work
|
|
35
|
+
* @param event - Event object without ID
|
|
36
|
+
* @param targetDifficulty - Target number of leading zero bits
|
|
37
|
+
* @param maxAttempts - Maximum number of attempts
|
|
38
|
+
* @returns {Promise<string>} Event ID with sufficient proof of work
|
|
39
|
+
*/
|
|
40
|
+
async function calculatePowEventId(event, targetDifficulty, maxAttempts = 1000000) {
|
|
41
|
+
let nonce = 0;
|
|
42
|
+
const eventCopy = { ...event };
|
|
43
|
+
while (nonce < maxAttempts) {
|
|
44
|
+
eventCopy.nonce = nonce.toString();
|
|
45
|
+
const serialized = JSON.stringify([
|
|
46
|
+
0,
|
|
47
|
+
eventCopy.pubkey,
|
|
48
|
+
eventCopy.created_at,
|
|
49
|
+
eventCopy.kind,
|
|
50
|
+
eventCopy.tags,
|
|
51
|
+
eventCopy.content,
|
|
52
|
+
eventCopy.nonce
|
|
53
|
+
]);
|
|
54
|
+
const hash = (0, crypto_1.createHash)('sha256').update(serialized).digest('hex');
|
|
55
|
+
const difficulty = countLeadingZeroBits(hash);
|
|
56
|
+
if (difficulty >= targetDifficulty) {
|
|
57
|
+
return hash;
|
|
58
|
+
}
|
|
59
|
+
nonce++;
|
|
60
|
+
}
|
|
61
|
+
throw new Error('Failed to find proof of work within maximum attempts');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validates proof of work for an event
|
|
65
|
+
* @param message - Message containing event
|
|
66
|
+
* @param minDifficulty - Minimum required difficulty
|
|
67
|
+
* @param logger - Logger instance
|
|
68
|
+
* @returns {boolean} True if proof of work is valid
|
|
69
|
+
*/
|
|
70
|
+
function validateEventPoW(message, minDifficulty, logger) {
|
|
71
|
+
try {
|
|
72
|
+
if (!Array.isArray(message) || message[0] !== 'EVENT') {
|
|
73
|
+
return true; // Not an event message
|
|
74
|
+
}
|
|
75
|
+
const event = message[1];
|
|
76
|
+
if (!event.id || typeof event.id !== 'string') {
|
|
77
|
+
logger.debug('Missing event ID');
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Calculate difficulty
|
|
81
|
+
const difficulty = countLeadingZeroBits(event.id);
|
|
82
|
+
return difficulty >= minDifficulty;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger.error('Error validating proof of work:', error);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates a default difficulty calculator
|
|
91
|
+
* @param baseDifficulty - Base difficulty for all events
|
|
92
|
+
* @param contentMultiplier - Multiplier based on content length
|
|
93
|
+
* @returns {DifficultyCalculator} Difficulty calculator
|
|
94
|
+
*/
|
|
95
|
+
function createDifficultyCalculator(baseDifficulty = 8, contentMultiplier = 0.001) {
|
|
96
|
+
return {
|
|
97
|
+
calculateRequiredDifficulty(event) {
|
|
98
|
+
let difficulty = baseDifficulty;
|
|
99
|
+
// Increase difficulty for larger content
|
|
100
|
+
if (typeof event.content === 'string') {
|
|
101
|
+
difficulty += Math.floor(event.content.length * contentMultiplier);
|
|
102
|
+
}
|
|
103
|
+
// Increase difficulty for certain event kinds
|
|
104
|
+
const kind = event.kind;
|
|
105
|
+
if (kind >= 1000) {
|
|
106
|
+
difficulty += 4; // Higher difficulty for application-specific events
|
|
107
|
+
}
|
|
108
|
+
return difficulty;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Creates a default PoW rate limiter
|
|
114
|
+
* @param windowSeconds - Time window for rate limiting
|
|
115
|
+
* @param maxDifficulty - Maximum cumulative difficulty per window
|
|
116
|
+
* @returns {PowRateLimiter} Rate limiter
|
|
117
|
+
*/
|
|
118
|
+
function createPowRateLimiter(windowSeconds = 3600, maxDifficulty = 100) {
|
|
119
|
+
const difficulties = new Map();
|
|
120
|
+
return {
|
|
121
|
+
shouldRateLimit(pubkey, currentTime) {
|
|
122
|
+
const events = difficulties.get(pubkey) || [];
|
|
123
|
+
// Remove old events
|
|
124
|
+
const validEvents = events.filter(([time]) => currentTime - time < windowSeconds);
|
|
125
|
+
// Calculate cumulative difficulty
|
|
126
|
+
const totalDifficulty = validEvents.reduce((sum, [, diff]) => sum + diff, 0);
|
|
127
|
+
return totalDifficulty >= maxDifficulty;
|
|
128
|
+
},
|
|
129
|
+
recordEvent(pubkey, difficulty, currentTime) {
|
|
130
|
+
const events = difficulties.get(pubkey) || [];
|
|
131
|
+
events.push([currentTime, difficulty]);
|
|
132
|
+
difficulties.set(pubkey, events);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=nip-13.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-13.js","sourceRoot":"","sources":["../../../src/nips/nip-13.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file NIP-15: End of Stored Events Notice
|
|
3
|
+
* @module nips/nip-15
|
|
4
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/15.md
|
|
5
|
+
*/
|
|
6
|
+
import type { NostrWSMessage } from '../types/messages';
|
|
7
|
+
import type { Logger } from '../types/logger';
|
|
8
|
+
/**
|
|
9
|
+
* Creates an EOSE (End of Stored Events) message
|
|
10
|
+
* @param subscriptionId - Subscription ID
|
|
11
|
+
* @returns {NostrWSMessage} EOSE message
|
|
12
|
+
*/
|
|
13
|
+
export declare function createEOSEMessage(subscriptionId: string): NostrWSMessage;
|
|
14
|
+
/**
|
|
15
|
+
* Subscription state manager interface
|
|
16
|
+
*/
|
|
17
|
+
export interface SubscriptionStateManager {
|
|
18
|
+
/**
|
|
19
|
+
* Registers a new subscription
|
|
20
|
+
* @param subscriptionId - Subscription ID
|
|
21
|
+
* @param filter - Subscription filter
|
|
22
|
+
*/
|
|
23
|
+
registerSubscription(subscriptionId: string, filter: Record<string, unknown>): void;
|
|
24
|
+
/**
|
|
25
|
+
* Marks a subscription as complete (EOSE sent)
|
|
26
|
+
* @param subscriptionId - Subscription ID
|
|
27
|
+
*/
|
|
28
|
+
markComplete(subscriptionId: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a subscription is complete
|
|
31
|
+
* @param subscriptionId - Subscription ID
|
|
32
|
+
* @returns {boolean} True if EOSE has been sent
|
|
33
|
+
*/
|
|
34
|
+
isComplete(subscriptionId: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Gets subscription filter
|
|
37
|
+
* @param subscriptionId - Subscription ID
|
|
38
|
+
* @returns {Record<string, unknown> | undefined} Subscription filter
|
|
39
|
+
*/
|
|
40
|
+
getFilter(subscriptionId: string): Record<string, unknown> | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Removes a subscription
|
|
43
|
+
* @param subscriptionId - Subscription ID
|
|
44
|
+
*/
|
|
45
|
+
removeSubscription(subscriptionId: string): void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates a subscription state manager
|
|
49
|
+
* @param logger - Logger instance
|
|
50
|
+
* @returns {SubscriptionStateManager} Subscription state manager
|
|
51
|
+
*/
|
|
52
|
+
export declare function createSubscriptionStateManager(logger: Logger): SubscriptionStateManager;
|
|
53
|
+
/**
|
|
54
|
+
* Pagination handler interface
|
|
55
|
+
*/
|
|
56
|
+
export interface PaginationHandler {
|
|
57
|
+
/**
|
|
58
|
+
* Gets next page of events
|
|
59
|
+
* @param subscriptionId - Subscription ID
|
|
60
|
+
* @param pageSize - Number of events per page
|
|
61
|
+
* @returns {Promise<NostrWSMessage[]>} Next page of events
|
|
62
|
+
*/
|
|
63
|
+
getNextPage(subscriptionId: string, pageSize: number): Promise<NostrWSMessage[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Checks if more events are available
|
|
66
|
+
* @param subscriptionId - Subscription ID
|
|
67
|
+
* @returns {boolean} True if more events exist
|
|
68
|
+
*/
|
|
69
|
+
hasMoreEvents(subscriptionId: string): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Updates pagination state with new events
|
|
72
|
+
* @param subscriptionId - Subscription ID
|
|
73
|
+
* @param events - New events
|
|
74
|
+
*/
|
|
75
|
+
updateState(subscriptionId: string, events: NostrWSMessage[]): void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Creates a pagination handler
|
|
79
|
+
* @param stateManager - Subscription state manager
|
|
80
|
+
* @param logger - Logger instance
|
|
81
|
+
* @returns {PaginationHandler} Pagination handler
|
|
82
|
+
*/
|
|
83
|
+
export declare function createPaginationHandler(stateManager: SubscriptionStateManager, logger: Logger): PaginationHandler;
|
|
84
|
+
//# sourceMappingURL=nip-15.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-15.d.ts","sourceRoot":"","sources":["../../../src/nips/nip-15.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,cAAc,CAExE;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,oBAAoB,CAClB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAAC;IAER;;;OAGG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3C;;;;OAIG;IACH,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IAE5C;;;;OAIG;IACH,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAEvE;;;OAGG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAClD;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,GACb,wBAAwB,CA0C1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,WAAW,CACT,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE7B;;;;OAIG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/C;;;;OAIG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;CACrE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,wBAAwB,EACtC,MAAM,EAAE,MAAM,GACb,iBAAiB,CAuDnB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-15: End of Stored Events Notice
|
|
4
|
+
* @module nips/nip-15
|
|
5
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/15.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createEOSEMessage = createEOSEMessage;
|
|
9
|
+
exports.createSubscriptionStateManager = createSubscriptionStateManager;
|
|
10
|
+
exports.createPaginationHandler = createPaginationHandler;
|
|
11
|
+
/**
|
|
12
|
+
* Creates an EOSE (End of Stored Events) message
|
|
13
|
+
* @param subscriptionId - Subscription ID
|
|
14
|
+
* @returns {NostrWSMessage} EOSE message
|
|
15
|
+
*/
|
|
16
|
+
function createEOSEMessage(subscriptionId) {
|
|
17
|
+
return ['EOSE', subscriptionId];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a subscription state manager
|
|
21
|
+
* @param logger - Logger instance
|
|
22
|
+
* @returns {SubscriptionStateManager} Subscription state manager
|
|
23
|
+
*/
|
|
24
|
+
function createSubscriptionStateManager(logger) {
|
|
25
|
+
const subscriptions = new Map();
|
|
26
|
+
return {
|
|
27
|
+
registerSubscription(subscriptionId, filter) {
|
|
28
|
+
subscriptions.set(subscriptionId, {
|
|
29
|
+
filter,
|
|
30
|
+
complete: false,
|
|
31
|
+
timestamp: Date.now()
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
markComplete(subscriptionId) {
|
|
35
|
+
const state = subscriptions.get(subscriptionId);
|
|
36
|
+
if (state) {
|
|
37
|
+
state.complete = true;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
logger.debug(`Attempting to mark unknown subscription ${subscriptionId} as complete`);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
isComplete(subscriptionId) {
|
|
44
|
+
return subscriptions.get(subscriptionId)?.complete || false;
|
|
45
|
+
},
|
|
46
|
+
getFilter(subscriptionId) {
|
|
47
|
+
return subscriptions.get(subscriptionId)?.filter;
|
|
48
|
+
},
|
|
49
|
+
removeSubscription(subscriptionId) {
|
|
50
|
+
subscriptions.delete(subscriptionId);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Creates a pagination handler
|
|
56
|
+
* @param stateManager - Subscription state manager
|
|
57
|
+
* @param logger - Logger instance
|
|
58
|
+
* @returns {PaginationHandler} Pagination handler
|
|
59
|
+
*/
|
|
60
|
+
function createPaginationHandler(stateManager, logger) {
|
|
61
|
+
const paginationStates = new Map();
|
|
62
|
+
return {
|
|
63
|
+
async getNextPage(subscriptionId, pageSize) {
|
|
64
|
+
const state = paginationStates.get(subscriptionId);
|
|
65
|
+
if (!state) {
|
|
66
|
+
logger.debug(`No pagination state for subscription ${subscriptionId}`);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
const start = state.currentIndex;
|
|
70
|
+
const end = Math.min(start + pageSize, state.events.length);
|
|
71
|
+
state.currentIndex = end;
|
|
72
|
+
state.hasMore = end < state.events.length;
|
|
73
|
+
// If this is the last page, send EOSE
|
|
74
|
+
if (!state.hasMore && !stateManager.isComplete(subscriptionId)) {
|
|
75
|
+
stateManager.markComplete(subscriptionId);
|
|
76
|
+
return [
|
|
77
|
+
...state.events.slice(start, end),
|
|
78
|
+
createEOSEMessage(subscriptionId)
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
return state.events.slice(start, end);
|
|
82
|
+
},
|
|
83
|
+
hasMoreEvents(subscriptionId) {
|
|
84
|
+
return paginationStates.get(subscriptionId)?.hasMore || false;
|
|
85
|
+
},
|
|
86
|
+
updateState(subscriptionId, events) {
|
|
87
|
+
const existing = paginationStates.get(subscriptionId);
|
|
88
|
+
if (existing) {
|
|
89
|
+
existing.events.push(...events);
|
|
90
|
+
existing.hasMore = true;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
paginationStates.set(subscriptionId, {
|
|
94
|
+
events,
|
|
95
|
+
currentIndex: 0,
|
|
96
|
+
hasMore: true
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=nip-15.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-15.js","sourceRoot":"","sources":["../../../src/nips/nip-15.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,8CAEC;AAgDD,wEA4CC;AAsCD,0DA0DC;AAnMD;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,cAAsB;IACtD,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAClC,CAAC;AA2CD;;;;GAIG;AACH,SAAgB,8BAA8B,CAC5C,MAAc;IAQd,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE3D,OAAO;QACL,oBAAoB,CAClB,cAAsB,EACtB,MAA+B;YAE/B,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE;gBAChC,MAAM;gBACN,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;QAED,YAAY,CAAC,cAAsB;YACjC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,2CAA2C,cAAc,cAAc,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAED,UAAU,CAAC,cAAsB;YAC/B,OAAO,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,IAAI,KAAK,CAAC;QAC9D,CAAC;QAED,SAAS,CAAC,cAAsB;YAC9B,OAAO,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACnD,CAAC;QAED,kBAAkB,CAAC,cAAsB;YACvC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC;AAgCD;;;;;GAKG;AACH,SAAgB,uBAAuB,CACrC,YAAsC,EACtC,MAAc;IAQd,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE5D,OAAO;QACL,KAAK,CAAC,WAAW,CACf,cAAsB,EACtB,QAAgB;YAEhB,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,wCAAwC,cAAc,EAAE,CAAC,CAAC;gBACvE,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5D,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;YACzB,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAE1C,sCAAsC;YACtC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC/D,YAAY,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC1C,OAAO;oBACL,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;oBACjC,iBAAiB,CAAC,cAAc,CAAC;iBAClC,CAAC;YACJ,CAAC;YAED,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,aAAa,CAAC,cAAsB;YAClC,OAAO,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC;QAChE,CAAC;QAED,WAAW,CAAC,cAAsB,EAAE,MAAwB;YAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;gBAChC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,GAAG,CAAC,cAAc,EAAE;oBACnC,MAAM;oBACN,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|