Files
suaveplan/openspec/archive/2026-05-12-enterprise-server-network-gundb-server/proposal.md
2026-05-27 23:29:53 +01:00

3.2 KiB

OpenSpec Change: enterprise-server-network-gundb-server

  • Change ID: enterprise-server-network-gundb-server
  • Package: @suaveplan/network-gundb-server
  • Category: server/network
  • Target path: server/network/network-gundb-server
  • Status: SUPERSEDED-BY-GENESIS-WAVE
  • Date: 2026-04-24
  • Reference spec: /mnt/s/web/suaveplan/enterprise/network-gundb-server.md

Summary

Deliver @suaveplan/network-gundb-server on the genesis branch from scratch at enterprise quality. The package runs a Gun.js relay server over WebSockets, enabling decentralised real-time data sync for browser and server peers. It wraps Gun's GUN({web: server}) pattern into a typed GunServerAdapter with start / stop, get / put / on / off for direct data operations on the server side, and connection-count observability. Genesis adds Zod-validated options, @suaveplan/error codes, OTel gauges, structured logging, and full integration tests.


Current-state audit (genesis)

Does not exist on genesis — fresh build.


Available workspace deps on genesis

Package Role
@suaveplan/error (workspace:^) Typed NETWORK_GUNDB.* error codes
@suaveplan/types (workspace:^) LoggerLike
@suaveplan/logger (workspace:^) Structured logs
zod (catalog:forms) Options validation
@opentelemetry/api (catalog:observability) Gauges + counters
gun (catalog:network) Gun.js database/relay
tslib (catalog:build) Runtime helpers

Public API surface

class GunServerAdapter {
  constructor(options: GunServerOptions)
  start(): Promise<void>
  stop(): Promise<void>
  get<T = unknown>(path: string): Promise<T | undefined>
  put(path: string, data: unknown): Promise<void>
  on<T = unknown>(path: string, handler: (data: T, key: string) => void): () => void
  peerCount(): number
  isRunning(): boolean
  address(): { host: string; port: number } | undefined
}

function createGunServerAdapter(options: GunServerOptions): GunServerAdapter

interface GunServerOptions {
  port?: number              // default: 8765
  host?: string              // default: '0.0.0.0'
  peers?: string[]           // bootstrap relay URLs
  radisk?: boolean           // persist to disk, default: false
  logger?: LoggerLike
}

const GunServerOptionsSchema: z.ZodSchema<GunServerOptions>

type GunServerErrorCode =
  | 'NETWORK_GUNDB_START_FAILED'
  | 'NETWORK_GUNDB_STOP_FAILED'
  | 'NETWORK_GUNDB_PUT_FAILED'
  | 'NETWORK_GUNDB_GET_TIMEOUT'

function registerGunServerErrorCodes(): void

File layout

server/network/network-gundb-server/
  package.json
  tsconfig.json
  vitest.config.ts
  src/
    index.ts
    error-codes.ts
    constants/index.ts
    types/
      gundb-server.types.ts
      gundb-server.types.md
    adapter/
      gun-server-adapter/
        gun-server-adapter.ts
        gun-server-adapter.md
        gun-server-adapter.types.ts
        gun-server-adapter.test.ts
        index.ts
  tests/
    integration.test.ts

Impact

Downstream: real-time sync features, collaborative editing, offline-first client sync. Server-only.

Prerequisites on Verdaccio: @suaveplan/error, @suaveplan/types, @suaveplan/logger.