Skip to content

knuddelsgmbh/KnuddelsServerLocal

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Knuddels UserApps Test-Umgebung

Lokale Sandbox zum Entwickeln und Testen von Knuddels UserApps ohne FTP-Upload.

Setup

npm install
npm run dev

Das öffnet:

UserApp registrieren

Externe Ordner (empfohlen)

Die UserApp bleibt in ihrem eigenen Projektordner — egal wo auf der Platte, mit eigenem Git-Repo, eigener Build-Pipeline. Du registrierst nur den Pfad, der Watcher zieht Änderungen live rein. Kein Kopieren, keine Symlinks, kein Vermischen mit dem Server-Repo.

Registriert wird das Repo-Root der App (der Ordner mit package.json). Die gebauten Artefakte werden daraus als <repo-root>/dist abgeleitet (main.js + www). Den App-Namen (= App-ID, unter der die App im Server registriert wird) gibst du beim Registrieren direkt mit an — eine app.config ist nicht nötig.

Drei Wege, einen Pfad zu registrieren:

  1. Debug-UI → Apps-Panel → "Externen Ordner hinzufügen" App-Namen + Pfad eingeben (oder Ordner per Drag-&-Drop / Picker auswählen, App-Name wird aus dem Ordnernamen vorgeschlagen). Auswahl wird in .test-env/external-apps.json persistiert und beim nächsten Start automatisch wieder eingehängt.
  2. Env-Var KS_EXTERNAL_APPS — komma-separiert. Pro Eintrag entweder /pfad/zur/app (App-Name = Ordnername) oder appname=/pfad/zur/app für einen abweichenden Namen:
    KS_EXTERNAL_APPS=/Users/me/work/my-app,other=/Users/me/work/foo npm run dev
  3. Direkt die JSON editieren.test-env/external-apps.json enthält ein Array entries: [{ path, appId, liveSource?, frontendDevPort? }, …]. path ist das Repo-Root. Mit liveSource: true aktivierst du den Live-Source-Modus (siehe unten), frontendDevPort setzt den Port des Dev-Servers (Default 3100). Der alte Schlüssel hotReload wird weiterhin als liveSource gelesen (Back-Compat).

apps/-Ordner (Fallback, FTP-Style)

Wer keinen externen Ordner nutzen will, kann eine App direkt unter apps/<app-id>/ ablegen — wie ein FTP-Upload. Der Ordnername IST die App-ID:

apps/
└── meine-app/
    ├── main.js          # Server-Logik
    └── www/
        └── index.html   # Frontend

Eine app.config darf weiterhin liegen (z.B. mit appName= / appVersion= für Metadaten), wird aber nicht mehr für die Registrierung benötigt.

Inhalte von apps/ sind per .gitignore ausgeschlossen, der Ordner selbst bleibt versioniert (via .gitkeep).

In beiden Fällen lädt der Watcher Änderungen automatisch neu.

Live Source (Frontend HMR + Backend)

„Live Source" bezeichnet, woher diese Test-Umgebung eine App bedient: entweder live aus zwei Watch-Prozessen (Frontend ks start mit HMR + Backend yarn watch) oder eingefroren aus dem gebauten dist/-Ordner.

Nicht zu verwechseln mit dem Knuddels-Plattform-Konzept „Hot Reload" (das die App-eigene Debug-UI dauerhaft als „an" anzeigt). Das ist eine andere Sache und wird hier nur gemockt; der Live-Source-Schalter steuert ausschließlich die lokale Quelle.

