diff --git a/dub.json b/dub.json index 1f2fe98..3e0a8db 100644 --- a/dub.json +++ b/dub.json @@ -4,7 +4,8 @@ ], "copyright": "Copyright © 2023, Tristan B. Kildaire", "dependencies": { - "bformat": ">=4.1.1" + "bformat": ">=4.1.1", + "niknaks": ">=0.3.0" }, "description": "Tristanable network message queuing framework", "homepage": "https://deavmi.assigned.network/projects/tristanable", diff --git a/source/tristanable/encoding.d b/source/tristanable/encoding.d index 8af5329..6fec612 100644 --- a/source/tristanable/encoding.d +++ b/source/tristanable/encoding.d @@ -4,6 +4,7 @@ module tristanable.encoding; import std.conv : to; +import niknaks.bits : bytesToIntegral, Order, order, toBytes; /** * Represents a tagged message that has been decoded @@ -60,31 +61,9 @@ public final class TaggedMessage /* The decoded tag */ ulong decodedTag; - /* If on little endian then dump direct */ - version(LittleEndian) - { - decodedTag = *cast(ulong*)encodedMessage.ptr; - } - /* If on big endian then reverse received 8 bytes */ - else version(BigEndian) - { - /* Base of our tag */ - byte* tagHighPtr = cast(byte*)decodedTag.ptr; - - *(tagHighPtr+0) = encodedMessage[7]; - *(tagHighPtr+1) = encodedMessage[6]; - *(tagHighPtr+2) = encodedMessage[5]; - *(tagHighPtr+3) = encodedMessage[4]; - *(tagHighPtr+4) = encodedMessage[3]; - *(tagHighPtr+5) = encodedMessage[2]; - *(tagHighPtr+6) = encodedMessage[1]; - *(tagHighPtr+7) = encodedMessage[0]; - } - /* Blessed is the fruit of thy womb Jesus, hail Mary, mother of God, pray for our sinners - now and at the hour of our death - Amen */ - else - { - pragma(msg, "Not too sure about tha 'ey 😳️"); - } + /* Take ulong-many bytes and only flip them to LE if not on LE host */ + decodedTag = order(bytesToIntegral!(ushort)(cast(ubyte[])encodedMessage), Order.LE); + /* Set the tag */ decodedMessage.setTag(decodedTag); @@ -106,41 +85,9 @@ public final class TaggedMessage /* The encoded bytes */ byte[] encodedMessage; - /* If on little endian, then dump 64 bit as is - little endian */ - version(LittleEndian) - { - /* Base (little first) of tag */ - byte* basePtr = cast(byte*)&tag; + /* If on little endian then no re-order, if host is BE flip (the tag) */ + encodedMessage ~= toBytes(order(tag, Order.LE)); - encodedMessage ~= *(basePtr+0); - encodedMessage ~= *(basePtr+1); - encodedMessage ~= *(basePtr+2); - encodedMessage ~= *(basePtr+3); - encodedMessage ~= *(basePtr+4); - encodedMessage ~= *(basePtr+5); - encodedMessage ~= *(basePtr+6); - encodedMessage ~= *(basePtr+7); - } - /* If on big endian, then traverse 64-bit number in reverse - and tack on */ - else version(BigEndian) - { - /* Base (biggest first) of tag */ - byte* highPtr = cast(byte*)&tag; - - encodedMessage ~= *(highPtr+7); - encodedMessage ~= *(highPtr+6); - encodedMessage ~= *(highPtr+5); - encodedMessage ~= *(highPtr+4); - encodedMessage ~= *(highPtr+3); - encodedMessage ~= *(highPtr+2); - encodedMessage ~= *(highPtr+1); - encodedMessage ~= *(highPtr+0); - } - /* Hail marry, mother of God, pray for our sinners, now and at the our of our death Amen */ - else - { - pragma(msg, "Not feeling scrumptious homeslice 😎️"); - } /* Tack on the data */ encodedMessage ~= data; diff --git a/source/tristanable/manager/watcher.d b/source/tristanable/manager/watcher.d index b766482..f07518f 100644 --- a/source/tristanable/manager/watcher.d +++ b/source/tristanable/manager/watcher.d @@ -204,6 +204,28 @@ unittest writeln("server send status: ", bClient.sendMessage(tEncoded)); writeln("server send [done]"); + + /** + * Create a tagged message to send + * + * tag 100 payload Bye + */ + message = new TaggedMessage(100, cast(byte[])"DEFQUEUE_1"); + tEncoded = message.encode(); + writeln("server send status: ", bClient.sendMessage(tEncoded)); + + writeln("server send [done]"); + + /** + * Create a tagged message to send + * + * tag 200 payload Bye + */ + message = new TaggedMessage(200, cast(byte[])"DEFQUEUE_2"); + tEncoded = message.encode(); + writeln("server send status: ", bClient.sendMessage(tEncoded)); + + writeln("server send [done]"); } } @@ -223,6 +245,10 @@ unittest manager.registerQueue(sixtyNine); manager.registerQueue(fortyTwo); + // Register a default queue (tag ignored) + Queue defaultQueue = new Queue(2332); + manager.setDefaultQueue(defaultQueue); + /* Connect our socket to the server */ client.connect(server.localAddress); @@ -252,6 +278,19 @@ unittest assert(dequeuedMessage.getPayload() == cast(byte[])"Cucumber 😳️"); + /* Dequeue two messages from the default queue */ + writeln("unittest thread: Dequeue() blocking..."); + dequeuedMessage = defaultQueue.dequeue(); + writeln("unittest thread: Got '"~dequeuedMessage.toString()~"' decode payload to string '"~cast(string)dequeuedMessage.getPayload()~"'"); + assert(dequeuedMessage.getTag() == 100); + assert(dequeuedMessage.getPayload() == cast(byte[])"DEFQUEUE_1"); + + writeln("unittest thread: Dequeue() blocking..."); + dequeuedMessage = defaultQueue.dequeue(); + writeln("unittest thread: Got '"~dequeuedMessage.toString()~"' decode payload to string '"~cast(string)dequeuedMessage.getPayload()~"'"); + assert(dequeuedMessage.getTag() == 200); + assert(dequeuedMessage.getPayload() == cast(byte[])"DEFQUEUE_2"); + /* Stop the manager */ manager.stop(); diff --git a/source/tristanable/package.d b/source/tristanable/package.d index 022b740..7e0fbf8 100644 --- a/source/tristanable/package.d +++ b/source/tristanable/package.d @@ -11,7 +11,6 @@ public import tristanable.manager; /** * A queue of queue items all of the same tag - * and queue-related facilities */ public import tristanable.queue.queue : Queue;