Skip to content

Commit

Permalink
refactor: nip20
Browse files Browse the repository at this point in the history
  • Loading branch information
ethicnology committed May 24, 2023
1 parent 6474fd3 commit 5c8e29d
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 21 deletions.
3 changes: 3 additions & 0 deletions lib/src/message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ class Message {
message = Event.deserialize(data);
if (message.kind == 4) message = EncryptedDirectMessage(message);
break;
case "OK":
message = Nip20.deserialize(data);
break;
case "REQ":
message = Request.deserialize(data);
break;
Expand Down
49 changes: 34 additions & 15 deletions lib/src/nips/nip_020.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
import 'dart:convert';
import 'package:nostr/nostr.dart';

/// When submitting events to relays, clients currently have no way to know if an event was successfully committed to the database.
/// This NIP introduces the concept of command results which are like NOTICE's except provide more information about if an event was accepted or rejected.
///
/// Event successfully written to the database:
///
/// ["OK", "b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30", true, ""]
///
/// Event successfully written to the database because of a reason:
///
/// ["OK", "b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30", true, "pow: difficulty 25>=24"]
///
/// Event blocked due to ip filter:
///
/// ["OK", "b1a649ebe8...", false, "blocked: tor exit nodes not allowed"]
///
/// …
class Nip20 {
static OKEvent? getOk(String okPayload) {
var ok = Message.deserialize(okPayload);
if(ok.type == 'OK'){
var object = jsonDecode(ok.message);
return OKEvent(object[0], object[1], object[2]);
}
}
}
late String eventId;
late bool status;
late String message;

/// Default constructor
Nip20(this.eventId, this.status, this.message);

class OKEvent {
String eventId;
bool status;
String message;
/// Serialize to nostr close message
/// - ["OK", "event_id", true|false, "message"]
String serialize() => jsonEncode(["OK", eventId, status, message]);

OKEvent(this.eventId, this.status, this.message);
}
/// Deserialize a nostr close message
/// - ["OK", "event_id", true|false, "message"]
Nip20.deserialize(input) {
assert(input.length == 4);
eventId = input[1];
status = input[2];
message = input[3];
}
}
38 changes: 32 additions & 6 deletions test/nips/nip_020_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,39 @@ import 'package:nostr/nostr.dart';
import 'package:test/test.dart';

void main() {
group('nip020', () {
test('getOk', () {
String okPayload =
'["OK", "b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30", true, ""]';
OKEvent? okEvent = Nip20.getOk(okPayload);
expect(okEvent!.status, true);
group('nip20', () {
test('Constructor', () {
var eventId =
"b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30";
var status = true;
var message = "";
var nip20 = Nip20(eventId, status, message);
expect(nip20.eventId, eventId);
expect(nip20.status, status);
expect(nip20.message, message);
});

test('serialize', () {
var eventId =
"b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30";
var status = true;
var message = "";
var stringNip20 = '["OK","$eventId",$status,"$message"]';
var nip20 = Nip20(eventId, status, message);
expect(nip20.serialize(), stringNip20);
});

test('deserialize', () {
var jsonNip20 = [
"OK",
"b1a649ebe8b435ec71d3784793f3bbf4b93e64e17568a741aecd4c7ddeafce30",
true,
""
];
var nip20 = Nip20.deserialize(jsonNip20);
expect(nip20.eventId, jsonNip20[1]);
expect(nip20.status, jsonNip20[2]);
expect(nip20.message, jsonNip20[3]);
});
});
}

0 comments on commit 5c8e29d

Please sign in to comment.