nostr 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +1 -1
  3. data/.rubocop.yml +26 -0
  4. data/.tool-versions +2 -1
  5. data/CHANGELOG.md +65 -1
  6. data/README.md +96 -183
  7. data/Steepfile +2 -0
  8. data/docs/.gitignore +4 -0
  9. data/docs/.vitepress/config.mjs +112 -0
  10. data/docs/README.md +44 -0
  11. data/docs/api-examples.md +49 -0
  12. data/docs/bun.lockb +0 -0
  13. data/docs/common-use-cases/bech32-encoding-and-decoding-(NIP-19).md +190 -0
  14. data/docs/core/client.md +108 -0
  15. data/docs/core/keys.md +136 -0
  16. data/docs/core/user.md +43 -0
  17. data/docs/events/contact-list.md +29 -0
  18. data/docs/events/encrypted-direct-message.md +28 -0
  19. data/docs/events/recommend-server.md +32 -0
  20. data/docs/events/set-metadata.md +20 -0
  21. data/docs/events/text-note.md +15 -0
  22. data/docs/events.md +11 -0
  23. data/docs/getting-started/installation.md +21 -0
  24. data/docs/getting-started/overview.md +170 -0
  25. data/docs/implemented-nips.md +9 -0
  26. data/docs/index.md +44 -0
  27. data/docs/markdown-examples.md +85 -0
  28. data/docs/package.json +12 -0
  29. data/docs/relays/connecting-to-a-relay.md +21 -0
  30. data/docs/relays/publishing-events.md +29 -0
  31. data/docs/relays/receiving-events.md +6 -0
  32. data/docs/subscriptions/creating-a-subscription.md +49 -0
  33. data/docs/subscriptions/deleting-a-subscription.md +10 -0
  34. data/docs/subscriptions/filtering-subscription-events.md +115 -0
  35. data/docs/subscriptions/updating-a-subscription.md +4 -0
  36. data/lib/nostr/bech32.rb +203 -0
  37. data/lib/nostr/client.rb +2 -1
  38. data/lib/nostr/crypto.rb +147 -0
  39. data/lib/nostr/errors/error.rb +7 -0
  40. data/lib/nostr/errors/invalid_hrp_error.rb +21 -0
  41. data/lib/nostr/errors/invalid_key_format_error.rb +20 -0
  42. data/lib/nostr/errors/invalid_key_length_error.rb +20 -0
  43. data/lib/nostr/errors/invalid_key_type_error.rb +18 -0
  44. data/lib/nostr/errors/key_validation_error.rb +6 -0
  45. data/lib/nostr/errors.rb +8 -0
  46. data/lib/nostr/event.rb +157 -12
  47. data/lib/nostr/event_kind.rb +8 -0
  48. data/lib/nostr/events/encrypted_direct_message.rb +54 -0
  49. data/lib/nostr/filter.rb +4 -4
  50. data/lib/nostr/key.rb +100 -0
  51. data/lib/nostr/key_pair.rb +30 -6
  52. data/lib/nostr/keygen.rb +43 -4
  53. data/lib/nostr/private_key.rb +36 -0
  54. data/lib/nostr/public_key.rb +36 -0
  55. data/lib/nostr/relay_message_type.rb +18 -0
  56. data/lib/nostr/subscription.rb +2 -2
  57. data/lib/nostr/user.rb +17 -36
  58. data/lib/nostr/version.rb +1 -1
  59. data/lib/nostr.rb +8 -1
  60. data/nostr.gemspec +9 -9
  61. data/sig/nostr/bech32.rbs +14 -0
  62. data/sig/nostr/client.rbs +5 -5
  63. data/sig/nostr/crypto.rbs +16 -0
  64. data/sig/nostr/errors/error.rbs +4 -0
  65. data/sig/nostr/errors/invalid_hrb_error.rbs +6 -0
  66. data/sig/nostr/errors/invalid_key_format_error.rbs +5 -0
  67. data/sig/nostr/errors/invalid_key_length_error.rbs +5 -0
  68. data/sig/nostr/errors/invalid_key_type_error.rbs +5 -0
  69. data/sig/nostr/errors/key_validation_error.rbs +4 -0
  70. data/sig/nostr/event.rbs +24 -9
  71. data/sig/nostr/event_kind.rbs +1 -0
  72. data/sig/nostr/events/encrypted_direct_message.rbs +12 -0
  73. data/sig/nostr/filter.rbs +3 -12
  74. data/sig/nostr/key.rbs +16 -0
  75. data/sig/nostr/key_pair.rbs +7 -3
  76. data/sig/nostr/keygen.rbs +5 -2
  77. data/sig/nostr/private_key.rbs +4 -0
  78. data/sig/nostr/public_key.rbs +4 -0
  79. data/sig/nostr/relay_message_type.rbs +8 -0
  80. data/sig/nostr/user.rbs +4 -10
  81. data/sig/vendor/bech32/nostr/entity.rbs +41 -0
  82. data/sig/vendor/bech32/nostr/nip19.rbs +20 -0
  83. data/sig/vendor/bech32/segwit_addr.rbs +21 -0
  84. data/sig/vendor/bech32.rbs +25 -0
  85. data/sig/vendor/event_emitter.rbs +10 -3
  86. data/sig/vendor/event_machine/channel.rbs +1 -1
  87. data/sig/vendor/faye/websocket/api.rbs +45 -0
  88. data/sig/vendor/faye/websocket/client.rbs +43 -0
  89. data/sig/vendor/faye/websocket.rbs +30 -0
  90. metadata +83 -23
  91. data/lib/nostr/event_fragment.rb +0 -111
  92. data/sig/nostr/event_fragment.rbs +0 -12
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nostr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilson Silva
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-15 00:00:00.000000000 Z
11
+ date: 2023-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bech32
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '1.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '1.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bip-schnorr
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.4'
33
+ version: '0.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.4'
40
+ version: '0.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ecdsa
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: '5.6'
229
+ version: '6.4'
230
230
  type: :development
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: '5.6'
236
+ version: '6.4'
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: rack
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -254,28 +254,28 @@ dependencies:
254
254
  requirements:
