bowmap-2 Server List Ping
Bowmap · bowmap.git · Tickets
A Bowmap Ticket (Closed):
Ticket · History
- September 7, 2026 Created (title: Server List Ping)
Changes
@@ -0,0 +1,40 @@+---+title: Server List Ping+permalink: bowmap/server-list-ping/+ticket: open+---++*A [[bowmap-tickets|Bowmap Ticket]] (Open):*++[[bowmap-git|Git branch]]: `ticket/server-list-ping`++## Implementation++- [x] Project structure+- [x] TCP server+- [x] Add packets+- [x] Add stream frame functions+- [x] Add packet codecs+- [x] Add packet encoding and decoding functions+- [ ] Handle clients joining+- [ ] Handle packets from clients+- [ ] Test functions+- [ ] Respond to SLP via packet+- [ ] Turn relevant packet into fact++Related & Causing:+- [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented+- [ ] Codecs are untested+- [ ] Packet encoding and decoding is untested+- [ ] Stream functions are untested+- [ ] Packet definitions+- [x] Client sockets are never closed, even when client ends up in a bad state, and when the client disconnects.+- [x] `println` is used for logging.+- [x] Error message is sent when clients should cleanly disconnect+- [x] Client phase update is not atomic and could fail? (I don't think this is a concern)+- [x] Clientbound status response packet has no JSON validation (not a big deal)+- [x] nils are propagated through `net.bowmap.network.frame.writers/to-writer`+- [x] Client `::receive-packet` is not thread-safe+- [x] Client phase is never updated+- [x] Reader and writer functions are not documented despite being unintuative+- [x] Can't cache packet readers without REPL reloading problems / Packet schema lookup is inefficient (not a known problem) - September 9, 2026 Edited
Changes
@@ -16,20 +16,34 @@ - [x] Add stream frame functions - [x] Add packet codecs - [x] Add packet encoding and decoding functions-- [ ] Handle clients joining-- [ ] Handle packets from clients-- [ ] Test functions+- [x] Accept packets from clients+- [x] Move protocol level stuff to protocol namespaces/Great namespace shuffle to net.bowmap.server+- [ ] Decouple packet order from definition in `serverbound-packets` and `clientbound-packets` namespaces. Could keep the one map, just not include the unused packet schemas, use a spec to maybe not have the schema, and then add the compiled writers found from the schemas to the var meta for fast access (kinda 2 ideas, use 2 commits)+- [ ] Test all functions - [ ] Respond to SLP via packet - [ ] Turn relevant packet into fact +Potential:+- [ ] Look into using a core.async-based networking library and just a transducer. Then you can have a `net.bowmap.network.frame` namespace that has the frame transducer and explains what a frame even is+- How to send packets to players:+ - Either give players a channel where packets can be sent+ - Or just give players a uuid and maybe that uuid maps to a client that packets can be sent to+ - Best would probably be to have one thing in control of sending out packets so that it can't just be done anywhere. Return packets from functions and have them be sent as a top level IO wrapper+ Related & Causing:+- [ ] Packet definitions couple schema with protocol order. split back out into two things again - a list of packet ids in each phase, and either a map of id to schema, or a map of phases to maps of id to schema, but that is only for the login disconnect packet so it's not really all that important at all. The coupling of these two packets was purely done to make the code smaller, which is never a good idea or a good reasoning. - [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented - [ ] Codecs are untested - [ ] Packet encoding and decoding is untested - [ ] Stream functions are untested-- [ ] Packet definitions+- [ ] Connection handling failing can close the server+- [ ] `println` is used for logging.+- [ ] It is unclear what keys a client has (missing a spec)+- [ ] `net.bowmap.server.network.server` has too many responsibilities+- [ ] Legacy Ping is unsupported+- [ ] Move packet definitions to an edn file+- [x] Protocol code unrelated to networking is in `net.bowmap.network.*` - [x] Client sockets are never closed, even when client ends up in a bad state, and when the client disconnects.-- [x] `println` is used for logging. - [x] Error message is sent when clients should cleanly disconnect - [x] Client phase update is not atomic and could fail? (I don't think this is a concern) - [x] Clientbound status response packet has no JSON validation (not a big deal) - September 11, 2026 Edited
Changes
@@ -23,14 +23,18 @@ - [ ] Respond to SLP via packet - [ ] Turn relevant packet into fact +- [ ] Handle packets+- [ ] Move magical packet stream stuff into the actual handler. Take `(client, packet)` and return `[client', [event*]]`+ Potential:-- [ ] Look into using a core.async-based networking library and just a transducer. Then you can have a `net.bowmap.network.frame` namespace that has the frame transducer and explains what a frame even is+- [ ] Look into using a core.async-based networking library and just a transducer. Then you can have a `net.bowmap.network.frame` namespace that has the frame transducer and explains what a frame even is (explain why not) - How to send packets to players: - Either give players a channel where packets can be sent - Or just give players a uuid and maybe that uuid maps to a client that packets can be sent to - Best would probably be to have one thing in control of sending out packets so that it can't just be done anywhere. Return packets from functions and have them be sent as a top level IO wrapper Related & Causing:+- [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior. - [ ] Packet definitions couple schema with protocol order. split back out into two things again - a list of packet ids in each phase, and either a map of id to schema, or a map of phases to maps of id to schema, but that is only for the login disconnect packet so it's not really all that important at all. The coupling of these two packets was purely done to make the code smaller, which is never a good idea or a good reasoning. - [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented - [ ] Codecs are untested@@ -42,6 +46,8 @@ - [ ] `net.bowmap.server.network.server` has too many responsibilities - [ ] Legacy Ping is unsupported - [ ] Move packet definitions to an edn file+- [ ] Enable TCP_NODELAY+- [x] `socket` namespace is not generic, and actually starts a Minecraft server, not just a "socket". Could make `socket` generic and pass a "framer" for clarity. Or just map `connection` over the channel. - [x] Protocol code unrelated to networking is in `net.bowmap.network.*` - [x] Client sockets are never closed, even when client ends up in a bad state, and when the client disconnects. - [x] Error message is sent when clients should cleanly disconnect - September 14, 2026 Edited
Changes
@@ -18,13 +18,13 @@ - [x] Add packet encoding and decoding functions - [x] Accept packets from clients - [x] Move protocol level stuff to protocol namespaces/Great namespace shuffle to net.bowmap.server-- [ ] Decouple packet order from definition in `serverbound-packets` and `clientbound-packets` namespaces. Could keep the one map, just not include the unused packet schemas, use a spec to maybe not have the schema, and then add the compiled writers found from the schemas to the var meta for fast access (kinda 2 ideas, use 2 commits)+- [x] Move magical packet stream stuff into the actual handler. Take `(client, packet)` and return `[client', [packet*]]`+- [x] Respond to SLP via packet+- [x] Make `net.bowmap.server.protocol.schema` for keys.+- [x] Add MOTD with text components+- [x] Clean up packet definitions. - [ ] Test all functions-- [ ] Respond to SLP via packet-- [ ] Turn relevant packet into fact--- [ ] Handle packets-- [ ] Move magical packet stream stuff into the actual handler. Take `(client, packet)` and return `[client', [event*]]`+- [ ] Turn relevant packets into events? Potential: - [ ] Look into using a core.async-based networking library and just a transducer. Then you can have a `net.bowmap.network.frame` namespace that has the frame transducer and explains what a frame even is (explain why not)@@ -34,19 +34,26 @@ - Best would probably be to have one thing in control of sending out packets so that it can't just be done anywhere. Return packets from functions and have them be sent as a top level IO wrapper Related & Causing:+- [ ] Move true TCP-level concern to `net.bowmap.tcp.*`, and use a stateful transducer to frame packets in a clearer way - [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior.-- [ ] Packet definitions couple schema with protocol order. split back out into two things again - a list of packet ids in each phase, and either a map of id to schema, or a map of phases to maps of id to schema, but that is only for the login disconnect packet so it's not really all that important at all. The coupling of these two packets was purely done to make the code smaller, which is never a good idea or a good reasoning. - [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented - [ ] Codecs are untested - [ ] Packet encoding and decoding is untested - [ ] Stream functions are untested+- [ ] Should a protocol + `reify` be used to make connections?+- [ ] Server list ping player count numbers do not update++Make into separate tickets:+- [ ] Legacy Ping is unsupported - [ ] Connection handling failing can close the server - [ ] `println` is used for logging.-- [ ] It is unclear what keys a client has (missing a spec)-- [ ] `net.bowmap.server.network.server` has too many responsibilities-- [ ] Legacy Ping is unsupported-- [ ] Move packet definitions to an edn file-- [ ] Enable TCP_NODELAY++Finished:+- [x] Packet definitions couple schema with protocol order. split back out into two things again - a list of packet ids in each phase, and either a map of id to schema, or a map of phases to maps of id to schema, but that is only for the login disconnect packet so it's not really all that important at all. The coupling of these two packets was purely done to make the code smaller, which is never a good idea or a good reasoning.+- [x] What exactly the numeric id and payload of a frame are is not clear. These are technically specified in the serverbound and clientbound packet namespaces, but not in an obvious way.+- [x] `net.bowmap.server.network.server` has too many responsibilities+- [x] Enable TCP_NODELAY+- [x] It is unclear what keys a client has (missing a spec) - [x] `socket` namespace is not generic, and actually starts a Minecraft server, not just a "socket". Could make `socket` generic and pass a "framer" for clarity. Or just map `connection` over the channel. - [x] Protocol code unrelated to networking is in `net.bowmap.network.*` - [x] Client sockets are never closed, even when client ends up in a bad state, and when the client disconnects. - September 15, 2026 Edited
Changes
@@ -34,7 +34,7 @@ - Best would probably be to have one thing in control of sending out packets so that it can't just be done anywhere. Return packets from functions and have them be sent as a top level IO wrapper Related & Causing:-- [ ] Move true TCP-level concern to `net.bowmap.tcp.*`, and use a stateful transducer to frame packets in a clearer way+- [ ] Move true TCP-level concern to `net.bowmap.tcp.*`, and use a stateful transducer to frame packets in a clearer way? - [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior. - [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented - [ ] Codecs are untested - September 15, 2026 Edited
Changes
@@ -35,7 +35,7 @@ Related & Causing: - [ ] Move true TCP-level concern to `net.bowmap.tcp.*`, and use a stateful transducer to frame packets in a clearer way?-- [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior.+- [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior (I think) - [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented - [ ] Codecs are untested - [ ] Packet encoding and decoding is untested - September 15, 2026 Edited
Changes
@@ -36,19 +36,26 @@ Related & Causing: - [ ] Move true TCP-level concern to `net.bowmap.tcp.*`, and use a stateful transducer to frame packets in a clearer way? - [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior (I think)-- [ ] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented+- [ ] Rename `to-reader` and `to-writer` to `->reader` and `->writer`+- [ ] Reader and writers look the same as functions that return readers and writers (this may be fine, not sure) - [ ] Codecs are untested - [ ] Packet encoding and decoding is untested - [ ] Stream functions are untested-- [ ] Should a protocol + `reify` be used to make connections?-- [ ] Server list ping player count numbers do not update Make into separate tickets: - [ ] Legacy Ping is unsupported - [ ] Connection handling failing can close the server - [ ] `println` is used for logging.+- [ ] Server list ping player count numbers do not update Finished:+- [x] It is hard to find serverbound and clientbound packet definitions from `packet.clj`.+- [x] "Schema" is not defined anywhere (add spec)+- [x] "Schema" is an overloaded term. It refers to both the shape of a packet (its keys), and the definition of the packet codec (which can be a codec or a table). Come up with a better name for the latter. Or make a `Reader` and `Writer` protocol and support vectors?+- [x] Normalize codecs as always being functions rather than sometimes being vectors+- [x] "Codec" is not defined anywhere (specs has been added)+- [x] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented+- [x] Should a protocol + `reify` be used to make connections? (no, I think it's more coupled than channels are, though could be useful for some things) - [x] Packet definitions couple schema with protocol order. split back out into two things again - a list of packet ids in each phase, and either a map of id to schema, or a map of phases to maps of id to schema, but that is only for the login disconnect packet so it's not really all that important at all. The coupling of these two packets was purely done to make the code smaller, which is never a good idea or a good reasoning. - [x] What exactly the numeric id and payload of a frame are is not clear. These are technically specified in the serverbound and clientbound packet namespaces, but not in an obvious way. - [x] `net.bowmap.server.network.server` has too many responsibilities - September 16, 2026 Edited
Changes
@@ -10,6 +10,7 @@ ## Implementation +Tasks: - [x] Project structure - [x] TCP server - [x] Add packets - September 16, 2026 Edited
Changes
@@ -10,6 +10,8 @@ ## Implementation +This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap-rewrite|rewrite]].+ Tasks: - [x] Project structure - [x] TCP server@@ -25,7 +27,6 @@ - [x] Add MOTD with text components - [x] Clean up packet definitions. - [ ] Test all functions-- [ ] Turn relevant packets into events? Potential: - [ ] Look into using a core.async-based networking library and just a transducer. Then you can have a `net.bowmap.network.frame` namespace that has the frame transducer and explains what a frame even is (explain why not)@@ -37,19 +38,19 @@ Related & Causing: - [ ] Move true TCP-level concern to `net.bowmap.tcp.*`, and use a stateful transducer to frame packets in a clearer way? - [ ] Packet that should generally only be sent once to the server may be sent multiple times, which differs from vanilla behavior (I think)-- [ ] Rename `to-reader` and `to-writer` to `->reader` and `->writer` - [ ] Reader and writers look the same as functions that return readers and writers (this may be fine, not sure)-- [ ] Codecs are untested - [ ] Packet encoding and decoding is untested-- [ ] Stream functions are untested+- [x] Stream functions are untested Make into separate tickets:-- [ ] Legacy Ping is unsupported+- [x] Legacy Ping is unsupported - [ ] Connection handling failing can close the server-- [ ] `println` is used for logging.+- [x] `println` is used for logging. - [ ] Server list ping player count numbers do not update+- [x] Codecs are untested Finished:+- [x] Rename `to-reader` and `to-writer` to `->reader` and `->writer` - [x] It is hard to find serverbound and clientbound packet definitions from `packet.clj`. - [x] "Schema" is not defined anywhere (add spec) - [x] "Schema" is an overloaded term. It refers to both the shape of a packet (its keys), and the definition of the packet codec (which can be a codec or a table). Come up with a better name for the latter. Or make a `Reader` and `Writer` protocol and support vectors? - September 16, 2026 Edited
Changes
@@ -1,16 +1,16 @@ --- title: Server List Ping permalink: bowmap/server-list-ping/-ticket: open+ticket: closed --- -*A [[bowmap-tickets|Bowmap Ticket]] (Open):*+*A [[bowmap-tickets|Bowmap Ticket]] (closed):* [[bowmap-git|Git branch]]: `ticket/server-list-ping` ## Implementation -This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap-rewrite|rewrite]].+This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap-rewrite|rewrite]]? Tasks: - [x] Project structure@@ -53,7 +53,7 @@ - [x] Rename `to-reader` and `to-writer` to `->reader` and `->writer` - [x] It is hard to find serverbound and clientbound packet definitions from `packet.clj`. - [x] "Schema" is not defined anywhere (add spec)-- [x] "Schema" is an overloaded term. It refers to both the shape of a packet (its keys), and the definition of the packet codec (which can be a codec or a table). Come up with a better name for the latter. Or make a `Reader` and `Writer` protocol and support vectors?+- [x] "Schema" is an overloaded term. It refers to both the shape of a packet (its keys), and the definition of the packet codec (which can be a codec or a table). Come up with a better name for the latter. Or make a `Reader` and `Writer` protocol and support vectors? - This notion was removed, and codecs are always used instead. - [x] Normalize codecs as always being functions rather than sometimes being vectors - [x] "Codec" is not defined anywhere (specs has been added) - [x] Packets, frames, codecs, readers, writers, and schemas are undefined and undocumented - October 10, 2026 Edited
Changes
@@ -10,7 +10,7 @@ ## Implementation -This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap-rewrite|rewrite]]?+This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap@3|rewrite]]? Tasks: - [x] Project structure - October 20, 2026 Change formatting
Changes
@@ -6,7 +6,7 @@ *A [[bowmap-tickets|Bowmap Ticket]] (closed):* -[[bowmap-git|Git branch]]: `ticket/server-list-ping`+[[bowmap.git|Git branch]]: `ticket/server-list-ping` ## Implementation - October 21, 2026 Update the rest of the ticket pages to use numbers (renamed from bowmap-server-list-ping.md, status: none → closed, type: none → addition, resolution: none → unknown)
Changes
@@ -1,11 +1,12 @@ --- title: Server List Ping-permalink: bowmap/server-list-ping/-ticket: closed+status: closed+type: addition+resolution: unknown+redirect_from:+ - bowmap/server-list-ping/ --- -*A [[bowmap-tickets|Bowmap Ticket]] (closed):*- [[bowmap.git|Git branch]]: `ticket/server-list-ping` ## Implementation - October 23, 2026 Remove trailing slashes
Changes
@@ -4,7 +4,7 @@ type: addition resolution: unknown redirect_from:- - bowmap/server-list-ping/+ - bowmap/server-list-ping --- [[bowmap.git|Git branch]]: `ticket/server-list-ping` - October 24, 2026 Rename tickets to <project>-<number> <title> (renamed from bowmap@2.md, title: Server List Ping → none)
Changes
@@ -1,5 +1,4 @@ ----title: Server List Ping status: closed type: addition resolution: unknown@@ -11,7 +10,7 @@ ## Implementation -This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap@3|rewrite]]?+This ticket served as the basis of the project for a while, and included much more than just server list ping. This work will probably be moved to [[bowmap-3 Rewrite]]? Tasks: - [x] Project structure - October 24, 2026 Replace ticket status, category and resolution with ticket (status: closed → none, resolution: unknown → none)
Changes
@@ -1,7 +1,6 @@ ----status: closed+ticket: closed type: addition-resolution: unknown redirect_from: - bowmap/server-list-ping ---