Für externe Apps mit "liveSource": true startet der Test-Server beim npm run dev automatisch zwei Watch-Prozesse im Repo-Root der App (du musst im App-Repo selbst nichts starten):

  • Frontend: ks start (CRA Dev-Server mit React Fast Refresh) auf frontendDevPort (Default 3100). Der Test-Server proxyt diesen Dev-Server über seine /app/:appId/*-Route, ersetzt dabei im HTML den echten Knuddels-API-Loader (statischer <script>-Tag und der inline per document.write injizierte cdnc-Apploader) durch den lokalen Client-Shim — so spricht das HMR-Frontend mit dem lokalen Backend (über /__ws), nicht mit der Knuddels-Infrastruktur. Frontend-Änderungen erscheinen per HMR direkt im iframe, ohne Full-Rebuild.
  • Backend: yarn watch (inkrementeller webpack-Build) schreibt dist/main.js; der bestehende Datei-Watcher lädt daraufhin die Sandbox neu. Backend-Änderungen brauchen so Sekunden statt eines vollen Builds.

Pro Session umschaltbar: Im Tab Apps & Sessions hat jede Session-Kachel neben ↻ / × einen ● LIVE / ○ dist-Schalter. Er wirkt App-weit (eine Dev-Server-Instanz pro App) und ist nur für externe App-Ordner mit Repo-Root verfügbar. Der Schalter ändert nur, was angezeigt wird (Proxy auf den Dev-Server vs. statisches dist/) — die Watch-Prozesse werden beim ersten Einschalten einmal gestartet und bleiben danach warm. Das erste Einschalten zeigt daher kurz „booting…" (bis ks start antwortet, dann lädt das iframe automatisch neu); jedes spätere Umschalten ist sofort. Gestoppt werden die Prozesse erst beim Entfernen der App oder beim Beenden des Servers. Die Wahl wird in external-apps.json persistiert (außer bei per Env-Var registrierten Apps).

Hinweis: Im dist-Modus läuft yarn watch im Hintergrund weiter, d.h. das Backend bleibt live (rebuildet dist/main.js); nur das Frontend wird aus dem gebauten dist/www statt vom HMR-Dev-Server bedient.

Wichtig zu den Ports: Der Test-Server selbst belegt :3000, deshalb läuft ks start lokal auf :3100. Der Port wird vom Test-Server per PORT-Env beim Spawnen gesetzt — im App-Repo wird nichts geändert. Dein normaler Knuddels-Workflow (yarn start auf :3000 + /userapphotreload …:3000) bleibt unberührt.

Voraussetzung: Im App-Repo sind die Dependencies installiert (ks-Bin unter node_modules/.bin) und es existieren die Scripts start (= ks start) und watch (webpack --watch des Backends). ks start spawnt intern react-devtools; fehlt das Binary, würde der Dev-Server crashen — der Test-Server stellt deshalb einen No-op-Stub via PATH voran (src/server/dev/stubs/).

Start aus dem App-Repo (yarn start-local)

Die App kann den Test-Server auch selbst hochfahren — als Alternative zum klassischen yarn start (Knuddels-Dev-Server). Dafür im App-Repo:

  • local-test-env.json (Repo-Root): { "testEnvPath": "C:/…/KnuddelsServerLocal", "appId": "Crash", "frontendDevPort": 3100 }. Diese Datei ist git-ignored (pro-Dev unterschiedlicher Pfad); committed ist local-test-env.example.json als Vorlage. start-local legt die Datei beim ersten Lauf automatisch aus der Vorlage an — danach nur noch testEnvPath anpassen.
  • scripts/start-local.mjs liest diese Config und spawnt im testEnvPath npm run dev:local mit KS_EXTERNAL_APPS=<appId>=<repoRoot>, KS_LIVE_SOURCE=1, KS_FRONTEND_DEV_PORT und KS_BACKEND_WATCH_SCRIPT=watch-local.
  • package.json-Scripts "start-local": "node scripts/start-local.mjs" und "watch-local" (webpack --watch ohne das update-version-timestamp- Bracketing, damit die Versionsdatei lokal nicht „dirty" wird).

Backend-Watch-Script (KS_BACKEND_WATCH_SCRIPT): Welches yarn-Script den inkrementellen Backend-Build fährt, ist konfigurierbar (Default watch). Crashs watch-Script klammert webpack mit update-version-timestamp.js (set → build → reset) — da webpack --watch aber nie zurückkehrt, läuft der Reset nie und die Versionsdatei bleibt verändert. start-local zeigt deshalb auf watch-local, das die Versionierung gar nicht erst anfasst (wie das klassische yarn start).

yarn start-local registriert die App also automatisch im Live-Source-Modus (Quelle: Env-Var, read-only — überschreibt/dedupliziert einen persistierten Eintrag mit gleichem dist/-Pfad). Der Test-Server bleibt generisch: jedes App-Repo kann ihn auf die gleiche Weise mit seinem eigenen Pfad starten.

Was simuliert werden kann

Über die Debug-UI:

  • User anlegen, in Channel joinen / leaven
  • Public/Private Messages, Action Messages senden
  • Slash-Commands (/...) triggern
  • Beliebige appEvent-Frames vom Frontend simulieren
  • AppContent-Frame im iframe öffnen + Frontend-↔-Backend-Events live verfolgen
  • Persistenz-JSON (.test-env/persistence/<appId>.json) live einsehen + editieren

Nicht-Ziele

Keine 100%ige Knuddels-Treue (kein Rhino, keine ES5-Limits, kein echtes Threading-Modell). Sinn ist schnelles iteratives Entwickeln.

About

Ermöglicht Knuddels Api zu mocken, Fake Users zu erstellen und Hotreload für Server und vieles mehr

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 98.0%
  • CSS 1.7%
  • Other 0.3%