NEX IN CAPSULEPRESS

2024-10-18

I've added Nex support to CapsulePress!

What does that mean?
Nex is a lightweight Internet protocol reminiscent to me of Spartan (which
CapsulePress also supports), but even more lightweight. Without even
affordances like host identification, MIME types, response codes, or the
expectation that Gemtext might be supported by the client, it's perhaps more
like Gopher than it is like Gemini.

It comes from the ever-entertaining smolweb hub of Nightfall City, whose Web
interface clearly states at the top of every page the command you could have
run to see that content over the Nex protocol. Lagrange added support for Nex
almost a year ago and it's such a lightweight protocol that I was quickly able
to adapt CapsulePress's implementation of Spartan to support Nex, too.

require 'gserver'
require 'word_wrap'
require 'word_wrap/core_ext'

class NexServer < GServer
  def initialize
    super(
      (ENV['NEX_PORT'] ? ENV['NEX_PORT'].to_i                           :
1900),
      (ENV['NEX_HOST']                                                 ||
'0.0.0.0'),
      (ENV['NEX_MAX_CONNECTIONS'] ? ENV['NEX_MAX_CONNECTIONS'].to_i : 4)
    )
  end

  def handle(io, req)
    puts "Nex: handling"
    io.print "\r\n"
    req = '/' if req == ''
    if response = CapsulePress.handle(req, 'nex')
      io.print response[:body].wrap(79)
    else
      io.print "Document not found\r\n"
    end
  end

  def serve(io)
    puts "Nex: client connected"
    req = io.gets.strip
    handle(io, req)
  end
end

This is genuinely the entirety of my implementation of my Nex server, atop
CapsulePress. And it's mostly boilerplate.

Why, you might ask? Well, the reasons are the same as all the other standards
supported by CapsulePress:
* The smolweb is awesome.
* Making WordPress into a CMS things it was never meant to do is sorta my jam.
* It was a quick win while I waited for the pharmacist to shoot me up with 5G
microchips my 'flu and Covid boosters.

If you want to add Nex onto your CapsulePress, just git pull the latest
version, ensure TCP port 1900 isn't firewalled, and don't add USE_NEX=false to
your environment. That's all!

LINKS
Nex
CapsulePress
Gemini
Lagrange
Spartan
Nightfall City