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 @@
|
|
|
1
|
+
{"version":3,"file":"nip-22.d.ts","sourceRoot":"","sources":["../../../src/nips/nip-22.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAAC;IAEtD;;;OAGG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3C;;;OAGG;IACH,cAAc,IAAI,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,MAAyC,EAC7D,gBAAgB,GAAE,MAAuC,GACxD,aAAa,CAoCf;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,MAAM,GACb,oBAAoB,CAwBtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;;OAGG;IACH,cAAc,IAAI,MAAM,CAAC;IAEzB;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,oBAAoB,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAgErE"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-22: Event Created At Limits
|
|
4
|
+
* @module nips/nip-22
|
|
5
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/22.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DEFAULT_TIME_LIMITS = void 0;
|
|
9
|
+
exports.createTimeValidator = createTimeValidator;
|
|
10
|
+
exports.validateEventTime = validateEventTime;
|
|
11
|
+
exports.createTimeSyncManager = createTimeSyncManager;
|
|
12
|
+
/**
|
|
13
|
+
* Default time limits in seconds
|
|
14
|
+
*/
|
|
15
|
+
exports.DEFAULT_TIME_LIMITS = {
|
|
16
|
+
FUTURE_LIMIT: 900, // 15 minutes
|
|
17
|
+
PAST_LIMIT: 31536000 // 1 year
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Creates a time validator
|
|
21
|
+
* @param logger - Logger instance
|
|
22
|
+
* @param futureLimitSeconds - Future time limit in seconds
|
|
23
|
+
* @param pastLimitSeconds - Past time limit in seconds
|
|
24
|
+
* @returns {TimeValidator} Time validator
|
|
25
|
+
*/
|
|
26
|
+
function createTimeValidator(logger, futureLimitSeconds = exports.DEFAULT_TIME_LIMITS.FUTURE_LIMIT, pastLimitSeconds = exports.DEFAULT_TIME_LIMITS.PAST_LIMIT) {
|
|
27
|
+
let timeOffset = 0; // Offset between local and server time
|
|
28
|
+
return {
|
|
29
|
+
validateTime(timestamp) {
|
|
30
|
+
const now = Date.now() / 1000 + timeOffset;
|
|
31
|
+
// Check future limit
|
|
32
|
+
if (timestamp > now + futureLimitSeconds) {
|
|
33
|
+
return {
|
|
34
|
+
valid: false,
|
|
35
|
+
reason: 'Event timestamp too far in the future'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Check past limit
|
|
39
|
+
if (timestamp < now - pastLimitSeconds) {
|
|
40
|
+
return {
|
|
41
|
+
valid: false,
|
|
42
|
+
reason: 'Event timestamp too far in the past'
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { valid: true };
|
|
46
|
+
},
|
|
47
|
+
updateTimeOffset(serverTime) {
|
|
48
|
+
const localTime = Date.now() / 1000;
|
|
49
|
+
timeOffset = serverTime - localTime;
|
|
50
|
+
logger.debug(`Updated time offset to ${timeOffset} seconds`);
|
|
51
|
+
},
|
|
52
|
+
getCurrentTime() {
|
|
53
|
+
return Math.floor(Date.now() / 1000 + timeOffset);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validates event timestamp
|
|
59
|
+
* @param message - Message to validate
|
|
60
|
+
* @param validator - Time validator
|
|
61
|
+
* @param logger - Logger instance
|
|
62
|
+
* @returns {TimeValidationResult} Validation result
|
|
63
|
+
*/
|
|
64
|
+
function validateEventTime(message, validator, logger) {
|
|
65
|
+
try {
|
|
66
|
+
if (!Array.isArray(message) || message[0] !== 'EVENT') {
|
|
67
|
+
return { valid: true }; // Not an event message
|
|
68
|
+
}
|
|
69
|
+
const event = message[1];
|
|
70
|
+
const { created_at: timestamp } = event;
|
|
71
|
+
if (typeof timestamp !== 'number') {
|
|
72
|
+
return {
|
|
73
|
+
valid: false,
|
|
74
|
+
reason: 'Missing or invalid timestamp'
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return validator.validateTime(timestamp);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger.error('Error validating event time:', error);
|
|
81
|
+
return {
|
|
82
|
+
valid: false,
|
|
83
|
+
reason: 'Error validating timestamp'
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Creates a time synchronization manager
|
|
89
|
+
* @param logger - Logger instance
|
|
90
|
+
* @returns {TimeSyncManager} Time sync manager
|
|
91
|
+
*/
|
|
92
|
+
function createTimeSyncManager(logger) {
|
|
93
|
+
const validator = createTimeValidator(logger);
|
|
94
|
+
let syncInterval = null;
|
|
95
|
+
async function syncTime(wsUrl) {
|
|
96
|
+
try {
|
|
97
|
+
const ws = new WebSocket(wsUrl);
|
|
98
|
+
await new Promise((resolve, reject) => {
|
|
99
|
+
ws.onopen = () => {
|
|
100
|
+
// Send time request
|
|
101
|
+
ws.send(JSON.stringify({
|
|
102
|
+
type: 'TIME',
|
|
103
|
+
data: { client_time: Math.floor(Date.now() / 1000) }
|
|
104
|
+
}));
|
|
105
|
+
};
|
|
106
|
+
ws.onmessage = (event) => {
|
|
107
|
+
try {
|
|
108
|
+
const response = JSON.parse(event.data);
|
|
109
|
+
if (response.type === 'TIME') {
|
|
110
|
+
validator.updateTimeOffset(response.data.server_time);
|
|
111
|
+
resolve();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
reject(error);
|
|
116
|
+
}
|
|
117
|
+
ws.close();
|
|
118
|
+
};
|
|
119
|
+
ws.onerror = reject;
|
|
120
|
+
// Timeout after 5 seconds
|
|
121
|
+
setTimeout(() => reject(new Error('Time sync timeout')), 5000);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger.error('Time sync failed:', error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
startSync(wsUrl) {
|
|
130
|
+
// Initial sync
|
|
131
|
+
syncTime(wsUrl);
|
|
132
|
+
// Periodic sync every 15 minutes
|
|
133
|
+
syncInterval = setInterval(() => syncTime(wsUrl), 900000);
|
|
134
|
+
},
|
|
135
|
+
stopSync() {
|
|
136
|
+
if (syncInterval) {
|
|
137
|
+
clearInterval(syncInterval);
|
|
138
|
+
syncInterval = null;
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
getCurrentTime() {
|
|
142
|
+
return validator.getCurrentTime();
|
|
143
|
+
},
|
|
144
|
+
validateEvent(event) {
|
|
145
|
+
return validateEventTime(event, validator, logger);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=nip-22.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-22.js","sourceRoot":"","sources":["../../../src/nips/nip-22.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file NIP-26: Delegated Event Signing
|
|
3
|
+
* @module nips/nip-26
|
|
4
|
+
*/
|
|
5
|
+
import type { NostrEvent } from '../types/events';
|
|
6
|
+
/**
|
|
7
|
+
* Represents the conditions for a Nostr event delegation
|
|
8
|
+
* @interface DelegationConditions
|
|
9
|
+
* @property {number} [kind] - The kind of events this delegation is valid for
|
|
10
|
+
* @property {number} [since] - Unix timestamp from which this delegation is valid
|
|
11
|
+
* @property {number} [until] - Unix timestamp until which this delegation is valid
|
|
12
|
+
* @property {unknown} [key: string] - Any additional conditions
|
|
13
|
+
*/
|
|
14
|
+
interface DelegationConditions {
|
|
15
|
+
kind?: number;
|
|
16
|
+
since?: number;
|
|
17
|
+
until?: number;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Represents a Nostr event delegation
|
|
22
|
+
* @interface Delegation
|
|
23
|
+
* @property {string} pubkey - The public key of the delegator
|
|
24
|
+
* @property {DelegationConditions} conditions - The conditions under which this delegation is valid
|
|
25
|
+
* @property {string} token - The delegation token signed by the delegator
|
|
26
|
+
*/
|
|
27
|
+
interface Delegation {
|
|
28
|
+
pubkey: string;
|
|
29
|
+
conditions: DelegationConditions;
|
|
30
|
+
token: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a delegation token
|
|
34
|
+
*/
|
|
35
|
+
export declare function createDelegation(delegatorPrivkey: string, delegateePubkey: string, conditions: DelegationConditions): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Verify a delegation token
|
|
38
|
+
*/
|
|
39
|
+
export declare function verifyDelegation(delegatorPubkey: string, delegateePubkey: string, token: string, conditions: DelegationConditions): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Add delegation tag to an event
|
|
42
|
+
*/
|
|
43
|
+
export declare function addDelegationTag(event: NostrEvent, delegation: Delegation): NostrEvent;
|
|
44
|
+
/**
|
|
45
|
+
* Extract delegation from an event
|
|
46
|
+
*/
|
|
47
|
+
export declare function extractDelegation(event: NostrEvent): Delegation | null;
|
|
48
|
+
/**
|
|
49
|
+
* Validate a delegated event
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateDelegatedEvent(event: NostrEvent): Promise<boolean>;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=nip-26.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-26.d.ts","sourceRoot":"","sources":["../../../src/nips/nip-26.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD;;;;;;;GAOG;AACH,UAAU,oBAAoB;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,oBAAoB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,CAYtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAyBtE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAuChF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-26: Delegated Event Signing
|
|
4
|
+
* @module nips/nip-26
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createDelegation = createDelegation;
|
|
8
|
+
exports.verifyDelegation = verifyDelegation;
|
|
9
|
+
exports.addDelegationTag = addDelegationTag;
|
|
10
|
+
exports.extractDelegation = extractDelegation;
|
|
11
|
+
exports.validateDelegatedEvent = validateDelegatedEvent;
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
const nostr_crypto_utils_1 = require("nostr-crypto-utils");
|
|
14
|
+
const logger = (0, logger_1.getLogger)('NIP-26');
|
|
15
|
+
/**
|
|
16
|
+
* Create a delegation token
|
|
17
|
+
*/
|
|
18
|
+
async function createDelegation(delegatorPrivkey, delegateePubkey, conditions) {
|
|
19
|
+
try {
|
|
20
|
+
const conditionsString = Object.entries(conditions)
|
|
21
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
22
|
+
.sort()
|
|
23
|
+
.join('&');
|
|
24
|
+
const message = `nostr:delegation:${delegateePubkey}:${conditionsString}`;
|
|
25
|
+
// Create a NostrEvent object for signing
|
|
26
|
+
const event = {
|
|
27
|
+
id: '', // This will be set by signEvent
|
|
28
|
+
pubkey: delegateePubkey,
|
|
29
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
30
|
+
kind: 0, // Using kind 0 for delegation events
|
|
31
|
+
tags: [],
|
|
32
|
+
content: message,
|
|
33
|
+
sig: '' // This will be set by signEvent
|
|
34
|
+
};
|
|
35
|
+
const signedEvent = await (0, nostr_crypto_utils_1.signEvent)(event, delegatorPrivkey);
|
|
36
|
+
return signedEvent.sig;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
40
|
+
logger.error(`Failed to create delegation: ${errorMessage}`);
|
|
41
|
+
throw new Error(`Failed to create delegation: ${errorMessage}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Verify a delegation token
|
|
46
|
+
*/
|
|
47
|
+
async function verifyDelegation(delegatorPubkey, delegateePubkey, token, conditions) {
|
|
48
|
+
try {
|
|
49
|
+
const conditionsString = Object.entries(conditions)
|
|
50
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
51
|
+
.sort()
|
|
52
|
+
.join('&');
|
|
53
|
+
const message = `nostr:delegation:${delegateePubkey}:${conditionsString}`;
|
|
54
|
+
const verificationEvent = {
|
|
55
|
+
id: '',
|
|
56
|
+
pubkey: delegatorPubkey,
|
|
57
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
58
|
+
kind: 0,
|
|
59
|
+
tags: [],
|
|
60
|
+
content: message,
|
|
61
|
+
sig: token
|
|
62
|
+
};
|
|
63
|
+
return await (0, nostr_crypto_utils_1.verifySignature)(verificationEvent);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
67
|
+
logger.error(`Failed to verify delegation: ${errorMessage}`);
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Add delegation tag to an event
|
|
73
|
+
*/
|
|
74
|
+
function addDelegationTag(event, delegation) {
|
|
75
|
+
const conditionsString = Object.entries(delegation.conditions)
|
|
76
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
77
|
+
.sort()
|
|
78
|
+
.join('&');
|
|
79
|
+
const delegationTag = ['delegation', delegation.pubkey, conditionsString, delegation.token];
|
|
80
|
+
return {
|
|
81
|
+
...event,
|
|
82
|
+
tags: [...event.tags, delegationTag]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Extract delegation from an event
|
|
87
|
+
*/
|
|
88
|
+
function extractDelegation(event) {
|
|
89
|
+
try {
|
|
90
|
+
const delegationTag = event.tags.find(tag => tag[0] === 'delegation');
|
|
91
|
+
if (!delegationTag || delegationTag.length !== 4) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const [, pubkey, conditionsString, token] = delegationTag;
|
|
95
|
+
const conditions = {};
|
|
96
|
+
conditionsString.split('&').forEach(pair => {
|
|
97
|
+
const [key, value] = pair.split('=');
|
|
98
|
+
if (key === 'kind' || key === 'since' || key === 'until') {
|
|
99
|
+
conditions[key] = parseInt(value, 10);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
conditions[key] = value;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
return { pubkey, conditions, token };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
109
|
+
logger.error(`Failed to extract delegation: ${errorMessage}`);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validate a delegated event
|
|
115
|
+
*/
|
|
116
|
+
async function validateDelegatedEvent(event) {
|
|
117
|
+
try {
|
|
118
|
+
const delegation = extractDelegation(event);
|
|
119
|
+
if (!delegation) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
const { kind, created_at } = event;
|
|
123
|
+
const { kind: allowedKind, since, until } = delegation.conditions;
|
|
124
|
+
// Check kind constraint
|
|
125
|
+
if (allowedKind !== undefined && kind !== allowedKind) {
|
|
126
|
+
logger.debug('Event kind does not match delegation conditions');
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
// Check time constraints
|
|
130
|
+
if (since !== undefined && created_at < since) {
|
|
131
|
+
logger.debug('Event is before delegation start time');
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (until !== undefined && created_at > until) {
|
|
135
|
+
logger.debug('Event is after delegation end time');
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Verify delegation token
|
|
139
|
+
return await verifyDelegation(delegation.pubkey, event.pubkey, delegation.token, delegation.conditions);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
143
|
+
logger.error(`Failed to validate delegated event: ${errorMessage}`);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=nip-26.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-26.js","sourceRoot":"","sources":["../../../src/nips/nip-26.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file NIP-28: Public Chat
|
|
3
|
+
* @module nips/nip-28
|
|
4
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/28.md
|
|
5
|
+
*/
|
|
6
|
+
import type { NostrWSMessage } from '../types/messages';
|
|
7
|
+
import type { Logger } from '../types/logger';
|
|
8
|
+
/**
|
|
9
|
+
* Chat event kinds
|
|
10
|
+
*/
|
|
11
|
+
export declare const ChatEventKinds: {
|
|
12
|
+
readonly CHANNEL_CREATION: 40;
|
|
13
|
+
readonly CHANNEL_METADATA: 41;
|
|
14
|
+
readonly CHANNEL_MESSAGE: 42;
|
|
15
|
+
readonly CHANNEL_HIDE_MESSAGE: 43;
|
|
16
|
+
readonly CHANNEL_MUTE_USER: 44;
|
|
17
|
+
readonly USER_MUTE: 45;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Channel metadata structure
|
|
21
|
+
*/
|
|
22
|
+
export interface ChannelMetadata {
|
|
23
|
+
name: string;
|
|
24
|
+
about?: string;
|
|
25
|
+
picture?: string;
|
|
26
|
+
rules?: string[];
|
|
27
|
+
moderators?: string[];
|
|
28
|
+
pinned?: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates a channel creation message
|
|
32
|
+
* @param metadata - Channel metadata
|
|
33
|
+
* @returns {NostrWSMessage} Channel creation event
|
|
34
|
+
*/
|
|
35
|
+
export declare function createChannelCreationEvent(metadata: ChannelMetadata): NostrWSMessage;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a channel message
|
|
38
|
+
* @param channelId - Channel ID
|
|
39
|
+
* @param content - Message content
|
|
40
|
+
* @param replyTo - Optional ID of message being replied to
|
|
41
|
+
* @returns {NostrWSMessage} Channel message event
|
|
42
|
+
*/
|
|
43
|
+
export declare function createChannelMessage(channelId: string, content: string, replyTo?: string): NostrWSMessage;
|
|
44
|
+
/**
|
|
45
|
+
* Creates a message moderation event
|
|
46
|
+
* @param channelId - Channel ID
|
|
47
|
+
* @param messageId - Message ID to moderate
|
|
48
|
+
* @param reason - Moderation reason
|
|
49
|
+
* @returns {NostrWSMessage} Hide message event
|
|
50
|
+
*/
|
|
51
|
+
export declare function createHideMessageEvent(channelId: string, messageId: string, reason: string): NostrWSMessage;
|
|
52
|
+
/**
|
|
53
|
+
* Chat message handler interface
|
|
54
|
+
*/
|
|
55
|
+
export interface ChatMessageHandler {
|
|
56
|
+
/**
|
|
57
|
+
* Handles incoming chat message
|
|
58
|
+
* @param message - Chat message
|
|
59
|
+
* @returns {Promise<void>}
|
|
60
|
+
*/
|
|
61
|
+
handleMessage(message: NostrWSMessage): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Handles message moderation
|
|
64
|
+
* @param message - Moderation message
|
|
65
|
+
* @returns {Promise<void>}
|
|
66
|
+
*/
|
|
67
|
+
handleModeration(message: NostrWSMessage): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates a chat message handler
|
|
71
|
+
* @param logger - Logger instance
|
|
72
|
+
* @returns {ChatMessageHandler} Message handler
|
|
73
|
+
*/
|
|
74
|
+
export declare function createChatMessageHandler(logger: Logger): ChatMessageHandler;
|
|
75
|
+
/**
|
|
76
|
+
* Channel subscription manager interface
|
|
77
|
+
*/
|
|
78
|
+
export interface ChannelSubscriptionManager {
|
|
79
|
+
/**
|
|
80
|
+
* Subscribes to a channel
|
|
81
|
+
* @param channelId - Channel ID
|
|
82
|
+
* @returns {NostrWSMessage} Subscription message
|
|
83
|
+
*/
|
|
84
|
+
subscribe(channelId: string): NostrWSMessage;
|
|
85
|
+
/**
|
|
86
|
+
* Unsubscribes from a channel
|
|
87
|
+
* @param channelId - Channel ID
|
|
88
|
+
* @returns {NostrWSMessage} Unsubscribe message
|
|
89
|
+
*/
|
|
90
|
+
unsubscribe(channelId: string): NostrWSMessage;
|
|
91
|
+
/**
|
|
92
|
+
* Gets channel metadata
|
|
93
|
+
* @param channelId - Channel ID
|
|
94
|
+
* @returns {Promise<ChannelMetadata | undefined>} Channel metadata
|
|
95
|
+
*/
|
|
96
|
+
getMetadata(channelId: string): Promise<ChannelMetadata | undefined>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Creates a channel subscription manager
|
|
100
|
+
* @param logger - Logger instance
|
|
101
|
+
* @returns {ChannelSubscriptionManager} Subscription manager
|
|
102
|
+
*/
|
|
103
|
+
export declare function createChannelSubscriptionManager(logger: Logger): ChannelSubscriptionManager;
|
|
104
|
+
//# sourceMappingURL=nip-28.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-28.d.ts","sourceRoot":"","sources":["../../../src/nips/nip-28.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;CAOjB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,GACxB,cAAc,CAMhB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,CAWhB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,cAAc,CAShB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA8D3E;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IAE7C;;;;OAIG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IAE/C;;;;OAIG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;CACtE;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,GACb,0BAA0B,CAoC5B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file NIP-28: Public Chat
|
|
4
|
+
* @module nips/nip-28
|
|
5
|
+
* @see https://github.com/nostr-protocol/nips/blob/master/28.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ChatEventKinds = void 0;
|
|
9
|
+
exports.createChannelCreationEvent = createChannelCreationEvent;
|
|
10
|
+
exports.createChannelMessage = createChannelMessage;
|
|
11
|
+
exports.createHideMessageEvent = createHideMessageEvent;
|
|
12
|
+
exports.createChatMessageHandler = createChatMessageHandler;
|
|
13
|
+
exports.createChannelSubscriptionManager = createChannelSubscriptionManager;
|
|
14
|
+
/**
|
|
15
|
+
* Chat event kinds
|
|
16
|
+
*/
|
|
17
|
+
exports.ChatEventKinds = {
|
|
18
|
+
CHANNEL_CREATION: 40,
|
|
19
|
+
CHANNEL_METADATA: 41,
|
|
20
|
+
CHANNEL_MESSAGE: 42,
|
|
21
|
+
CHANNEL_HIDE_MESSAGE: 43,
|
|
22
|
+
CHANNEL_MUTE_USER: 44,
|
|
23
|
+
USER_MUTE: 45
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Creates a channel creation message
|
|
27
|
+
* @param metadata - Channel metadata
|
|
28
|
+
* @returns {NostrWSMessage} Channel creation event
|
|
29
|
+
*/
|
|
30
|
+
function createChannelCreationEvent(metadata) {
|
|
31
|
+
return ['EVENT', {
|
|
32
|
+
kind: exports.ChatEventKinds.CHANNEL_CREATION,
|
|
33
|
+
content: JSON.stringify(metadata),
|
|
34
|
+
tags: []
|
|
35
|
+
}];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates a channel message
|
|
39
|
+
* @param channelId - Channel ID
|
|
40
|
+
* @param content - Message content
|
|
41
|
+
* @param replyTo - Optional ID of message being replied to
|
|
42
|
+
* @returns {NostrWSMessage} Channel message event
|
|
43
|
+
*/
|
|
44
|
+
function createChannelMessage(channelId, content, replyTo) {
|
|
45
|
+
const tags = [['e', channelId, '', 'root']];
|
|
46
|
+
if (replyTo) {
|
|
47
|
+
tags.push(['e', replyTo, '', 'reply']);
|
|
48
|
+
}
|
|
49
|
+
return ['EVENT', {
|
|
50
|
+
kind: exports.ChatEventKinds.CHANNEL_MESSAGE,
|
|
51
|
+
content,
|
|
52
|
+
tags
|
|
53
|
+
}];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Creates a message moderation event
|
|
57
|
+
* @param channelId - Channel ID
|
|
58
|
+
* @param messageId - Message ID to moderate
|
|
59
|
+
* @param reason - Moderation reason
|
|
60
|
+
* @returns {NostrWSMessage} Hide message event
|
|
61
|
+
*/
|
|
62
|
+
function createHideMessageEvent(channelId, messageId, reason) {
|
|
63
|
+
return ['EVENT', {
|
|
64
|
+
kind: exports.ChatEventKinds.CHANNEL_HIDE_MESSAGE,
|
|
65
|
+
content: reason,
|
|
66
|
+
tags: [
|
|
67
|
+
['e', channelId, '', 'root'],
|
|
68
|
+
['e', messageId, '', 'reply']
|
|
69
|
+
]
|
|
70
|
+
}];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Creates a chat message handler
|
|
74
|
+
* @param logger - Logger instance
|
|
75
|
+
* @returns {ChatMessageHandler} Message handler
|
|
76
|
+
*/
|
|
77
|
+
function createChatMessageHandler(logger) {
|
|
78
|
+
return {
|
|
79
|
+
async handleMessage(message) {
|
|
80
|
+
try {
|
|
81
|
+
if (!Array.isArray(message) || message[0] !== 'EVENT')
|
|
82
|
+
return;
|
|
83
|
+
const event = message[1];
|
|
84
|
+
if (event.kind !== exports.ChatEventKinds.CHANNEL_MESSAGE)
|
|
85
|
+
return;
|
|
86
|
+
// Extract channel ID and reply ID from tags
|
|
87
|
+
const { tags } = event;
|
|
88
|
+
const channelId = tags.find(tag => tag[0] === 'e' && tag[3] === 'root')?.[1];
|
|
89
|
+
const replyId = tags.find(tag => tag[0] === 'e' && tag[3] === 'reply')?.[1];
|
|
90
|
+
// Process message
|
|
91
|
+
logger.debug('Processing chat message', {
|
|
92
|
+
channelId,
|
|
93
|
+
replyId,
|
|
94
|
+
content: event.content
|
|
95
|
+
});
|
|
96
|
+
// Additional message processing logic here
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
logger.error('Error handling chat message:', error);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
async handleModeration(message) {
|
|
103
|
+
try {
|
|
104
|
+
if (!Array.isArray(message) || message[0] !== 'EVENT')
|
|
105
|
+
return;
|
|
106
|
+
const event = message[1];
|
|
107
|
+
if (event.kind !== exports.ChatEventKinds.CHANNEL_HIDE_MESSAGE)
|
|
108
|
+
return;
|
|
109
|
+
// Extract channel and message IDs
|
|
110
|
+
const { tags } = event;
|
|
111
|
+
const channelId = tags.find(tag => tag[0] === 'e' && tag[3] === 'root')?.[1];
|
|
112
|
+
const messageId = tags.find(tag => tag[0] === 'e' && tag[3] === 'reply')?.[1];
|
|
113
|
+
// Process moderation
|
|
114
|
+
logger.debug('Processing message moderation', {
|
|
115
|
+
channelId,
|
|
116
|
+
messageId,
|
|
117
|
+
reason: event.content
|
|
118
|
+
});
|
|
119
|
+
// Additional moderation logic here
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
logger.error('Error handling message moderation:', error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Creates a channel subscription manager
|
|
129
|
+
* @param logger - Logger instance
|
|
130
|
+
* @returns {ChannelSubscriptionManager} Subscription manager
|
|
131
|
+
*/
|
|
132
|
+
function createChannelSubscriptionManager(logger) {
|
|
133
|
+
const subscriptions = new Map(); // channelId -> subscriptionId
|
|
134
|
+
const metadata = new Map();
|
|
135
|
+
return {
|
|
136
|
+
subscribe(channelId) {
|
|
137
|
+
const subscriptionId = `chat:${channelId}:${Date.now()}`;
|
|
138
|
+
subscriptions.set(channelId, subscriptionId);
|
|
139
|
+
return ['REQ', {
|
|
140
|
+
subscription_id: subscriptionId,
|
|
141
|
+
filter: {
|
|
142
|
+
kinds: [
|
|
143
|
+
exports.ChatEventKinds.CHANNEL_MESSAGE,
|
|
144
|
+
exports.ChatEventKinds.CHANNEL_HIDE_MESSAGE
|
|
145
|
+
],
|
|
146
|
+
'#e': [channelId]
|
|
147
|
+
}
|
|
148
|
+
}];
|
|
149
|
+
},
|
|
150
|
+
unsubscribe(channelId) {
|
|
151
|
+
const subscriptionId = subscriptions.get(channelId);
|
|
152
|
+
if (!subscriptionId) {
|
|
153
|
+
logger.debug(`No subscription found for channel ${channelId}`);
|
|
154
|
+
return ['CLOSE', { subscription_id: '' }];
|
|
155
|
+
}
|
|
156
|
+
subscriptions.delete(channelId);
|
|
157
|
+
return ['CLOSE', { subscription_id: subscriptionId }];
|
|
158
|
+
},
|
|
159
|
+
async getMetadata(channelId) {
|
|
160
|
+
return metadata.get(channelId);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=nip-28.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip-28.js","sourceRoot":"","sources":["../../../src/nips/nip-28.ts"],"names":[],"mappings":"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"}
|