Pranor Standard Library

Reusable .pnr modules for common service patterns. Import what you need:

import { ok, notFound } from "stdlib/response.pnr"
import { requireAuth, bearerToken } from "stdlib/auth.pnr"

Module Index

ModuleExportsCategory
auth.pnrbearerToken, basicAuth, requireAuthSecurity
crypto.pnrhashPassword, verifyPassword, randomToken, randomHex, hmacSign, hmacVerifySecurity
jwt.pnrjwtEncode, jwtDecode, jwtIsExpiredSecurity
sanitize.pnrescapeHTML, stripTags, escapeSQL, sanitizeFilename, normalizeWhitespaceSecurity
ratelimit.pnrcreateLimiter, isAllowed, remaining, resetLimiterSecurity
validation.pnrrequired, isEmail, isURL, minLength, maxLength, validateFieldsInput
response.pnrok, created, badRequest, notFound, serverError, errorResponseHTTP
pagination.pnroffset, pageResponse, parsePageParamsHTTP
middleware.pnrcorsHeaders, requestId, logRequest, isPreflightHTTP
http_client.pnrgetJSON, postJSON, isSuccess, isClientError, isServerErrorHTTP
url.pnrencodeURI, parseQuery, buildQuery, joinPath, extractPathHTTP
datetime.pnrnow, timestamp, isExpired, formatDuration, sleepUtilities
strings_util.pnrslugify, truncate, capitalize, isEmpty, repeat, matchesUtilities
math.pnrmin, max, clamp, abs, percent, between, sum, averageUtilities
sort.pnrsortAsc, sortDesc, reverse, minOf, maxOfUtilities
collections.pnrgroupBy, unique, flatten, chunk, first, last, countWhereData
csv.pnrparseCSV, parseRow, toRow, toCSVData
diff.pnrhasChanged, fieldChanged, changeRecordData
env.pnrrequireEnv, envOrDefault, envInt, envBool, envExistsConfig
retry.pnrbackoffDelay, defaultMaxRetries, defaultBaseDelayResilience
circuit_breaker.pnrcreateBreaker, isOpen, recordSuccess, recordFailure, resetBreaker, failureCountResilience
queue.pnrcreateQueue, enqueue, dequeue, queueSize, queueIsEmptyResilience
events.pnron, emit, hasHandlerMessaging
metrics.pnrcounter, counterWithLabel, gauge, recordLatency, trackRequestObservability
testing_helpers.pnrassertEqual, assertNotNil, assertNil, assertContains, assertTrue, assertFalse, assertLengthTesting
health.pnrhealthy, unhealthy, degraded, buildHealthResponseOps
scheduler.pnrscheduleAfter, isScheduled, cancelSchedule, getDelayScheduling
webhook.pnrbuildPayload, sendWebhook, verifySignature, retryRecordIntegration
cors.pnrallowOrigin, allowAll, preflightResponse, isOriginAllowedHTTP
graceful.pnrinitShutdown, isShuttingDown, connectionOpened, connectionClosed, isDrainedOps
tracing.pnrtraceId, spanId, startSpan, endSpan, addTag, traceContextObservability
semaphore.pnrcreateSemaphore, tryAcquire, release, available, utilizationConcurrency
batch.pnrcreateBatch, addToBatch, batchSize, isBatchFull, flushBatchProcessing
idempotency.pnrcheckIdempotency, markProcessed, isProcessed, getProcessedResultReliability
job.pnrcreateJob, startJob, completeJob, failJob, jobStatusProcessing
feature_flags.pnrenableFlag, disableFlag, isEnabled, toggleFlag, initFlagConfig
config.pnrgetConfig, requireConfig, configInt, configBool, configList, hasConfigConfig
tenant.pnrextractTenant, tenantConfig, isTenantActive, tenantCacheKey, tenantFilterMulti-tenancy
dlq.pnrcreateDLQ, sendToDLQ, dlqSize, dlqHasItems, clearDLQReliability
audit.pnrauditLog, auditAction, auditAccess, auditAuth, auditDeniedCompliance
cache_patterns.pnrcacheKey, cacheGet, cacheSet, invalidate, invalidatePrefix, cacheTTL, computeIfAbsentCaching
pagination_cursor.pnrencodeCursor, decodeCursor, hasCursor, extractCursor, cursorResponse, cursorResponseWithHTTP
timeout.pnrwithDeadline, isTimedOut, remainingTime, startTimer, elapsed, hasExceededResilience
ip.pnrextractIP, isPrivate, isTrustedProxy, rateLimitKey, anonymizeIPSecurity
mask.pnrmaskEmail, maskPhone, maskCard, maskString, redactSecurity

Categories

Security

  • auth.pnr — Token extraction, bearer/basic auth, auth guards
  • crypto.pnr — Password hashing, HMAC signing, token generation
  • jwt.pnr — JWT encode/decode/expiry (lightweight; use pranor add github.com/golang-jwt/jwt/v5 for production)

HTTP

  • response.pnr — Standard HTTP response builders (ok, notFound, etc.)
  • pagination.pnr — Page offset calculation, response envelope
  • middleware.pnr — CORS headers, request ID generation, preflight detection
  • http_client.pnr — JSON GET/POST wrappers, status code helpers

Utilities

  • datetime.pnr — Timestamps, expiry checks, duration formatting
  • strings_util.pnr — Slugify, truncate, capitalize, pattern matching
  • collections.pnr — Array utilities (unique, flatten, chunk, first/last)

Config & Environment

  • env.pnr — Required env vars, defaults, type coercion (int/bool)

Resilience

  • retry.pnr — Exponential backoff calculation

Messaging

  • events.pnr — In-process event bus (emit/on pattern)

Testing

  • testing_helpers.pnr — Expressive assertions for test blocks

Operations

  • health.pnr — Custom health check builders
  • graceful.pnr — Shutdown state, connection draining, drain detection

Scheduling

  • scheduler.pnr — Dynamic runtime scheduling beyond every/cron

Integration

  • webhook.pnr — Outgoing webhook payloads, signature verification, retry records
  • cors.pnr — CORS header generation, origin checking, preflight responses

Concurrency

  • semaphore.pnr — Named semaphores with slot tracking and utilization metrics

Processing

  • batch.pnr — Accumulate-and-flush batch pattern with size tracking
  • job.pnr — Background job lifecycle (pending → running → completed/failed)

Reliability

  • idempotency.pnr — Idempotency key pattern for deduplication
  • dlq.pnr — Dead letter queue for failed message tracking

Multi-tenancy

  • tenant.pnr — Tenant extraction from requests, scoped config/cache/DB keys

Compliance

  • audit.pnr — Structured audit trail (actions, access, auth, denied events)

Usage Example

import { requireAuth, bearerToken } from "stdlib/auth.pnr"
import { ok, badRequest } from "stdlib/response.pnr"
import { required, isEmail } from "stdlib/validation.pnr"
import { envOrDefault } from "stdlib/env.pnr"

server envOrDefault("PORT", "8080")

route "POST" "/api/users" (req) {
    let authErr = requireAuth(req)
    if authErr != nil {
        return authErr
    }

    let errors = validate(req.body, {
        "email": "required,email",
        "name": "required"
    })
    if errors != nil {
        return badRequest(errors)
    }

    return ok({ "created": true })
}

Contributing

Add new modules as stdlib/<name>.pnr. Export functions with export fn. Follow existing patterns:

  • Pure functions where possible
  • No side effects unless explicitly documented
  • Use interface{} params (no type annotations) for maximum flexibility