diff --git a/lib/src/message.dart b/lib/src/message.dart index 7cdfc00..99acf5a 100644 --- a/lib/src/message.dart +++ b/lib/src/message.dart @@ -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; diff --git a/lib/src/nips/nip_020.dart b/lib/src/nips/nip_020.dart index cf75f0f..7b51506 100644 --- a/lib/src/nips/nip_020.dart +++ b/lib/src/nips/nip_020.dart @@ -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); -} \ No newline at end of file + /// 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]; + } +} diff --git a/test/nips/nip_020_test.dart b/test/nips/nip_020_test.dart index 3588225..a4e643a 100644 --- a/test/nips/nip_020_test.dart +++ b/test/nips/nip_020_test.dart @@ -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]); + }); }); }