255
255
  - - "~>"
256
256
  - !ruby/object:Gem::Version
257
- version: '13.0'
257
+ version: '13.1'
258
258
  type: :development
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - "~>"
263
263
  - !ruby/object:Gem::Version
264
- version: '13.0'
264
+ version: '13.1'
265
265
  - !ruby/object:Gem::Dependency
266
266
  name: rbs
267
267
  requirement: !ruby/object:Gem::Requirement
268
268
  requirements:
269
269
  - - "~>"
270
270
  - !ruby/object:Gem::Version
271
- version: '2.8'
271
+ version: '3.3'
272
272
  type: :development
273
273
  prerelease: false
274
274
  version_requirements: !ruby/object:Gem::Requirement
275
275
  requirements:
276
276
  - - "~>"
277
277
  - !ruby/object:Gem::Version
278
- version: '2.8'
278
+ version: '3.3'
279
279
  - !ruby/object:Gem::Dependency
280
280
  name: rspec
281
281
  requirement: !ruby/object:Gem::Requirement
@@ -296,14 +296,14 @@ dependencies:
296
296
  requirements:
297
297
  - - "~>"
298
298
  - !ruby/object:Gem::Version
299
- version: '1.42'
299
+ version: '1.57'
300
300
  type: :development
301
301
  prerelease: false
302
302
  version_requirements: !ruby/object:Gem::Requirement
303
303
  requirements:
304
304
  - - "~>"
305
305
  - !ruby/object:Gem::Version
306
- version: '1.42'
306
+ version: '1.57'
307
307
  - !ruby/object:Gem::Dependency
308
308
  name: rubocop-rake
309
309
  requirement: !ruby/object:Gem::Requirement
@@ -324,14 +324,14 @@ dependencies:
324
324
  requirements:
325
325
  - - '='
326
326
  - !ruby/object:Gem::Version
327
- version: '2.16'
327
+ version: '2.25'
328
328
  type: :development
329
329
  prerelease: false
330
330
  version_requirements: !ruby/object:Gem::Requirement
331
331
  requirements:
332
332
  - - '='
333
333
  - !ruby/object:Gem::Version
334
- version: '2.16'
334
+ version: '2.25'
335
335
  - !ruby/object:Gem::Dependency
336
336
  name: simplecov
337
337
  requirement: !ruby/object:Gem::Requirement
@@ -366,14 +366,14 @@ dependencies:
366
366
  requirements:
367
367
  - - "~>"
368
368
  - !ruby/object:Gem::Version
369
- version: '1.3'
369
+ version: '1.6'
370
370
  type: :development
371
371
  prerelease: false
372
372
  version_requirements: !ruby/object:Gem::Requirement
373
373
  requirements:
374
374
  - - "~>"
375
375
  - !ruby/object:Gem::Version
376
- version: '1.3'
376
+ version: '1.6'
377
377
  - !ruby/object:Gem::Dependency
378
378
  name: typeprof
379
379
  requirement: !ruby/object:Gem::Requirement
@@ -452,43 +452,103 @@ files:
452
452
  - README.md
453
453
  - Rakefile
454
454
  - Steepfile
