Commit Graph

141 Commits

Author SHA1 Message Date
Tristan B. Velloza Kildaire 4bee62e4e2 README
- Updated example
2023-10-02 15:56:59 +02:00
Tristan B. Velloza Kildaire b24c3368b3
Nextgen: Tristanable v2 (#4)
* - Added new logo to `README.md`
- Fixed typos in `README.md`
- Added new logo (source included)

* - Added `bformat` version `3.1.13` as dependency

* - Removed executable

* - Updated `.gitignore`

* - Use `https` link rather to `bformat` homepage

* Package (tristanable)

- Added public imports along with comments per each

Encoding

- Added a stub class, `TaggedMessage`, for encoding and decoding the tristanable byte payload

Exceptions

- Added `TristanableException` exception type along with the `Error` enum sub-type

Manager

- Added stub code for `Manager` to manage the queues and socket

Queue

- Added stub class representing a queue with a tag (`Queue`)

QueueItem

- Added stub class `QueueItem` which represents an item that is enqueued/dequeued onto a `Queue`

Watcher

- Added stub class `Watcher` which will manage the socket reading-wise

* Manager

- Added field `watcher` of type `Watcher`

* Watcher

- Added constructor which takes in an instance of `Manager` and an instance of `Socket`

* Manager

- Added unit test TODO

* - Moved `Watcher` and `Manager` modules to their own package
- Ensured `Watcher`'s constructor is package-level accessible only

Manager

- The constructor now creates an instance of `Watcher`
- Added a `start()` method which calls `watcher.start()`

* Manager

- Added stub `sendMessage(TaggedMessage)` which will encode into the tristanable format, then wrap into bformat and send over the socket
- Added import for `TaggedMessage` from `tristanable.encoding` module

* Package (tristanable)

- Added an import for `TaggedMessage` from module `tristanable.encoding`

* Encoding

- Added stub class `TaggedMessage`
- Added constructor, static decoder (unimplemented), `encoder (implemented), getters and setters
- Added module `tristanable.encoding`

* - Attempt merge

* Encoding

- Added parameter-less (default) constructor marked as `private` to `TaggedMessage`
- Added decoding support in `decode(byte[])` which will return a new instance of `TaggedMessage`
- Added a unit test to test encoding and decoding

* TaggedMessage

- Added documentation for fields `tag` and `data`
- Added documentation for both constructors
- Added documentation for `getPayload()`, `getTag()`, `setPayload(byte[])` and `setTag(ulong)`

* - Fixed formatting in `README.md`

* Watcher

- Added import for `bformat` and `encoding` module
- Documented `watch()`
- Added `bformat` read-and-decode `receiveMessage(Socket, ref byte[])` call followed by a `TaggedMessage.decode(byte[])` call

* Watcher

- Moved TODO below already completed code

Exceptions

- Renamed `Error` to `ErrorType`
- Constructing a new `TristanableException` will now store the passed in `ErrorType`
- Added `getError()` to `TristanableException` which returns the stored `ErrorType`
- Added two new memebrs to enum `ErrorType`, namely `QUEUE_NOT_FOUND` and `QUEUE_ALREADY_EXISTS`

* Manager

- Changed from using D's dynamic arrays for the array of `Queue` objects to using an `SList!(T)` where `T` is the `Queue` type
- Implemented `getQueue(ulong)` which returns the `Queue` object with the matching id/tag, else throws an instance of `TristanabaleException`
- Implemented `registerQueue(Queue)` which will attempt to add the provided `Queue` given that a queue does not already exist with the provided queue's id; if that is the case then an instance of `TristanableException` is thrown

Queue

- Made the constructor take in the `ulong` queue ID
- Made the constructor publically accessible
- Implemented `getID()` which returns the `Queue`'s id as a `ulong`
- Removed the static method `newQueue(ulong)`

Unit test

- Added a unit test to test `getQueue(ulong)` when the queue cannot be found
- Added a unit test to test adding a queue and successfully retrieving it

* Package (tristanable)

- Fixed up the `exceptions` module import

* Manager

- Removed now-completed TODO in `registerQueue(QUeue)`

* Manager

- Documented `registerQueue(Queue)`

* Exceptions

- Added new member `NO_DEFAULT_QUEUE` to enum `ErrorType`

* Queue

- The actual queue is now an `SList!(TaggedMessage)`
- Added a stub method `enqueue(TaggedMessage)`
- Updated the stub method `dequeue()` which returns a `TaggedMessage` now

* - Removed `QueueItem`

* Encoding

- Implemented `toString()` in `TaggedMessage`

* Manager

- Added a default queue
- `getQueue(ulong)` now calls `getQueue_nothrow(ulong)` with the same id
- Implemented `getQueue_nothrow(ulong)` which returns the `Queue` if found, `null` otherwise
- Added `getDefaultQueue()` which gets the default queue by calling `getDefaultQueue_nothrow(ulong)` with the same id
- Added `getDefaultQueue_nothrow(ulong)` which returns the default queue as a `Queue` object if it exists, else `null`
- Added `setDefaultQueue(Queue)` which sets the provided queue as the default queue (i.e. the queue where messages tagged with a tag of a queue not registered will be dumped into - if the default queue is set)

Watcher

- Set the worker thread, `watch`, in the constructor
- Added a TODO relating to checking if the socket read succeeded or not
- Added a debug print for the received `TaggedMessage` post-decode
- Extract the tag of the message and find the matching queue (potentially, if it exists)
- If the queue exists then add the `TaggedMessage` to said `Queue`
- If the queue doesn't exist then, get the so-called "Default queue", if it doesn't exist don't do anything, if it does then enqueue the message (the `TaggedMessage`) to said `Queue`

Unit test

- Added a unit test (WIP) for testing the `Manager` and `Watcher` mechanism
- Updated unittest to test the `getQueue_nothrow(ulong)` method
- Added a unit test to test adding a `Queue` with a tag that already exists in a `Queue` registered prior

* Queue

- Added imports for `std.stdio` and `to` from `std.conv` to be imported when compiling in `unittest` mode
- Added documentation to `enqueue(TaggedMessage)`
- Implemented `enqueue(TaggedMessage)` using libsnooze
- Added documentation for `dequeue()`
- Implemented `dequeue()` using libsnooze

* Queue

- Replaced now-completed TODO with an actual comment in `dequeue()`

* Queue

- Added entrance and exit debugs for `dequeue()`

* Manager

- Clean up I guess

* Unit test (Watcher)

- Unit test for watcher works

* Watcher

- Deleted old module that was unused

* Package

- Removed completed TODO

* Exceptions

- Removed unused enum member `QueueExists` of enum `ErrorType`

* Encoding

- Added module-level documentation

Exceptions

- Added module-level documentation

Queue

- Added module-level documentation

Package (`tristanable.manager`)

- Added module-level documentation

* Manager

- Implemented `getUniqueQueue()` which finds an unused tag, makes a `Queue` with said tag, registers it and then returns it
- WIP: `shutdown()` method

* Manager

- Added unittest for `getUniqueQueue()`
- Typo fix

* Manager

- Removed empty unittest

* Config

- Added new module `config`
- Added new type `Config` which is used for configuring an instance of `Manager`
- Added `defaultConfig()` which returns the default `Config` instance used

* Config

- Make the default configuration generated more explicit in `defaultConfig`
- Remove initialization in `Config` (would be `false` in any case)

* Manager

- Added support for configuring the `Manager`, the constructor now uses the default configuration
- Implemented `registerQueue_nothrow(Queue)` which returns `true` on success, `false` otherwise
- `registerQueue(Queue)` now makes a sub-call to `registerQueue_nothrow(Queue)`
- Implemented `sendMessage(TaggedMessage)`
- Added comment for assertions in unittest

* Package (`manager`)

- Import the `Config` type and the `defaultConfig()` function

* Watcher

- Added stub `shutdown()` method that is intended to be called by `Manager` (package-level accessible)

Unit tests

- Sleep for 4 seconds instead of 2 before the server sends the two tagged messages
- Send a messae tagged with tag `42` before that of the one tagged with `69`
- Register a queue with tag `42`
- Remove `WaitingThread`, we now receive both tagged messages (`42` and `69`) on the unittest thread
- Added assertion to ensure the tagged message of `69` is indeed received correctly (tag AND payload)

* Queue

- Added documentation for the constructor `this(ulong)`
- Fixed issue #5

Unit tests

- The `==` operator on strings does some normalization stuff which results in differing byte sequences and therefore inequality (see the `"Cucumber 😳️"` case), therefore casting to `byte[]`
- Send another message tagged with `69`
- Fixed comment for server code sending tagged `42` message
- Call `manager.stop()` right at the end of the unit test

* Watcher

- Added package-level accessible `startWatcher()` method which calls `start()` for us
- Added some debugging prints which will now only be compiled-in during unittest builds
- If the bformat `receiveMessage(Socket, ref byte[])` method fails (returns `false`) then exit the loop, only continue decoding if it is `true`
- Implemented package-level accesible `shutdown()` method

Manager

- `start()` now calls `watcher.startWatcher()` instead of `watcher.start()`

* Unit test

- Sleep a little longer for profiling tests

* Watcher

- Documented unittest as it is a great example of how to sue tristanable

* Exceptions

- Documented `ErrorType` and all its members
- Documented `TristanableException`

* Exceptions

- Added missing documentation
- Fixed the message generation of the exception's message

* Manager

- Added documentation for `start()` and `stop()`

* Manager

- Removed now-completed TODO
- Added documentation for `queuesLock`

* Watcher

- Added documentation to the constructor for `Watcher`

* Watcher

- Documented module `tristanable.manager.watcher`

* Queue

- Docuemneted `getId()`
- Documented the `Queue` class
- Documented fields `event`, `queue` and `queueLock`

* Package

- Removed whitespace

* Watcher

- Documented method `shutdown()`

* - Upgraded to new `bformat` version `4.1.0` and migrated to using `BClient` (unit tests seem to pass)

* Manager

- Added a TODO for the future `removeQueue(Queue)` and `removeQueu_nothrow(Queue)`

* Manager

- Implemented `releaseQueue(Queue)`
- Implemented `releaseQueue_nothrow(Queue)`

Unit tests

- Added unit test for `releaseQueue(Queue)`

* Unit tests

- Added a TODO

* Dub

- Now requires a minimum version of `libsnooze` of at least `
1.0.0-beta`

* Queue

- Be specific, catch `FatalException` in `enqueue(TaggedMessage)`
- Be specific, catch `InterruptedException` and `FatalException` seperately

* Exceptions

- Added enum members `DEQUEUE_FAILED` and `ENQUEUE_FAILED` to `ErrorType` enum

* Queue

- `enqueue(TaggedMessage)` can now throw a `TristanableException` if a `FataException` with `libsnooze` occurrs
- `dequeue()` can now throw a `TristanableException` if a `FatalException` occurs during the call to `wait()` on `libsnooze`

* Dub

- Required minimum version of `bformat`, `4.1.0`

* Dub

- Upgraded `libsnooze` to version `1.3.0-beta`

* Migrate from libsnooze (#8)

* Dub

- Removed `libsnooze` dependency

* Queue

- Removed `libsnooze` imports

* Queue

- Added mutex+condition variable

* Queue

- Removed old `ensure()` call

* Queue

- Switched one thing over to mutex+condvar

* Queue

- Switched to using condition variable
- Added configurable slumber interval

* Queue

- Removed TODOs which are irrevevant for now

* Queue

- Removed `TListener` references

Everything else

- Removed reference to old/duplicate `queue.d` module

* Hotfix/niknaks (#9)

* Dub

- Added `niknaks` package with a minimum version of `v0.3.0`

* Encoding

- Switched to niknaks for `decode()`

* Encoding

- `encode()` now uses niknaks

* Watcher (unit tests)

- Added testing for default queue
2023-10-02 15:49:54 +02:00
Tristan B. Velloza Kildaire a23017a747 README
- Added badges
2023-10-01 19:14:16 +02:00
Tristan B. Velloza Kildaire 459f4a8709 Pipelines
- Added code coverage
2023-10-01 19:10:57 +02:00
Tristan B. Velloza Kildaire 79432cef6c
Enable CI for `nextgen` branch
- Run CI tests for any pull requests being made to the `nextgen` branch
2023-05-04 09:46:46 +02:00
Tristan B. Velloza Kildaire c43ed31ca9
Update README.md 2023-04-30 19:24:24 +02:00
Tristan B. Velloza Kildaire fb36497bda
Create d.yml 2023-04-30 19:23:22 +02:00
Tristan B. Velloza Kildaire 153512e9ab Dub
- Upgraded `libsnooze` to version `0.3.3`
2023-03-19 18:06:37 +02:00
Tristan B. Velloza Kildaire 01a5d779c8 Package
- Added a title to the documentation to better describe what this library does

Dub

- Updated package description
- Added project website link
2023-03-03 17:49:32 +02:00
Tristan B. Velloza Kildaire f8aa3b92cf Package
- Added imports that should be publically imported (exported into the user)
2023-03-03 17:47:23 +02:00
Tristan B. Velloza Kildaire 8828e3ffdd Manager
- Added an array of `Queue`(s) to the manager

Queue

- Added comments
- Initialize the libsnooze `Event` during construction of the `Queue` type

Dub

- Upgraded libsnooze from `0.2.7` to `0.2.9`

Repository

- Removed `dub.selections.json` file
- Added `dub.selections.json` to the `.gitignore`
2023-03-03 17:44:51 +02:00
Tristan B. Velloza Kildaire e7f93cd78a - Upgraded to working version of `libsnooze` (compilation-wise)
- Fixed imports and missing definitions in `queue` module
2023-02-26 22:24:49 +02:00
Tristan B. Velloza Kildaire cf431bdac9 - Updated author's name in package details 2023-02-26 21:55:38 +02:00
Tristan B. Velloza Kildaire 17da826d07 Restarting project 2023-02-26 21:55:13 +02:00
Tristan B. Velloza Kildaire 586835a627 Removed this bitch ass hoe 2022-03-19 13:51:31 +02:00
Tristan B. Velloza Kildaire e59dca0c4d this.flags was not set, resulting in the default .init for QueuePolicy being used and enforcing LENGHT_CAPPING by default even when default behaviour should be not to, per the constructors (this()'s) parameters 2022-03-19 13:29:32 +02:00
Tristan B. Velloza Kildaire ad99ef63d9 Added TODO 2021-09-09 16:18:16 +02:00
Tristan B. Velloza Kildaire b58fb718a7 Added some comments 2021-09-09 16:09:27 +02:00
Tristan B. Velloza Kildaire ddd46f3388 Added some comments 2021-09-09 18:02:45 +02:00
Tristan B. Velloza Kildaire df4d479e54 Throw an exception when trying to remove a queue with an id not in use by any queue 2021-09-09 18:01:14 +02:00
Tristan B. Velloza Kildaire 0c43e80cf6 Throw an exception when trying to add a queue with an id already in use by another queue 2021-09-09 18:00:59 +02:00
Tristan B. Velloza Kildaire 26bdcf7d83 Added comment 2021-09-09 11:30:44 +02:00
Tristan B. Velloza Kildaire c241d06ea9 Added `poll()` which lets user check if the queue is empty or not 2021-09-09 11:21:19 +02:00
Tristan B. Velloza Kildaire 9c7d15dc89 corrected last commit 2021-09-08 22:09:48 +02:00
Tristan B. Velloza Kildaire e1c28d9c11 Added `getSocket()` method to the Manager class 2021-09-08 22:08:03 +02:00
Tristan B. Velloza Kildaire b4bf4d5af5 Fixed bug for shutdowns 2021-09-08 20:54:34 +02:00
Tristan B. Velloza Kildaire e5a0a280bc Changed API 2021-09-08 20:50:22 +02:00
Tristan B. Velloza Kildaire b060b30c44 Added `sendMessage` to bformat encode the final t-encoded message 2021-09-08 20:45:39 +02:00
Tristan B. Velloza Kildaire ce3772c66c Reverted 2021-09-08 20:28:14 +02:00
Tristan B. Velloza Kildaire 256c6154cc Test 2021-09-08 20:27:11 +02:00
Tristan B. Velloza Kildaire 372d4cdc78 Upgraded bforat 2021-09-08 20:24:50 +02:00
Tristan B. Velloza Kildaire 1b88d1f8bf Added some exceptional stuff 2021-09-08 20:24:45 +02:00
Tristan B. Velloza Kildaire 6382343916 Marked todo item as done 2021-09-08 19:23:44 +02:00
Tristan B. Velloza Kildaire 4316d4817f Marked todo item as completed 2021-09-08 19:23:23 +02:00
Tristan B. Velloza Kildaire 88be3d08e3 Added exception class
ALso added `getQueues()` function
2021-09-08 19:21:33 +02:00
Tristan B. Velloza Kildaire d9e5e54477 Added some todos for later 2021-09-08 14:29:27 +02:00
Tristan B. Velloza Kildaire 4f83991baf Added the ability to delete a queue
Updated todo
2021-09-08 14:24:58 +02:00
Tristan B. Velloza Kildaire 6d133a15ba Updated todo 2021-09-08 14:08:22 +02:00
Tristan B. Velloza Kildaire 6a00c620ec Cleaned up import 2021-09-08 14:07:56 +02:00
Tristan B. Velloza Kildaire a3ca66db2b Added the ability to set a max length for queues 2021-09-08 14:06:38 +02:00
Tristan B. Velloza Kildaire 3ce8bda7de Clean up 2021-09-08 13:51:28 +02:00
Tristan B. Velloza Kildaire 7ba3c9f1f7 Added package.d 2021-09-08 13:49:41 +02:00
Tristan B. Velloza Kildaire 445e008603 `generateQueue()` now uses new `isValidTag(ulong)` 2021-09-08 13:47:53 +02:00
Tristan B. Velloza Kildaire d48cc4267e Clean up 2021-09-08 13:47:04 +02:00
Tristan B. Velloza Kildaire 3103adcb0f Removed uneeded function 2021-09-08 13:46:57 +02:00
Tristan B. Velloza Kildaire e8d4e0ae20 addQueue() now uses recursive mutex capabilities with re-impkemented `isValidTag()` 2021-09-08 13:46:38 +02:00
Tristan B. Velloza Kildaire ea32c7eef4 Re-implemented `isValidTag(ulong)` 2021-09-08 13:46:05 +02:00
Tristan B. Velloza Kildaire 384f286f83 Use recursive mutex capabilities 2021-09-08 13:42:25 +02:00
Tristan B. Velloza Kildaire 7a60a31e0a Added `generateQueue()` to create random queues for those who don't care about reserved ids 2021-09-08 13:40:39 +02:00
Tristan B. Velloza Kildaire a193993c0d Updated dub files 2021-09-08 13:34:01 +02:00