nostr-websocket-utils 0.3.0 → 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/README.md +8 -7
- package/dist/__mocks__/extendedWsMock.d.ts +31 -14
- package/dist/__mocks__/extendedWsMock.d.ts.map +1 -0
- package/dist/__mocks__/extendedWsMock.js +7 -6
- 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 +21 -80
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +110 -316
- 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 +22 -45
- package/dist/core/queue.d.ts.map +1 -0
- package/dist/core/queue.js +72 -79
- package/dist/core/queue.js.map +1 -0
- package/dist/core/server.d.ts +2 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +29 -13
- 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 +8 -0
- package/dist/crypto/handlers.d.ts.map +1 -0
- package/dist/crypto/handlers.js +27 -2
- 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 +4 -3
- package/dist/nips/nip-01.d.ts.map +1 -0
- package/dist/nips/nip-01.js +18 -29
- package/dist/nips/nip-01.js.map +1 -0
- package/dist/nips/nip-02.d.ts +2 -2
- package/dist/nips/nip-02.d.ts.map +1 -0
- package/dist/nips/nip-02.js +14 -25
- 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 +16 -23
- package/dist/nips/nip-04.js.map +1 -0
- package/dist/nips/nip-05.d.ts +4 -2
- 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 +2 -1
- package/dist/nips/nip-09.d.ts.map +1 -0
- package/dist/nips/nip-09.js +7 -25
- 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 +3 -2
- 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 +2 -6
- 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 +3 -2
- 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 +2 -1
- package/dist/nips/nip-20.d.ts.map +1 -0
- package/dist/nips/nip-20.js +20 -20
- 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 +4 -3
- 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 +17 -31
- 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 +7 -12
- package/dist/nips/nip-33.js.map +1 -0
- package/dist/transport/base.d.ts +4 -4
- 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 +2 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +7 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types/events.d.ts +12 -1
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -1
- 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 +13 -6
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -3
- 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 +68 -70
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +28 -26
- package/dist/types/messages.js.map +1 -0
- package/dist/types/nostr.d.ts +3 -2
- 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 +13 -0
- package/dist/types/priority.d.ts.map +1 -0
- package/dist/types/priority.js +14 -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 +19 -7
- package/dist/types/scoring.d.ts.map +1 -0
- package/dist/types/scoring.js +2 -1
- 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 +116 -38
- package/dist/types/websocket.d.ts.map +1 -0
- package/dist/types/websocket.js +2 -1
- 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 +17 -2
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +24 -10
- 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 +6 -4
- 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,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-09: Event Deletion
|
|
4
|
+
* @module nips/nip-09
|
|
5
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/09.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.EVENT_DELETION_KIND = void 0;
|
|
9
|
+
exports.createDeletionEvent = createDeletionEvent;
|
|
10
|
+
exports.validateDeletionEvent = validateDeletionEvent;
|
|
11
|
+
exports.processDeletionEvent = processDeletionEvent;
|
|
12
|
+
exports.createEventDeletionManager = createEventDeletionManager;
|
|
13
|
+
exports.createDeletionSubscriptionManager = createDeletionSubscriptionManager;
|
|
14
|
+
/**
|
|
15
|
+
* Event deletion kind
|
|
16
|
+
*/
|
|
17
|
+
exports.EVENT_DELETION_KIND = 5;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a deletion event
|
|
20
|
+
*/
|
|
21
|
+
function createDeletionEvent(eventIds, reason) {
|
|
22
|
+
return {
|
|
23
|
+
kind: exports.EVENT_DELETION_KIND,
|
|
24
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
25
|
+
tags: eventIds.map(id => ['e', id]),
|
|
26
|
+
content: reason || '',
|
|
27
|
+
pubkey: '', // To be filled by the caller
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validates a deletion event
|
|
32
|
+
*/
|
|
33
|
+
async function validateDeletionEvent(event, _logger) {
|
|
34
|
+
try {
|
|
35
|
+
// Must be kind 5
|
|
36
|
+
if (event.kind !== exports.EVENT_DELETION_KIND) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
// Must have at least one e tag
|
|
40
|
+
const eventIds = event.tags
|
|
41
|
+
.filter((tag) => Array.isArray(tag) && tag[0] === 'e' && typeof tag[1] === 'string')
|
|
42
|
+
.map(tag => tag[1]);
|
|
43
|
+
if (eventIds.length === 0) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
// Validate each event ID format
|
|
47
|
+
const validHexString = /^[0-9a-f]{64}$/;
|
|
48
|
+
const invalidIds = eventIds.filter(id => !validHexString.test(id));
|
|
49
|
+
if (invalidIds.length > 0) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Processes a deletion event
|
|
60
|
+
*/
|
|
61
|
+
async function processDeletionEvent(event, _logger, deleteEvent) {
|
|
62
|
+
try {
|
|
63
|
+
if (!validateDeletionEvent(event, _logger)) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: 'Invalid deletion event'
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const eventIds = event.tags
|
|
70
|
+
.filter((tag) => tag[0] === 'e')
|
|
71
|
+
.map(tag => tag[1]);
|
|
72
|
+
const deletedIds = [];
|
|
73
|
+
const failedIds = [];
|
|
74
|
+
for (const eventId of eventIds) {
|
|
75
|
+
try {
|
|
76
|
+
const success = await deleteEvent(eventId);
|
|
77
|
+
if (success) {
|
|
78
|
+
deletedIds.push(eventId);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
failedIds.push(eventId);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
failedIds.push(eventId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (failedIds.length > 0) {
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
error: `Failed to delete events: ${failedIds.join(', ')}`,
|
|
92
|
+
deletedIds
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
deletedIds
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return {
|
|
102
|
+
success: false,
|
|
103
|
+
error: 'Unknown error'
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Creates an event deletion manager
|
|
109
|
+
* @param _logger - Logger instance
|
|
110
|
+
* @returns {EventDeletionManager} Deletion manager
|
|
111
|
+
*/
|
|
112
|
+
function createEventDeletionManager(_logger) {
|
|
113
|
+
// Map of deleted event IDs to deletion reasons
|
|
114
|
+
const deletedEvents = new Map();
|
|
115
|
+
// Map of deleted event IDs to deletion event IDs
|
|
116
|
+
const deletionEvents = new Map();
|
|
117
|
+
return {
|
|
118
|
+
async processDeletion(message) {
|
|
119
|
+
try {
|
|
120
|
+
if (!validateDeletionEvent(message, _logger)) {
|
|
121
|
+
throw new Error('Invalid deletion event');
|
|
122
|
+
}
|
|
123
|
+
const eventIds = message.tags
|
|
124
|
+
.filter(tag => tag[0] === 'e')
|
|
125
|
+
.map(tag => tag[1]);
|
|
126
|
+
const { content: reason, id: deletionId } = message;
|
|
127
|
+
// Process each event ID
|
|
128
|
+
eventIds.forEach(eventId => {
|
|
129
|
+
// Only delete if not already deleted or if this deletion is newer
|
|
130
|
+
const existingDeletionId = deletionEvents.get(eventId);
|
|
131
|
+
if (!existingDeletionId || deletionId > existingDeletionId) {
|
|
132
|
+
deletedEvents.set(eventId, reason);
|
|
133
|
+
deletionEvents.set(eventId, deletionId);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return eventIds;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
isDeleted(eventId) {
|
|
143
|
+
return deletedEvents.has(eventId);
|
|
144
|
+
},
|
|
145
|
+
getDeletionReason(eventId) {
|
|
146
|
+
return deletedEvents.get(eventId);
|
|
147
|
+
},
|
|
148
|
+
getDeletedEvents() {
|
|
149
|
+
return new Map(deletedEvents);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Creates a deletion subscription manager
|
|
155
|
+
* @param _logger - Logger instance
|
|
156
|
+
* @returns {DeletionSubscriptionManager} Subscription manager
|
|
157
|
+
*/
|
|
158
|
+
function createDeletionSubscriptionManager(_logger) {
|
|
159
|
+
return {
|
|
160
|
+
subscribeToDeletions(eventIds) {
|
|
161
|
+
return {
|
|
162
|
+
subscriptionId: `deletion_${eventIds.join('_')}`,
|
|
163
|
+
filters: [{
|
|
164
|
+
kinds: [exports.EVENT_DELETION_KIND],
|
|
165
|
+
'#e': eventIds
|
|
166
|
+
}]
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
subscribeToUserDeletions(pubkey) {
|
|
170
|
+
return {
|
|
171
|
+
subscriptionId: `user_deletion_${pubkey}`,
|
|
172
|
+
filters: [{
|
|
173
|
+
kinds: [exports.EVENT_DELETION_KIND],
|
|
174
|
+
authors: [pubkey]
|
|
175
|
+
}]
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=nip-09.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-09.js","sourceRoot":"","sources":["../../../src/nips/nip-09.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAyBH,kDAWC;AAKD,sDAgCC;AAKD,oDAoDC;AAuCD,gEAkDC;AA0BD,8EAwBC;AA5PD;;GAEG;AACU,QAAA,mBAAmB,GAAG,CAAC,CAAC;AAErC;;GAEG;AACH,SAAgB,mBAAmB,CACjC,QAAkB,EAClB,MAAe;IAEf,OAAO;QACL,IAAI,EAAE,2BAAmB;QACzB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACzC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,IAAI,EAAE;QACrB,MAAM,EAAE,EAAE,EAAE,6BAA6B;KAC1C,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,qBAAqB,CACzC,KAAiB,EACjB,OAAY;IAEZ,IAAI,CAAC;QACH,iBAAiB;QACjB,IAAI,KAAK,CAAC,IAAI,KAAK,2BAAmB,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI;aACxB,MAAM,CAAC,CAAC,GAAa,EAA2B,EAAE,CACjD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;aACpE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gCAAgC;QAChC,MAAM,cAAc,GAAG,gBAAgB,CAAC;QACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,KAAiB,EACjB,OAAY,EACZ,WAA6C;IAE7C,IAAI,CAAC;QACH,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;aAChC,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI;aACxB,MAAM,CAAC,CAAC,GAAG,EAA2B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;aACxD,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACzD,UAAU;aACX,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU;SACX,CAAC;IAEJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,eAAe;SACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAkCD;;;;GAIG;AACH,SAAgB,0BAA0B,CACxC,OAAY;IAEZ,+CAA+C;IAC/C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEhD,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,OAAO;QACL,KAAK,CAAC,eAAe,CAAC,OAAmB;YACvC,IAAI,CAAC;gBACH,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC5C,CAAC;gBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI;qBAC1B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;qBAC7B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEtB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;gBAEpD,wBAAwB;gBACxB,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBACzB,kEAAkE;oBAClE,MAAM,kBAAkB,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACvD,IAAI,CAAC,kBAAkB,IAAI,UAAU,GAAG,kBAAkB,EAAE,CAAC;wBAC3D,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;wBACnC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,SAAS,CAAC,OAAe;YACvB,OAAO,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,iBAAiB,CAAC,OAAe;YAC/B,OAAO,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,gBAAgB;YACd,OAAO,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC;AAqBD;;;;GAIG;AACH,SAAgB,iCAAiC,CAC/C,OAAY;IAEZ,OAAO;QACL,oBAAoB,CAAC,QAAkB;YACrC,OAAO;gBACL,cAAc,EAAE,YAAY,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAChD,OAAO,EAAE,CAAC;wBACR,KAAK,EAAE,CAAC,2BAAmB,CAAC;wBAC5B,IAAI,EAAE,QAAQ;qBACf,CAAC;aACH,CAAC;QACJ,CAAC;QAED,wBAAwB,CAAC,MAAc;YACrC,OAAO;gBACL,cAAc,EAAE,iBAAiB,MAAM,EAAE;gBACzC,OAAO,EAAE,CAAC;wBACR,KAAK,EAAE,CAAC,2BAAmB,CAAC;wBAC5B,OAAO,EAAE,CAAC,MAAM,CAAC;qBAClB,CAAC;aACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|