455
+ - docs/.gitignore
456
+ - docs/.vitepress/config.mjs
457
+ - docs/README.md
458
+ - docs/api-examples.md
459
+ - docs/bun.lockb
460
+ - docs/common-use-cases/bech32-encoding-and-decoding-(NIP-19).md
461
+ - docs/core/client.md
462
+ - docs/core/keys.md
463
+ - docs/core/user.md
464
+ - docs/events.md
465
+ - docs/events/contact-list.md
466
+ - docs/events/encrypted-direct-message.md
467
+ - docs/events/recommend-server.md
468
+ - docs/events/set-metadata.md
469
+ - docs/events/text-note.md
470
+ - docs/getting-started/installation.md
471
+ - docs/getting-started/overview.md
472
+ - docs/implemented-nips.md
473
+ - docs/index.md
474
+ - docs/markdown-examples.md
475
+ - docs/package.json
476
+ - docs/relays/connecting-to-a-relay.md
477
+ - docs/relays/publishing-events.md
478
+ - docs/relays/receiving-events.md
479
+ - docs/subscriptions/creating-a-subscription.md
480
+ - docs/subscriptions/deleting-a-subscription.md
481
+ - docs/subscriptions/filtering-subscription-events.md
482
+ - docs/subscriptions/updating-a-subscription.md
455
483
  - lib/nostr.rb
484
+ - lib/nostr/bech32.rb
456
485
  - lib/nostr/client.rb
457
486
  - lib/nostr/client_message_type.rb
487
+ - lib/nostr/crypto.rb
488
+ - lib/nostr/errors.rb
489
+ - lib/nostr/errors/error.rb
490
+ - lib/nostr/errors/invalid_hrp_error.rb
491
+ - lib/nostr/errors/invalid_key_format_error.rb
492
+ - lib/nostr/errors/invalid_key_length_error.rb
493
+ - lib/nostr/errors/invalid_key_type_error.rb
494
+ - lib/nostr/errors/key_validation_error.rb
458
495
  - lib/nostr/event.rb
459
- - lib/nostr/event_fragment.rb
460
496
  - lib/nostr/event_kind.rb
497
+ - lib/nostr/events/encrypted_direct_message.rb
461
498
  - lib/nostr/filter.rb
499
+ - lib/nostr/key.rb
462
500
  - lib/nostr/key_pair.rb
463
501
  - lib/nostr/keygen.rb
502
+ - lib/nostr/private_key.rb
503
+ - lib/nostr/public_key.rb
464
504
  - lib/nostr/relay.rb
505
+ - lib/nostr/relay_message_type.rb
465
506
  - lib/nostr/subscription.rb
466
507
  - lib/nostr/user.rb
467
508
  - lib/nostr/version.rb
468
509
  - nostr.gemspec
469
510
  - sig/nostr.rbs
511
+ - sig/nostr/bech32.rbs
470
512
  - sig/nostr/client.rbs
471
513
  - sig/nostr/client_message_type.rbs
514
+ - sig/nostr/crypto.rbs
515
+ - sig/nostr/errors/error.rbs
516
+ - sig/nostr/errors/invalid_hrb_error.rbs
517
+ - sig/nostr/errors/invalid_key_format_error.rbs
518
+ - sig/nostr/errors/invalid_key_length_error.rbs
519
+ - sig/nostr/errors/invalid_key_type_error.rbs
520
+ - sig/nostr/errors/key_validation_error.rbs
472
521
  - sig/nostr/event.rbs
473
- - sig/nostr/event_fragment.rbs
474
522
  - sig/nostr/event_kind.rbs
523
+ - sig/nostr/events/encrypted_direct_message.rbs
475
524
  - sig/nostr/filter.rbs
525
+ - sig/nostr/key.rbs
476
526
  - sig/nostr/key_pair.rbs
477
527
  - sig/nostr/keygen.rbs
528
+ - sig/nostr/private_key.rbs
529
+ - sig/nostr/public_key.rbs
478
530
  - sig/nostr/relay.rbs
531
+ - sig/nostr/relay_message_type.rbs
479
532
  - sig/nostr/subscription.rbs
480
533
  - sig/nostr/user.rbs
534
+ - sig/vendor/bech32.rbs
535
+ - sig/vendor/bech32/nostr/entity.rbs
536
+ - sig/vendor/bech32/nostr/nip19.rbs
537
+ - sig/vendor/bech32/segwit_addr.rbs
481
538
  - sig/vendor/ecsda/group/secp256k1.rbs
482
539
  - sig/vendor/event_emitter.rbs
483
540
  - sig/vendor/event_machine.rbs
484
541
  - sig/vendor/event_machine/channel.rbs
542
+ - sig/vendor/faye/websocket.rbs
543
+ - sig/vendor/faye/websocket/api.rbs
544
+ - sig/vendor/faye/websocket/client.rbs
485
545
  - sig/vendor/schnorr.rbs
486
- homepage: https://github.com/wilsonsilva/nostr
546
+ homepage: https://nostr-ruby.com/
487
547
  licenses:
488
548
  - MIT
489
549
  metadata:
490
550
  rubygems_mfa_required: 'true'
491
- homepage_uri: https://github.com/wilsonsilva/nostr
551
+ homepage_uri: https://nostr-ruby.com/
492
552
  source_code_uri: https://github.com/wilsonsilva/nostr
493
553
  changelog_uri: https://github.com/wilsonsilva/nostr/blob/main/CHANGELOG.md
494
554
  post_install_message:
@@ -506,7 +566,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
506
566
  - !ruby/object:Gem::Version
507
567
  version: '0'
508
568
  requirements: []
509
- rubygems_version: 3.4.4
569
+ rubygems_version: 3.4.20
510
570
  signing_key:
511
571
  specification_version: 4
512
572
  summary: Client and relay implementation of the Nostr protocol.
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nostr
4
- # Part of an +Event+. A complete +Event+ must have an +id+ and a +sig+.
5
- class EventFragment
6
- # 32-bytes hex-encoded public key of the event creator
7
- #
8
- # @api public
9
- #
10
- # @example
11
- # event.pubkey # => '48df4af6e240ac5f7c5de89bf5941b249880be0e87d03685b178ccb1a315f52e'
12
- #
13
- # @return [String]
14
- #
15
- attr_reader :pubkey
16
-
17
- # Date of the creation of the vent. A UNIX timestamp, in seconds
18
- #
19
- # @api public
20
- #
21
- # @example
22
- # event.created_at # => 1230981305
23
- #
24
- # @return [Integer]
25
- #
26
- attr_reader :created_at
27
-
28
- # The kind of the event. An integer from 0 to 3
29
- #
30
- # @api public
31
- #
32
- # @example
33
- # event.kind # => 1
34
- #
35
- # @return [Integer]
36
- #
37
- attr_reader :kind
38
-
39
- # An array of tags. Each tag is an array of strings
40
- #
41
- # @api public
42
- #
43
- # @example Tags referencing an event
44
- # event.tags #=> [["e", "event_id", "relay URL"]]
45
- #
46
- # @example Tags referencing a key
47
- # event.tags #=> [["p", "event_id", "relay URL"]]
48
- #
49
- # @return [Array<Array>]
50
- #
51
- attr_reader :tags
52
-
53
- # An arbitrary string
54
- #
55
- # @api public
56
- #
57
- # @example
58
- # event.content # => 'Your feedback is appreciated, now pay $8'
59
- #
60
- # @return [String]
61
- #
62
- attr_reader :content
63
-
64
- # Instantiates a new EventFragment
65
- #
66
- # @api public
67
- #
68
- # @example
69
- # Nostr::EventFragment.new(
70
- # pubkey: 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460',
71
- # created_at: 1230981305,
72
- # kind: 1,
73
- # tags: [['e', '189df012cfff8a075785b884bd702025f4a7a37710f581c4ac9d33e24b585408']],
74
- # content: 'Your feedback is appreciated, now pay $8'
75
- # )
76
- #
77
- # @param pubkey [String] 32-bytes hex-encoded public key of the event creator.
78
- # @param created_at [Integer] Date of the creation of the vent. A UNIX timestamp, in seconds.
79
- # @param kind [Integer] The kind of the event. An integer from 0 to 3.
80
- # @param tags [Array<Array>] An array of tags. Each tag is an array of strings.
81
- # @param content [String] Arbitrary string.
82
- #
83
- def initialize(pubkey:, kind:, content:, created_at: Time.now.to_i, tags: [])
84
- @pubkey = pubkey
85
- @created_at = created_at
86
- @kind = kind
87
- @tags = tags
88
- @content = content
89
- end
90
-
91
- # Serializes the event fragment, to obtain a SHA256 hash of it
92
- #
93
- # @api public
94
- #
95
- # @example Converting the event to a hash
96
- # event_fragment.serialize
97
- #
98
- # @return [Array] The event fragment as an array.
99
- #
100
- def serialize
101
- [
102
- 0,
103
- pubkey,
104
- created_at,
105
- kind,
106
- tags,
107
- content
108
- ]
109
- end
110
- end
111
- end
@@ -1,12 +0,0 @@
1
- module Nostr
2
- class EventFragment
3
- attr_reader pubkey: String
4
- attr_reader created_at: Integer
5
- attr_reader kind: Integer
6
- attr_reader tags: Array[String]
7
- attr_reader content: String
8
-
9
- def initialize: (pubkey: String, kind: Integer, content: String, ?created_at: Integer, ?tags: Array[String]) -> void
10
- def serialize: -> [Integer, String, Integer, Integer, Array[String], String]
11
- end
12
- end