Compare commits

...
12 Commits
Author SHA1 Message Date
DogFatherGitandClaude Opus 5 2a6008d699 Versionsstempel auf 202609211145
chat.css hat sich geaendert. Ohne den Stempel behaelt jeder Browser
seine alte Kopie, und die groesseren Farbkacheln kaemen bei niemandem
an. 505 Verweise in 37 Dateien.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 11:45:23 +02:00
DogFatherGitandClaude Opus 5 8bd6474844 Die Farbkacheln im Chat waren mit dem Daumen zu klein
30x30 ist mit der Maus bequem und am Handy zu klein; die Grenze im Haus
sind 44px. Angehoben wird nur auf Fingergeraeten (pointer: coarse),
sonst staende der Knopf am Rechner unnoetig gross neben einer Zeile,
die selbst nur 30 hoch ist. Sichtbar bleibt die Kachel gleich gross --
gewachsen ist die Flaeche, die den Finger annimmt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 11:45:06 +02:00
DogFatherGitandClaude Opus 5 e12074c32c Der Stempel wird mit der Uhr verglichen, nicht mit dem Commit
pruef-zwischenspeicher verlangte, dass derselbe Commit die Stilvorlage
UND die HTML aendert. Das ist der Normalfall, aber nicht die Regel:
Wird der Stempel in einem Folge-Commit nachgezogen, kommt die Aenderung
genauso an -- die Pruefung blieb trotzdem rot und beschuldigte einen
Commit, an dem nichts falsch war. Eine rote Zeile, die rot bleibt,
bringt Menschen dazu, Rot zu uebersehen.

Verglichen wird jetzt der Stempel selbst mit dem Zeitpunkt der letzten
Aenderung an assets/. Ein Stempel, der juenger ist, wurde danach
gezogen -- egal in welchem Commit. Das ist strenger als vorher, nicht
lockerer: Eine HTML-Aenderung aus einem ganz anderen Grund (ein
Tippfehler im Text) haette die alte Pruefung besaenftigt, ohne dass der
Stempel gezogen wurde.

Dazu ein Fund am Rand: anruf-probe.html trug ein handgeschriebenes
?v=202609191018 am Manifest-Link. Kein Werkzeug pflegt diese Stelle,
keine der 20 anderen Seiten hat so etwas -- sie waere still veraltet.
Entfernt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 11:45:06 +02:00
DogFatherGitandClaude Opus 5 200728c8e7 Der leere Ring zeigte "100 %" -- das las sich wie "alles geschafft"
Die Pruefung verlangte prozent === 100, wenn gar nichts zu tun war. Der
Gedanke war richtig (ein leerer Ring darf nicht wie Versagen aussehen),
die Umsetzung nicht: Gelesen wird zuerst die Zahl in der Mitte, und
"100 %" heisst fuer jeden Menschen "fertig". Am ersten Tag, ohne eine
einzige Aufgabe, stand das als groesstes Element der Startseite.

Seit dem 19.09. steht dort ein Strich. Ein Anteil von nichts ist keine
Null und keine Hundert, sondern nicht definiert. Die Pruefung fragt
jetzt danach -- und damit gleichzeitig schaerfer: Solange gar keine Zahl
dasteht, kann dort auch nicht versehentlich der Uhrzeitwert stehen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 11:44:55 +02:00
DogFatherGitandClaude Opus 5 782a9116f2 Zwei Pruefungen rechneten in UTC und schlugen abends falschen Alarm
pruef-zeitraum und pruef-highlights bildeten ihren Tagesstempel mit
toISOString(). Das ist UTC. Zwischen 22:00 und Mitternacht deutscher
Zeit ist das schon der naechste Tag -- die Pruefungen verglichen dann
einen Eintrag von heute mit dem Datum von morgen und meldeten einen
Fehler, wo keiner war.

Der Zeitraum-Filter im Haus rechnet richtig; er benutzt tagLokal() aus
helfer-zeit.mjs. Nur die Pruefungen darueber hatten ihre eigene, falsche
Rechnung. Jetzt benutzen sie denselben Helfer wie der Code, den sie
pruefen -- damit koennen die beiden gar nicht mehr auseinanderlaufen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 11:44:55 +02:00
DogFatherGitandClaude Opus 5 acd3e1f385 Zwei Tabellenumbauten haetten 15 Spalten still geloescht
`personen` und `aufgaben` wurden beim Freischalten eines neuen
CHECK-Werts von Hand neu gebaut -- die Spaltenliste stand zweimal im
Code abgeschrieben (CREATE und INSERT). Gemessen:

  aufgaben: 23 Spalten, 18 aufgezaehlt -> vorlage, kategorie,
            aus_eintrag_id, aufwand, aus_punkt weg
  personen: 19 Spalten,  9 aufgezaehlt -> bild, ueber_mich, tiktok,
            instagram, youtube, twitch, chat_kachel, code_kennung,
            stufe, alter_bestaetigt_am weg

Bei `personen` haengen daran die Profilfotos und die
Altersbestaetigung: Alle waeren nach einem Rueckspielen still wieder
unbestaetigt gewesen, ohne Fehlermeldung, bei unveraenderter
Zeilenzahl. Die Zeilenzaehlung, die als Sicherung gedacht war, kann
einen Spaltenverlust gar nicht sehen.

Es ist derselbe Fehler wie am 11.09. an der Eintragstabelle (24 hinein,
21 heraus). Damals wurde `checkListeErweitern` gebaut, das die Spalten
aus PRAGMA table_info ABLEITET -- eine Liste, die niemand pflegt, kann
nicht veralten. Diese beiden Bloecke waren aelter und wurden bei der
Umstellung uebersehen. Jetzt gehen alle 16 Umstellungen denselben Weg,
kein Neubau zaehlt mehr von Hand.

Auf dem laufenden Server ist nichts verloren (24 Spalten, CHECK
vollstaendig) -- die Falle stand fuer den Tag, an dem jemand eine
Sicherung zurueckspielt.

Gefunden hat es nicht das Lesen, sondern pruef-abbrechen: Sie baut
absichtlich eine ALTE Datenbank und liess die Umstellung darauf laufen
-- danach meldete der Server "no such column: a.aufwand".

Neu: pruef-umstellung.mjs (18 Pruefungen) haelt die Fehlerklasse
dauerhaft zu. Sie baut eine echte alte Datenbank mit gefuellten
Spalten, laesst die Umstellung laufen und zaehlt danach Spalten UND
Inhalte. Mit Gegenprobe: ein absichtlich fehlerhafter Umbau zeigt, dass
die Zeilenzahl dabei stimmt und trotzdem Daten fehlen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-21 11:44:45 +02:00
DogFatherGitandClaude Opus 5 0082c74bd7 Versionsstempel nachgezogen
pruef-zwischenspeicher hat es gemeldet: Der Commit davor hat
Stilvorlagen und Skripte geaendert, aber keine HTML -- damit bleibt
der Verweis `?v=...` stehen, der Browser haelt seine alte Kopie fuer
aktuell (ein Jahr, unveraenderlich), und die Reparatur kaeme bei
niemandem an.

Genau der Fall, fuer den die Pruefung gebaut wurde: Ein Deploy, der
fehlerfrei durchlaeuft und trotzdem nichts ausliefert.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 23:14:14 +02:00
DogFatherGitandClaude Opus 5 67a0eb8717 DogFather konnte einen zweiten DogFather nicht mehr herabstufen
Gefunden beim Durchsehen der schnellen Pruefungen: pruef-haus-trennung
stand auf 60 ok / 6 Fehler. Drei Ursachen, eine davon ein echter
Rueckschritt von gestern.

--- 1. DER RUECKSCHRITT ---------------------------------------------

In darfRolleAendern stand seit gestern:

  if (person.rolle === "admin") return ziel.rolle !== "admin";

Das macht aus "DogFather ist nicht mehr VERGEBBAR" ein "an einem
DogFather ist nichts mehr zu aendern". Ein zweiter Zugang liess sich
damit nie wieder zuruecksetzen -- er waere fuer immer DogFather
geblieben. Die Pruefung sagte es woertlich: "solange es zwei gibt,
darf einer wechseln (403)".

Die beiden echten Gefahren haengen woanders und bleiben unberuehrt:
Niemand KANN 'admin' vergeben, und der LETZTE DogFather laesst sich
nicht herabstufen.

--- 2. ZWEI SCHLOESSER FUER DIESELBE TUER ---------------------------

Ich hatte gestern `rollenZumAendern` mit 403 VOR die vorhandene
Pruefung gesetzt, die mit 400 "Unbekannte Rolle." antwortet. Damit war
die Luecke wieder offen, vor der der Kommentar vom 17.09. direkt
daneben warnt: Zwei verschiedene Antworten -- "gibt es nicht" gegen
"darfst du nicht" -- verraten beim Durchprobieren, WELCHE Rollen
existieren.

Jetzt eine Regel an einer Stelle. `darfAnlegen` ist dort raus, weil
Vergeben und Anlegen seit gestern verschiedene Dinge sind. Gemessen:

  admin   anlegen = aendern (sieben Rollen)
  spicy   anlegen = aendern (vier)
  hand    anlegen = —        aendern = modi, gast
  manager anlegen = creator  aendern = —

Und die eigene Zeile bekommt jetzt 400 mit einem Satz statt 403:
Es ist keine Rechtefrage, sondern eine unsinnige Bitte.

--- 3. DREI ERWARTUNGEN, DIE AELTER WAREN ALS DIE REGEL --------------

Die Pruefung verlangte 403, wo seit dem 17.09. 400 richtig ist --
ihre Zeile stammt vom 10.09., sieben Tage aelter als die Regel. Und
sie verlangte 404 fuer "die rechte Hand vergibt keine Rolle", was bis
vorgestern stimmte.

Dabei fiel auf, dass NICHTS geprueft hat, ob die rechte Hand ihre neue
Faehigkeit ueberhaupt ausueben kann -- nur, dass sie es nicht darf.
Eine Pruefung, die nur das Verbotene misst, laesst offen, ob das
Erlaubte geht. Jetzt beide Richtungen:

  an einer anderen rechten Hand aendert sie nichts (403)
  und an DogFather erst recht nicht (403)
  einen Modi macht sie sehr wohl zur Community (200)
  und es steht so in der Datenbank (gast)
  eine zweite rechte Hand ernennt sie nicht (400)

Nebenbei: `unbekannte_kachel` (gestern eingefuehrt) hatte keinen Satz
in meldung.js -- die Kennung waere woertlich auf dem Bildschirm
gelandet. pruef-meldungen hatte es gemeldet.

Und ein Absturz beim Bauen: `const anlegen = await hole(...)` weiter
unten im selben Block verdeckt die gleichnamige Funktion im GANZEN
Block, auch oberhalb seiner eigenen Zeile.

pruef-haus-trennung: 70 ok, 0 Fehler (vorher 60/6).
Dazu gruen: rollen-anlegen 11/0, personen-loeschen 40/0,
rechte-umstellen 46/0, verteilen 11/0, meldungen 8/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 23:13:27 +02:00
DogFatherGitandClaude Opus 5 445ea88f2b fetch verweigert Port 5060 -- und sagt dasselbe wie ein toter Server
Nach der Umstellung auf abgeleitete Nummern bekam pruef-chat-kanaele
die 5060 und stuerzte ab:

  TypeError: fetch failed

Der Server lief nachweislich ("Server laeuft auf http://127.0.0.1:5060"),
die Anmeldung ueber `http.request` hatte sogar geklappt, und BASIS war
sauber ("http://127.0.0.1:5060", 21 Zeichen, PORT eine Zahl). Nur die
`fetch`-Aufrufe scheiterten.

5060 ist SIP und steht auf der "bad ports"-Liste der
Fetch-Spezifikation. Node hat sie uebernommen: `fetch` baut dorthin
keine Verbindung auf, noch bevor ein Paket fliegt. Die Ursache steht
nur in `.cause` -- "bad port" statt "ECONNREFUSED". Die Meldung
obendrueber ist beide Male dieselbe, und wer sie liest, sucht am
Server.

Gegengeprueft mit einem echten Zuhoerer auf beiden Nummern:
  5060 -> fetch failed (bad port)
  5062 -> fetch failed (ECONNREFUSED)   <- also normal erreichbar

`eigenerPort` ueberspringt die gesperrten Nummern jetzt (portNummer).
Uebersprungen wird nach der REGEL, nicht nach einer Tabelle von
Sonderfaellen: die n-te brauchbare Nummer ab 5000. Eindeutig bleibt es,
weil die Reihenfolge feststeht.

pruef-portnummern (11 statt 8) prueft es doppelt: gegen die Liste UND
am echten Verhalten -- ein Zuhoerer auf 5060 muss fuer `fetch` tot
sein, einer auf einer abgeleiteten Nummer erreichbar. Ohne die zweite
Haelfte waere die Liste nur eine Behauptung ueber Node, und
Behauptungen altern.

Nebenbefund: Auch im alten, von Hand vergebenen Bereich lag eine
gesperrte Nummer -- die 4190. Sie war nie vergeben, rein zufaellig.

pruef-chat-kanaele: 79 Pruefungen, 0 Fehler -- wieder auf der
Grundlinie, die vor der Umstellung gemessen wurde.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 23:06:52 +02:00
DogFatherGitandClaude Opus 5 aa8842e72e Zwei Pruefungen waren rot, weil Namen sich geaendert hatten
Beide meldeten seit Tagen einen Fehler, den es nicht gab. Eine rote
Pruefung, die rot BLEIBT, gewoehnt einem das Hinsehen ab -- ab da
uebersieht man auch die echte.

--- pruef-teilen: 14 ok / 3 Fehler -> 27 ok / 0 --------------------

Sie suchte `.teilen__brett`. Die Seite baut `.tl-brett`; die Klassen
wurden irgendwann umbenannt, und die Pruefung suchte seitdem nach
Elementen, die es nicht gibt. Gemeldet hat sie das sogar richtig --
"drei Ziele zur Auswahl (0)" --, nur hat niemand die Klammer gelesen.
Danach lief sie in einen Klick-Zeitablauf und brach ab, weswegen
DREIZEHN weitere Pruefungen nie stattfanden.

--- pruef-crew-wand-bild: 41 ok / 4 Fehler -> 45 ok / 0 ------------

Zwei feste Erwartungen aus einer Zeit, die vorbei ist:

1. `/Team Dogi/` im Reiter. Die App heisst seit dem Treff-Umzug
   "DogFather Universe". Statt den neuen Namen einzutragen -- und
   damit dieselbe Zeitbombe mit neuem Datum zu stellen -- kommt er
   jetzt aus `crew.webmanifest`. Benennt jemand die App um, folgt der
   Reiter, und beides bleibt gruen. Weichen sie auseinander, sieht der
   Mensch im Reiter einen anderen Namen als auf seinem
   Startbildschirm, und genau das soll die Pruefung finden.

2. `kacheln === 3`, seit Filipe am 10.09. sagte "3 rollen. dogfather.
   rechte hand und modis". Am 19.09. zog der Treff in Team Dogi ein
   und die Community kam als vierte dazu -- die Zahl war ab da falsch,
   die Wand richtig. Verglichen wird jetzt die MENGE der Rollen, nicht
   ihre Anzahl: Eine Zahl sagt beim Scheitern "3 erwartet, 4
   gefunden" und verschweigt, WELCHE.

Beide Male war die Seite richtig und die Pruefung veraltet -- das ist
dieselbe Krankheit wie bei den Portnummern und bei pruef-entwicklung:
ein Name oder eine Zahl, abgeschrieben an einer zweiten Stelle, die
niemand mitpflegt.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 22:55:41 +02:00
DogFatherGitandClaude Opus 5 6e46a08543 Portnummern werden abgeleitet, nicht mehr vergeben
Gemessen: 165 Pruefdateien, 129 verschiedene Nummern -- NEUNZEHN
doppelt, vier davon dreifach. Niemand hatte das gewollt; jede neue
Pruefung wurde von einer vorhandenen abgeschrieben, und die Nummer kam
mit. Meine eigene Notiz sagte "sieben" -- auch eine Bestandsliste
altert.

Der Waechter faengt den Schaden ab, aber er kann nur melden, was schon
passiert ist: Zwei Pruefungen mit derselben Nummer koennen nie
gleichzeitig laufen, und ein liegengebliebener Prozess der einen laesst
die andere abbrechen mit einer Meldung, die wie ein Befund aussieht.
Genau das ist mir am 20.09. zweimal passiert.

Jetzt leitet jede Datei ihre Nummer aus ihrer STELLE IM ALPHABET ab
(eigenerPort in helfer-port.mjs), zwei je Datei. Nicht ueber eine
Pruefsumme: Bei 165 Namen in 4900 Nummern waeren nach dem
Geburtstagsproblem rund DREI Zusammenstoesse zu erwarten -- ein Hash
tauscht eine sichtbare Doppelung gegen eine unsichtbare. Die Stelle im
Alphabet ist eindeutig von der Bauart her.

--- ZWEI FEHLER AUF DEM WEG, BEIDE LEHRREICH -------------------------

1. DER ERSTE VERSUCH WAR GRUEN UND KAPUTT. Ersetzt wurde mit einem
   Muster: "([^"]*4231[^"]*)". Das hielt

     { host: "127.0.0.1", port: 4231, path: "/404.html" }

   fuer eine Zeichenkette -- ein Muster kann eine oeffnende nicht von
   einer schliessenden Anfuehrung unterscheiden. Heraus kam

     { host: "127.0.0.1`, port: ${PORT}, path: `/404.html" }

   also GUELTIGER Code ohne port-Feld. `node --check` sagte gruen fuer
   alle 164 Dateien. Aufgefallen ist es erst, weil ich vier Vertreter
   gegen eine vorher gemessene Grundlinie laufen liess: pruef-schranke
   39/0 vorher, 38/1 nachher.

   Alles zurueckgenommen und mit einem Zerleger neu gemacht, der weiss,
   ob eine Stelle Code, Zeichenkette, Vorlage, Kommentar oder
   regulaerer Ausdruck ist. In pruef-ics stand die Nummer in einem
   regulaeren Ausdruck -- der wird jetzt gebaut statt hingeschrieben.

2. EIN MODUL, DAS BEIM IMPORTIEREN ARBEITET, IST EINE FALLE. Der
   zweite Durchgang importierte den ersten, um seine Mechanik zu
   benutzen -- und fuehrte dessen Hauptlauf gleich mit aus. Die
   zweiten Nummern wurden dadurch als erste behandelt, zwei Aufrufe
   bekamen dieselbe Nummer, und in pruef-content stand `const PORT`
   zweimal.

--- WAS DAS DAUERHAFT HAELT -----------------------------------------

pruef-portnummern.mjs (neu, 8 Pruefungen) fragt nicht "welche Nummern
sind doppelt", sondern "wer traegt ueberhaupt noch eine von Hand ein"
und "wer startet einen Server, ohne seine Nummer abzuleiten". Die
zweite Frage hat sofort etwas gefunden, das in KEINER Doppelungsliste
stand: pruef-push-weg belegte 4341 und 4342, rief den Waechter aber
gar nicht auf -- dieselbe Nummer wie pruef-agentur. Eine Liste zeigt
nur, was auf ihr steht.

Mit Gegenprobe: Eine unbekannte Datei bekommt keine geratene Nummer,
sondern einen Abbruch, und eine dritte Nummer je Datei gibt es nicht.

--- NACHGEMESSEN ----------------------------------------------------

Sechzehn Pruefungen gegen ihre vorher gemessene Grundlinie, je eine
Vertreterin jeder umgestellten Bauweise (eine Nummer, zwei Nummern,
Nummer in einer Zeichenkette, in einer Vorlage, in einem regulaeren
Ausdruck, dynamische Einfuhr, Nachtlauf mit zwei Laeufen):

  crew-adresse 132/0 · schranke 39/0 · content 45/0 · entwicklung 46/0
  anruf 127/0 · ics 37/0 · push-weg 20/0 · arten 28/0 · video 67/0
  kanalzeile 14/0 · agentur 62/0 · spicy 83/0 · creator-anlegen 50/0
  push-ziel 10/0 · portnummern 8/0

Alle exakt wie vorher. Zwei waren schon vorher rot und sind es
unveraendert geblieben (crew-wand-bild 41/4, teilen 14/3) -- per
`git stash` belegt, nicht angenommen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 22:51:21 +02:00
DogFatherGitandClaude Opus 5 d79cb9196b Die Entwicklungs-Pruefung war rot, ohne dass etwas kaputt war
Sie hielt seit dem 19.09. eine Namensliste fest:

  !["Eure Aufgaben", "Talente"].includes(k.name)

Als ein Modi eine eigene Kachel bekam -- "Deine Aufgaben", weil
"Eure" aus seiner Sicht falsch ist -- wurde sie rot. Nichts war
kaputt, der Name hatte sich geaendert. Das ist die abgeschriebene
Liste zum dritten Mal in diesem Haus, und diesmal traf sie eine
Pruefung: Eine rote Pruefung, die rot BLEIBT, gewoehnt einem das
Hinsehen ab und ist damit schaedlicher als gar keine.

Erst nachgemessen, ob die Kachel ueberhaupt falsch ist: In
workspace-entwicklung.js steht

  const personen = leitung ? db().prepare(...) : [];

Ein Modi bekommt dort eine LEERE Liste -- er sieht auf der Seite nur
sich selbst. Die Kachel war also richtig, die Pruefung nicht.

An ihre Stelle treten zwei Messungen:

1. DAS VERSPRECHEN STATT DES NAMENS. Filipe hatte gemeldet, dass auf
   der Kachel "die Antworten sieht nur du" stand und sie trotzdem auf
   eine Seite mit fremden Namen fuehrte. Das ist eine Eigenschaft des
   Untertitels, nicht des Namens. Wer morgen eine Kachel "Dein Kopf"
   nennt und dasselbe verspricht, ist mitgeprueft -- die Namensliste
   haette ihn durchgelassen.

2. DIE ECHTE GRENZE, die bisher NIEMAND gemessen hat. Ob eine Kachel
   richtig zeigt, ist Beschriftung; ob die Seite dahinter fremde Namen
   herausgibt, sind Daten -- und nur das schuetzt jemanden wirklich.
   Gemessen wird jetzt beides: Ein Modi bekommt auf /entwicklung/lage
   NIEMANDEN (0), DogFather und die rechte Hand bekommen sehr wohl
   welche (2). Die zweite Zeile ist die Gegenprobe zur ersten -- waere
   der Filter einfach zu, saehe auch die Leitung nichts, und die
   Modi-Zeile waere trotzdem gruen.

Nebenbei: Beim ersten Lauf stand `lage.code === 200` statt
`lage.status` -- der Helfer heisst anders. Beide Zeilen wurden dadurch
ROT, obwohl die Zahlen (2 und 0) von Anfang an stimmten. Der richtige
Ausgang: lieber laut scheitern als still bestaetigen.

pruef-entwicklung: 46 Pruefungen, 0 Fehler (vorher 43 mit 1 Fehler).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 22:32:44 +02:00
189 changed files with 2003 additions and 1287 deletions
+154
View File
@@ -56,3 +56,157 @@ export async function portMussFreiSein(port, wer = "diese Pruefung") {
} }
return port; return port;
} }
/* =====================================================================
WELCHER PORT GEHOERT MIR? (20.09.2026)
---------------------------------------------------------------------
WARUM ES DIESE FUNKTION GIBT
Gemessen am 20.09.2026: 164 Pruefdateien, 129 verschiedene Ports --
NEUNZEHN Nummern waren doppelt vergeben, eine sogar dreifach
(4186, 4188, 4196, 4198 ...). Niemand hatte das absichtlich getan;
jede neue Pruefung wurde von einer vorhandenen abgeschrieben, und
die Nummer kam mit.
Der Waechter darueber faengt den Schaden ab -- er bricht ab, statt
gegen einen fremden Server zu messen. Aber er kann nur melden, was
schon passiert ist: Zwei Pruefungen mit derselben Nummer koennen nie
gleichzeitig laufen, und ein liegengebliebener Prozess der einen
laesst die andere mit einer Meldung abbrechen, die wie ein Befund
aussieht. Genau das ist mir heute zweimal passiert.
EINE GEPFLEGTE NUMMERNLISTE IST DIE FALSCHE LOESUNG. Dieses Haus ist
an abgeschriebenen Listen schon dreimal gescheitert (Spaltenliste
beim Datenumbau, Namensliste in pruef-anruf, Namensliste in
pruef-entwicklung). Eine Liste, die niemand pflegt, kann nicht
veralten -- also wird die Nummer ABGELEITET.
---------------------------------------------------------------------
WIE ABGELEITET WIRD, UND WARUM NICHT MIT EINER PRUEFSUMME
Der naheliegende Weg waere ein Hash des Dateinamens. Nachgerechnet
ist er der schlechtere: Bei 164 Namen in 4900 moeglichen Ports sind
nach dem Geburtstagsproblem rund DREI Zusammenstoesse zu erwarten --
der Hash tauscht eine sichtbare Doppelung gegen eine unsichtbare.
Stattdessen: die Stelle im Alphabet. Alle `pruef-*.mjs` im selben
Ordner werden sortiert, und wer an Stelle n steht, bekommt Port
BASIS + n*2. Das ist NICHT ZUFAELLIG EINDEUTIG, sondern eindeutig
von der Bauart her -- zwei Dateien koennen nicht dieselbe Stelle im
Alphabet haben.
Jede Datei bekommt ZWEI Nummern (nr = 0 und 1). Fuenf Pruefungen
starten heute einen zweiten Server; der braucht dann keinen eigenen
Eintrag irgendwo.
Nebenwirkung, bewusst in Kauf genommen: Kommt eine neue Pruefung
dazu, verschieben sich die Nummern dahinter. Das ist harmlos -- es
sind Testports, kein Mensch merkt sie sich -- und der Waechter faengt
den einen Fall ab, in dem es zaehlt (ein Prozess von vorhin liegt
noch auf der Nummer).
===================================================================== */
import { readdirSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { basename, dirname } from "node:path";
/** Ab hier aufwaerts, zwei je Datei.
*
* NICHT 4100: Der echte Dienst hoert dort, und eine Pruefung, die
* versehentlich dorthin zielt, waere der eine Fehler, den der Waechter
* NICHT erkennen kann -- sie bekaeme brav Antworten.
*
* UND NICHT 4500, wie hier zuerst stand. Nachgemessen reichen die
* bisher von Hand vergebenen Nummern von 4176 bis 4504 -- der Bereich
* 4500-4827 haette sich also mit dem obersten Rest ueberschnitten.
* Das ist der Grund, warum solche Zahlen gemessen und nicht geschaetzt
* werden: "irgendwo ueber 4400" haette plausibel geklungen. */
const BASIS = 5000;
const PRO_DATEI = 2;
/** Der Port dieser Datei -- abgeleitet, nicht vergeben.
*
* `meta` ist `import.meta` der aufrufenden Datei. Prueft danach
* gleich, ob er frei ist, und bricht sonst ab (siehe oben).
*
* DRITTER AUSGANG: Findet sich die eigene Datei nicht in der Liste --
* etwa weil jemand die Funktion aus einem anderen Ordner aufruft --,
* wird NICHT geraten. Eine geratene Nummer waere genau die Doppelung,
* die hier abgeschafft wird. */
/* =====================================================================
PORTS, DIE `fetch` NICHT ANFASST (20.09.2026, teuer gelernt)
Die Fetch-Spezifikation fuehrt eine Liste "bad ports" -- Nummern, auf
die ein Browser KEINE Verbindung aufbaut, weil sich ueber sie fremde
Dienste missbrauchen liessen (SMTP, NNTP, SIP, IRC und andere). Node
hat diese Liste uebernommen: `fetch` wirft dort `TypeError: fetch
failed` mit der Ursache `bad port`, noch bevor ein Paket fliegt.
WIE ES AUFGEFALLEN IST: Nach der Umstellung auf abgeleitete Nummern
bekam pruef-chat-kanaele die 5060 -- und stuerzte ab, obwohl der
Server nachweislich lief ("Server laeuft auf http://127.0.0.1:5060")
und die Anmeldung ueber `http.request` sogar geklappt hatte. Nur die
`fetch`-Aufrufe scheiterten. 5060 ist SIP und steht auf der Liste.
WARUM DAS SO SCHWER ZU FINDEN WAR: Die Meldung lautet "fetch failed"
-- dieselbe Meldung wie bei einem Server, der nicht laeuft. Wer sie
liest, sucht am Server. Der Unterschied steht erst in `.cause`:
`bad port` statt `ECONNREFUSED`. Gegengeprueft mit einem echten
Zuhoerer auf 5060: Port 5060 -> "bad port", Port 5062 -> sauberes
"ECONNREFUSED". Die Sperre ist also real und trifft genau diese
Nummern.
NEBENBEFUND: Auch im alten, von Hand vergebenen Bereich lag eine --
die 4190 (ManageSieve). Sie war nie vergeben, rein zufaellig.
===================================================================== */
const GESPERRT = new Set([
1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 69, 77, 79,
87, 95, 101, 102, 103, 104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 137,
138, 139, 143, 161, 179, 389, 427, 465, 512, 513, 514, 515, 526, 530, 531,
532, 540, 548, 554, 556, 563, 587, 601, 636, 989, 990, 993, 995, 1719, 1720,
1723, 2049, 3659, 4045, 4190, 5060, 5061, 6000, 6566, 6665, 6666, 6667, 6668,
6669, 6679, 6697, 10080,
]);
/** Die n-te brauchbare Nummer ab BASIS -- gesperrte werden uebersprungen.
*
* Damit bleibt die Ableitung eindeutig (die Reihenfolge steht fest),
* ohne dass eine gesperrte Nummer je herauskommt. Eine Liste von
* Ausnahmen musste dafuer niemand pflegen: Uebersprungen wird nach
* der Regel, nicht nach einer Tabelle von Sonderfaellen.
*/
export function portNummer(nte) {
let p = BASIS;
let uebrig = nte;
while (true) {
if (!GESPERRT.has(p)) {
if (uebrig === 0) return p;
uebrig -= 1;
}
p += 1;
if (p > BASIS + 5000) {
throw new Error("[Port] Kein freier Nummernbereich mehr oberhalb von " + BASIS + ".");
}
}
}
export async function eigenerPort(meta, wer = null, nr = 0) {
const pfad = fileURLToPath(meta.url);
const mein = basename(pfad);
const ordner = dirname(pfad);
const alle = readdirSync(ordner)
.filter((f) => f.startsWith("pruef-") && f.endsWith(".mjs"))
.sort();
const stelle = alle.indexOf(mein);
if (stelle < 0) {
throw new Error(
`[Port] ${mein} steht nicht in der Liste der Pruefdateien in ${ordner}.\n`
+ " Die Nummer wird aus der Stelle im Alphabet abgeleitet -- ohne\n"
+ " Stelle gibt es keine Nummer, und geraten wird nicht.");
}
if (nr < 0 || nr >= PRO_DATEI) {
throw new Error(`[Port] Es gibt ${PRO_DATEI} Nummern je Datei (0 und 1), nicht ${nr}.`);
}
return portMussFreiSein(portNummer(stelle * PRO_DATEI + nr), wer || mein.replace(/\.mjs$/, ""));
}
+4 -4
View File
@@ -29,10 +29,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-abopt-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4297, "die Optikpruefung des Abbrechens"); const PORT = await eigenerPort(import.meta, "die Optikpruefung des Abbrechens");
process.env.PORT = "4297"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -47,7 +47,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-abbrechen-optik"); notbremse(480_000, "pruef-abbrechen-optik");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4297"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-abbrechen-optik-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-abbrechen-optik-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+4 -4
View File
@@ -90,9 +90,9 @@ const altPfad = join(ordner, "alt.db");
/* Der Server wird jetzt AUF DIESER Datei gestartet -- die Umstellung /* Der Server wird jetzt AUF DIESER Datei gestartet -- die Umstellung
läuft beim Import. */ läuft beim Import. */
process.env.WORKSPACE_DB = altPfad; process.env.WORKSPACE_DB = altPfad;
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4295, "die Abbruchpruefung"); const PORT = await eigenerPort(import.meta, "die Abbruchpruefung");
process.env.PORT = "4295"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -101,7 +101,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 1400)); await new Promise((r) => setTimeout(r, 1400));
const BASIS = "http://127.0.0.1:4295"; const BASIS = `http://127.0.0.1:${PORT}`;
{ {
const p = new DatabaseSync(altPfad); const p = new DatabaseSync(altPfad);
+2 -3
View File
@@ -36,9 +36,8 @@ import { scryptSync, randomBytes } from "node:crypto";
import { heuteLokal } from "./helfer-zeit.mjs"; import { heuteLokal } from "./helfer-zeit.mjs";
const HIER = dirname(fileURLToPath(import.meta.url)); const HIER = dirname(fileURLToPath(import.meta.url));
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
const PORT = 4341; const PORT = await eigenerPort(import.meta, "die Agentur-Pruefung");
await portMussFreiSein(PORT, "die Agentur-Pruefung");
const BASIS = `http://127.0.0.1:${PORT}`; const BASIS = `http://127.0.0.1:${PORT}`;
const ordner = mkdtempSync(join(tmpdir(), "ws-agentur-")); const ordner = mkdtempSync(join(tmpdir(), "ws-agentur-"));
+2 -2
View File
@@ -39,9 +39,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4495, "pruef-alle-sehen-es"); const PORT = await eigenerPort(import.meta, "pruef-alle-sehen-es");
const ordner = mkdtempSync(join(tmpdir(), "ws-sicht-")); const ordner = mkdtempSync(join(tmpdir(), "ws-sicht-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -44,10 +44,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-wege-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
/* Der Port muss frei sein -- sonst wird gegen einen fremden Server /* Der Port muss frei sein -- sonst wird gegen einen fremden Server
gemessen. Begruendung in helfer-port.mjs. */ gemessen. Begruendung in helfer-port.mjs. */
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4247, "die Wegepruefung"); const PORT = await eigenerPort(import.meta, "die Wegepruefung");
process.env.PORT = "4247"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -56,7 +56,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4247"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
+2 -2
View File
@@ -29,9 +29,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4413, "pruef-alter"); const PORT = await eigenerPort(import.meta, "pruef-alter");
const ordner = mkdtempSync(join(tmpdir(), "ws-alter-")); const ordner = mkdtempSync(join(tmpdir(), "ws-alter-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -16,8 +16,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4206, "pruef-ampel"); const PORT = await eigenerPort(import.meta, "pruef-ampel");
process.env.PORT = "4206"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -26,7 +26,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -35,7 +35,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-ampel"); notbremse(480_000, "pruef-ampel");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4206"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 250_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 250_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+2 -2
View File
@@ -31,9 +31,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4416, "pruef-anhaenge"); const PORT = await eigenerPort(import.meta, "pruef-anhaenge");
const ordner = mkdtempSync(join(tmpdir(), "ws-anh-")); const ordner = mkdtempSync(join(tmpdir(), "ws-anh-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -25,9 +25,9 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4199, "pruef-anruf-ruhezeit"); const PORT = await eigenerPort(import.meta, "pruef-anruf-ruhezeit");
const ordner = mkdtempSync(join(tmpdir(), "ws-ruhe-")); const ordner = mkdtempSync(join(tmpdir(), "ws-ruhe-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -20,9 +20,9 @@ import { mkdtempSync, rmSync, writeFileSync, unlinkSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4196, "pruef-anruf"); const PORT = await eigenerPort(import.meta, "pruef-anruf");
const ordner = mkdtempSync(join(tmpdir(), "ws-anruf-")); const ordner = mkdtempSync(join(tmpdir(), "ws-anruf-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -3
View File
@@ -68,9 +68,8 @@ import { notbremse } from "./helfer-notbremse.mjs";
notbremse(300_000, "die Artenpruefung"); notbremse(300_000, "die Artenpruefung");
const HIER = dirname(fileURLToPath(import.meta.url)); const HIER = dirname(fileURLToPath(import.meta.url));
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
const PORT = 4359; const PORT = await eigenerPort(import.meta, "die Artenpruefung");
await portMussFreiSein(PORT, "die Artenpruefung");
const BASIS = `http://127.0.0.1:${PORT}`; const BASIS = `http://127.0.0.1:${PORT}`;
const ordner = mkdtempSync(join(tmpdir(), "ws-arten-")); const ordner = mkdtempSync(join(tmpdir(), "ws-arten-"));
+2 -2
View File
@@ -26,9 +26,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4410, "pruef-aufbewahrung"); const PORT = await eigenerPort(import.meta, "pruef-aufbewahrung");
const ordner = mkdtempSync(join(tmpdir(), "ws-aufb-")); const ordner = mkdtempSync(join(tmpdir(), "ws-aufb-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -25,8 +25,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4211, "pruef-aufgaben-vorlagen"); const PORT = await eigenerPort(import.meta, "pruef-aufgaben-vorlagen");
process.env.PORT = "4211"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -35,11 +35,11 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(240_000, "pruef-aufgaben-vorlagen"); notbremse(240_000, "pruef-aufgaben-vorlagen");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4211"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
+4 -4
View File
@@ -40,8 +40,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4216, "pruef-aufgabenbrett"); const PORT = await eigenerPort(import.meta, "pruef-aufgabenbrett");
process.env.PORT = "4216"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -50,7 +50,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -59,7 +59,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-aufgabenbrett"); notbremse(480_000, "pruef-aufgabenbrett");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4216"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+2 -2
View File
@@ -31,9 +31,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4412, "pruef-auskunft"); const PORT = await eigenerPort(import.meta, "pruef-auskunft");
const ordner = mkdtempSync(join(tmpdir(), "ws-ausk-")); const ordner = mkdtempSync(join(tmpdir(), "ws-ausk-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -35,10 +35,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
/* Der Port muss frei sein -- sonst wird gegen einen fremden Server /* Der Port muss frei sein -- sonst wird gegen einen fremden Server
gemessen. Begruendung in helfer-port.mjs. */ gemessen. Begruendung in helfer-port.mjs. */
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4253, "die Barrierefreiheitspruefung"); const PORT = await eigenerPort(import.meta, "die Barrierefreiheitspruefung");
process.env.PORT = "4253"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -53,7 +53,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-barrierefrei-workspace"); notbremse(480_000, "pruef-barrierefrei-workspace");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4253"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
+2 -2
View File
@@ -30,9 +30,9 @@ import { mkdtempSync, rmSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4419, "pruef-befinden"); const PORT = await eigenerPort(import.meta, "pruef-befinden");
const ordner = mkdtempSync(join(tmpdir(), "ws-bef-")); const ordner = mkdtempSync(join(tmpdir(), "ws-bef-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -13,7 +13,7 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const ordner = mkdtempSync(join(tmpdir(), "ws-bereiche-")); const ordner = mkdtempSync(join(tmpdir(), "ws-bereiche-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
@@ -22,8 +22,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4183, "pruef-bereiche-lesend"); const PORT = await eigenerPort(import.meta, "pruef-bereiche-lesend");
process.env.PORT = "4183"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -34,7 +34,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4183"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 180_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 180_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+4 -4
View File
@@ -12,7 +12,7 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const ordner = mkdtempSync(join(tmpdir(), "ws-betreuung-")); const ordner = mkdtempSync(join(tmpdir(), "ws-betreuung-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
@@ -21,8 +21,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4189, "pruef-betreuung"); const PORT = await eigenerPort(import.meta, "pruef-betreuung");
process.env.PORT = "4189"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -33,7 +33,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4189"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
let fehler = 0; let fehler = 0;
+2 -2
View File
@@ -38,9 +38,9 @@ import { mkdtempSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4504, "pruef-bewerbung"); const PORT = await eigenerPort(import.meta, "pruef-bewerbung");
const ordner = mkdtempSync(join(tmpdir(), "ws-bewerb-")); const ordner = mkdtempSync(join(tmpdir(), "ws-bewerb-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -38,10 +38,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
/* Der Port muss frei sein -- sonst wird gegen einen fremden Server /* Der Port muss frei sein -- sonst wird gegen einen fremden Server
gemessen. Begruendung in helfer-port.mjs. */ gemessen. Begruendung in helfer-port.mjs. */
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4277, "die Breitenpruefung"); const PORT = await eigenerPort(import.meta, "die Breitenpruefung");
process.env.PORT = "4277"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -56,7 +56,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-breiten"); notbremse(480_000, "pruef-breiten");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4277"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
+2 -2
View File
@@ -41,10 +41,10 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { heuteLokal } from "./helfer-tag.mjs"; import { heuteLokal } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4485, "pruef-bremse"); const PORT = await eigenerPort(import.meta, "pruef-bremse");
const ordner = mkdtempSync(join(tmpdir(), "ws-bremse-")); const ordner = mkdtempSync(join(tmpdir(), "ws-bremse-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -40,10 +40,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
/* Der Port muss frei sein -- sonst wird gegen einen fremden Server /* Der Port muss frei sein -- sonst wird gegen einen fremden Server
gemessen. Begruendung in helfer-port.mjs. */ gemessen. Begruendung in helfer-port.mjs. */
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4289, "die Browserpruefung"); const PORT = await eigenerPort(import.meta, "die Browserpruefung");
process.env.PORT = "4289"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -58,7 +58,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-browser"); notbremse(480_000, "pruef-browser");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4289"; const BASIS = `http://127.0.0.1:${PORT}`;
/* LAUFEND MITSCHREIBEN, nicht erst am Ende. /* LAUFEND MITSCHREIBEN, nicht erst am Ende.
+4 -4
View File
@@ -105,8 +105,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4193, "pruef-buehne"); const PORT = await eigenerPort(import.meta, "pruef-buehne");
process.env.PORT = "4193"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -116,7 +116,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -125,7 +125,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(120_000 + SEITEN_ZEIT, "pruef-buehne"); notbremse(120_000 + SEITEN_ZEIT, "pruef-buehne");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4193"; const BASIS = `http://127.0.0.1:${PORT}`;
/* Die Frist waechst mit der Liste: 220 s reichten fuer sechs Seiten. /* Die Frist waechst mit der Liste: 220 s reichten fuer sechs Seiten.
Eine feste Zahl waere hier eine Zeitbombe -- die zwoelf neuen Eine feste Zahl waere hier eine Zeitbombe -- die zwoelf neuen
haetten sie gerissen, und der Abbruch saehe aus wie ein Befund. */ haetten sie gerissen, und der Abbruch saehe aus wie ein Befund. */
+4 -4
View File
@@ -28,10 +28,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { sauberBeenden } from "./helfer-beenden.mjs"; import { sauberBeenden } from "./helfer-beenden.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4321, "die Kategorienpruefung"); const PORT = await eigenerPort(import.meta, "die Kategorienpruefung");
process.env.PORT = "4321"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -46,7 +46,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-call-kategorien"); notbremse(480_000, "pruef-call-kategorien");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4321"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-call-kategorien-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-call-kategorien-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+4 -4
View File
@@ -34,10 +34,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { bestaetige } from "./helfer-nachfrage.mjs"; import { bestaetige } from "./helfer-nachfrage.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4323, "die Chat-Anhangpruefung"); const PORT = await eigenerPort(import.meta, "die Chat-Anhangpruefung");
process.env.PORT = "4323"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -47,7 +47,7 @@ express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(
await import("./index.js"); await import("./index.js");
notbremse(600_000, "pruef-chat-anhaenge"); notbremse(600_000, "pruef-chat-anhaenge");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4323"; const BASIS = `http://127.0.0.1:${PORT}`;
const ANHANG_ORDNER = join(ordner, "chat-anhaenge"); const ANHANG_ORDNER = join(ordner, "chat-anhaenge");
const PROTOKOLL = join(process.cwd(), "pruef-chat-anhaenge-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-chat-anhaenge-lauf.txt");
+5 -5
View File
@@ -37,13 +37,13 @@ const HIER_BILD = dirname(fileURLToPath(import.meta.url));
const ordner = mkdtempSync(join(tmpdir(), "ws-aufloesen-")); const ordner = mkdtempSync(join(tmpdir(), "ws-aufloesen-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4391, "die Aufloesen-Pruefung"); const PORT = await eigenerPort(import.meta, "die Aufloesen-Pruefung");
process.env.PORT = "4391"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
const BASIS = "http://127.0.0.1:4391"; const BASIS = `http://127.0.0.1:${PORT}`;
await import("./index.js"); await import("./index.js");
@@ -104,7 +104,7 @@ function anmelden(rolle, code, wand = "crew.dogfather-universe.com") {
return new Promise((fertig) => { return new Promise((fertig) => {
const rumpf = JSON.stringify({ rolle, code }); const rumpf = JSON.stringify({ rolle, code });
const a = httpAnfrage({ const a = httpAnfrage({
host: "127.0.0.1", port: 4391, path: "/workspace/api/anmelden", method: "POST", host: "127.0.0.1", port: PORT, path: "/workspace/api/anmelden", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"Content-Length": Buffer.byteLength(rumpf), "Content-Length": Buffer.byteLength(rumpf),
+4 -4
View File
@@ -32,10 +32,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { bestaetige } from "./helfer-nachfrage.mjs"; import { bestaetige } from "./helfer-nachfrage.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4319, "die Chat-Ausbaupruefung"); const PORT = await eigenerPort(import.meta, "die Chat-Ausbaupruefung");
process.env.PORT = "4319"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -45,7 +45,7 @@ express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(
await import("./index.js"); await import("./index.js");
notbremse(480_000, "pruef-chat-ausbau"); notbremse(480_000, "pruef-chat-ausbau");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4319"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-chat-ausbau-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-chat-ausbau-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+5 -5
View File
@@ -46,10 +46,10 @@ import { join } from "node:path";
const ordner = mkdtempSync(join(tmpdir(), "ws-kanal-")); const ordner = mkdtempSync(join(tmpdir(), "ws-kanal-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4377, "die Kanalpruefung"); const PORT = await eigenerPort(import.meta, "die Kanalpruefung");
process.env.PORT = "4377"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -90,7 +90,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4377"; const BASIS = `http://127.0.0.1:${PORT}`;
/* ---- Notbremse und eigener Zuhoerer ------------------------------------- /* ---- Notbremse und eigener Zuhoerer -------------------------------------
@@ -185,7 +185,7 @@ function anmelden(rolle, code, wand = "crew.dogfather-universe.com") {
return new Promise((fertig) => { return new Promise((fertig) => {
const rumpf = JSON.stringify({ rolle, code }); const rumpf = JSON.stringify({ rolle, code });
const a = httpAnfrage({ const a = httpAnfrage({
host: "127.0.0.1", port: 4377, path: "/workspace/api/anmelden", method: "POST", host: "127.0.0.1", port: PORT, path: "/workspace/api/anmelden", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
"Content-Length": Buffer.byteLength(rumpf), "Content-Length": Buffer.byteLength(rumpf),
+4 -4
View File
@@ -32,10 +32,10 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { bestaetige } from "./helfer-nachfrage.mjs"; import { bestaetige } from "./helfer-nachfrage.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4317, "die Chat-Optikpruefung"); const PORT = await eigenerPort(import.meta, "die Chat-Optikpruefung");
process.env.PORT = "4317"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -50,7 +50,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-chat-optik"); notbremse(480_000, "pruef-chat-optik");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4317"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-chat-optik-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-chat-optik-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+4 -4
View File
@@ -30,10 +30,10 @@ import { join } from "node:path";
const ordner = mkdtempSync(join(tmpdir(), "ws-chat-")); const ordner = mkdtempSync(join(tmpdir(), "ws-chat-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4313, "die Chatpruefung"); const PORT = await eigenerPort(import.meta, "die Chatpruefung");
process.env.PORT = "4313"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -42,7 +42,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4313"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
+2 -2
View File
@@ -24,10 +24,10 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4442, "pruef-chatkachel"); const PORT = await eigenerPort(import.meta, "pruef-chatkachel");
const ordner = mkdtempSync(join(tmpdir(), "ws-kachel-")); const ordner = mkdtempSync(join(tmpdir(), "ws-kachel-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -24,8 +24,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4207, "pruef-checkliste"); const PORT = await eigenerPort(import.meta, "pruef-checkliste");
process.env.PORT = "4207"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -34,7 +34,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -43,7 +43,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-checkliste"); notbremse(480_000, "pruef-checkliste");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4207"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.();
let fehler = 0; let fehler = 0;
+4 -4
View File
@@ -30,8 +30,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4195, "pruef-code"); const PORT = await eigenerPort(import.meta, "pruef-code");
process.env.PORT = "4195"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -41,7 +41,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { bestaetige } from "./helfer-nachfrage.mjs"; import { bestaetige } from "./helfer-nachfrage.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
@@ -51,7 +51,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-code"); notbremse(480_000, "pruef-code");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4195"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 240_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 240_000).unref?.();
let fehler = 0; let fehler = 0;
+2 -2
View File
@@ -36,9 +36,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4198, "pruef-community-sicht"); const PORT = await eigenerPort(import.meta, "pruef-community-sicht");
const ordner = mkdtempSync(join(tmpdir(), "ws-cs-")); const ordner = mkdtempSync(join(tmpdir(), "ws-cs-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -11,8 +11,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4185, "pruef-content-ansicht"); const PORT = await eigenerPort(import.meta, "pruef-content-ansicht");
process.env.PORT = "4185"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -22,7 +22,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -31,7 +31,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-content-ansicht"); notbremse(480_000, "pruef-content-ansicht");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4185"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+6 -6
View File
@@ -5,7 +5,7 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const ordner = mkdtempSync(join(tmpdir(), "ws-content-")); const ordner = mkdtempSync(join(tmpdir(), "ws-content-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
@@ -14,9 +14,9 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
4194 fuer die Gegenprobe. Nur den ersten zu pruefen hiesse, die 4194 fuer die Gegenprobe. Nur den ersten zu pruefen hiesse, die
Gegenprobe ungeschuetzt zu lassen, und die ist der Teil, dem man Gegenprobe ungeschuetzt zu lassen, und die ist der Teil, dem man
glaubt. */ glaubt. */
await portMussFreiSein(4184, "pruef-content"); const PORT = await eigenerPort(import.meta, "pruef-content");
await portMussFreiSein(4194, "pruef-content (Gegenprobe)"); const PORT2 = await eigenerPort(import.meta, "pruef-content (Gegenprobe)", 1);
process.env.PORT = "4184"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -27,7 +27,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4184"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
@@ -81,7 +81,7 @@ d.close();
const { spawnSync } = await import("node:child_process"); const { spawnSync } = await import("node:child_process");
const zweiter = spawnSync(process.execPath, ["-e", ` const zweiter = spawnSync(process.execPath, ["-e", `
process.env.WORKSPACE_DB = ${JSON.stringify(process.env.WORKSPACE_DB)}; process.env.WORKSPACE_DB = ${JSON.stringify(process.env.WORKSPACE_DB)};
process.env.PORT = "4194"; process.env.PORT = "${PORT2}";
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "X"; process.env.SITE_ACCESS_CODE_DOGI = "X";
process.env.SITE_ACCESS_CODE_VANVAN = "Y"; process.env.SITE_ACCESS_CODE_VANVAN = "Y";
+2 -2
View File
@@ -40,10 +40,10 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { heuteLokal, tagLokal } from "./helfer-tag.mjs"; import { heuteLokal, tagLokal } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4481, "pruef-countdown"); const PORT = await eigenerPort(import.meta, "pruef-countdown");
const ordner = mkdtempSync(join(tmpdir(), "ws-count-")); const ordner = mkdtempSync(join(tmpdir(), "ws-count-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -3
View File
@@ -42,9 +42,8 @@ import { notbremse } from "./helfer-notbremse.mjs";
notbremse(240_000, "die Creator-Anlegen-Pruefung"); notbremse(240_000, "die Creator-Anlegen-Pruefung");
const HIER = dirname(fileURLToPath(import.meta.url)); const HIER = dirname(fileURLToPath(import.meta.url));
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
const PORT = 4347; const PORT = await eigenerPort(import.meta, "die Creator-Anlegen-Pruefung");
await portMussFreiSein(PORT, "die Creator-Anlegen-Pruefung");
const BASIS = `http://127.0.0.1:${PORT}`; const BASIS = `http://127.0.0.1:${PORT}`;
const ordner = mkdtempSync(join(tmpdir(), "ws-canlegen-")); const ordner = mkdtempSync(join(tmpdir(), "ws-canlegen-"));
+5 -5
View File
@@ -34,8 +34,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4371, "pruef-crew-adresse"); const PORT = await eigenerPort(import.meta, "pruef-crew-adresse");
process.env.PORT = "4371"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -44,7 +44,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-crew-adresse"); notbremse(180_000, "pruef-crew-adresse");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
@@ -68,7 +68,7 @@ function hole(pfad, { host, methode = "GET", rumpf = null, keks = "" } = {}) {
const kopf = { Host: host }; const kopf = { Host: host };
if (rumpf) { kopf["Content-Type"] = "application/json"; kopf["Content-Length"] = Buffer.byteLength(rumpf); } if (rumpf) { kopf["Content-Type"] = "application/json"; kopf["Content-Length"] = Buffer.byteLength(rumpf); }
if (keks) kopf.Cookie = keks; if (keks) kopf.Cookie = keks;
const a = request({ host: "127.0.0.1", port: 4371, path: pfad, method: methode, headers: kopf }, const a = request({ host: "127.0.0.1", port: PORT, path: pfad, method: methode, headers: kopf },
(antwort) => { (antwort) => {
let text = ""; let text = "";
antwort.setEncoding("utf8"); antwort.setEncoding("utf8");
@@ -122,7 +122,7 @@ const idModi = anlegen("Marina", "modi", "CODE-MODI-0001");
const CREW = "crew.dogfather-universe.com"; const CREW = "crew.dogfather-universe.com";
const WS = "workspace.dogfather-universe.com"; const WS = "workspace.dogfather-universe.com";
const HAUPT = "dogfather-universe.com"; const HAUPT = "dogfather-universe.com";
const LOKAL = "127.0.0.1:4371"; const LOKAL = `127.0.0.1:${PORT}`;
/* ===================================================================== /* =====================================================================
TEIL A -- DIE REGELN, OHNE SERVER TEIL A -- DIE REGELN, OHNE SERVER
+44 -13
View File
@@ -32,14 +32,14 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4373, "pruef-crew-wand-bild"); const PORT = await eigenerPort(import.meta, "pruef-crew-wand-bild");
process.env.PORT = "4373"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-crew-wand-bild"); notbremse(180_000, "pruef-crew-wand-bild");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
@@ -81,12 +81,19 @@ for (const geraet of [
deviceScaleFactor: 1, deviceScaleFactor: 1,
}); });
const seite = await ctx.newPage(); const seite = await ctx.newPage();
const meldungen = []; /* Der App-Name kommt aus dem Manifest der Crew-Adresse. Eine zweite
Fassung hier waere die, die beim naechsten Umbenennen vergessen
wird. */
const { readFileSync } = await import("node:fs");
const APPNAME = JSON.parse(
readFileSync(new URL("../workspace/crew.webmanifest", import.meta.url), "utf8")).name;
const meldungen = [];
seite.on("console", (m) => { if (m.type() === "error") meldungen.push(m.text()); }); seite.on("console", (m) => { if (m.type() === "error") meldungen.push(m.text()); });
const adresse = geraet.alt const adresse = geraet.alt
? "http://127.0.0.1:4373/workspace/index.html" ? `http://127.0.0.1:${PORT}/workspace/index.html`
: "http://127.0.0.1:4373/workspace/crew-index.html"; : `http://127.0.0.1:${PORT}/workspace/crew-index.html`;
await seite.goto(adresse, { waitUntil: "networkidle" }); await seite.goto(adresse, { waitUntil: "networkidle" });
await seite.waitForTimeout(400); await seite.waitForTimeout(400);
@@ -105,11 +112,35 @@ for (const geraet of [
if (geraet.alt) { if (geraet.alt) {
ok(kacheln === 5, `${geraet.name}: die alte Wand hat ihre fuenf Kacheln (${kacheln})`); ok(kacheln === 5, `${geraet.name}: die alte Wand hat ihre fuenf Kacheln (${kacheln})`);
} else { } else {
ok(/Team Dogi/.test(titel), `${geraet.name}: der Reiter heisst "${titel}"`); /* DER REITER TRAEGT DEN APP-NAMEN -- abgeleitet, nicht abgeschrieben.
/* DREI, seit Filipe am 10.09.2026 sagte: "3 rollen. dogfather. Hier stand `/Team Dogi/`, aus der Zeit, als die App so hiess. Sie
rechte hand und modis." Hier stand vorher `=== 0` -- am Vormittag heisst seit dem Treff-Umzug "DogFather Universe", und die Pruefung
richtig, am Nachmittag nicht mehr. */ war seitdem rot, ohne dass etwas kaputt war. Ein fester Name in
ok(kacheln === 3, `${geraet.name}: drei Rollenkacheln (${kacheln})`); einer Pruefung ist eine Zeitbombe mit Datum: Er stimmt, bis
jemand umbenennt, und dann kostet er Vertrauen in den ganzen
Satz. Gemessen wird deshalb gegen das Manifest -- benennt jemand
die App um, folgt der Reiter, und beides bleibt gruen. Weichen
sie auseinander, sieht der Mensch im Reiter einen anderen Namen
als auf seinem Startbildschirm, und das ist der Fehler, den es
zu finden gilt. */
ok(titel.includes(APPNAME),
`${geraet.name}: der Reiter traegt den App-Namen "${APPNAME}" (steht da: "${titel}")`);
/* WELCHE ROLLEN AUF DIE WAND GEHOEREN.
Hier stand `=== 3`, seit Filipe am 10.09.2026 sagte: "3 rollen.
dogfather. rechte hand und modis." Am 19.09. ist der Treff in
Team Dogi eingezogen, und die Community kam als vierte dazu --
die Zahl war ab da falsch, die Wand richtig.
Eine Zahl sagt beim Scheitern nur "3 erwartet, 4 gefunden" und
verschweigt, WELCHE. Deshalb wird die MENGE verglichen: Fehlt
eine Rolle, steht ihr Name in der Meldung, und wer sie entfernt
hat, sieht sofort, ob das Absicht war. */
const rollen = (await seite.locator(".rolle").evaluateAll(
(ns) => ns.map((n) => n.dataset.rolle || ""))).sort();
const SOLL = ["admin", "gast", "hand", "modi"];
ok(JSON.stringify(rollen) === JSON.stringify(SOLL),
`${geraet.name}: die vier Rollen stehen da (${rollen.join(", ") || "keine"})`);
/* Jede muss auch bedienbar sein. Eine Kachel, die im HTML steht, /* Jede muss auch bedienbar sein. Eine Kachel, die im HTML steht,
aber 0 px hoch ist, zaehlt oben mit und laesst sich trotzdem aber 0 px hoch ist, zaehlt oben mit und laesst sich trotzdem
nicht antippen -- genau die Sorte Fehler, die eine Zaehlung nicht antippen -- genau die Sorte Fehler, die eine Zaehlung
@@ -279,13 +310,13 @@ for (const wer of [
{ name: "Manager", rolle: "manager", code: "CODE-MAN-0001", eigen: false }, { name: "Manager", rolle: "manager", code: "CODE-MAN-0001", eigen: false },
]) { ]) {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 860 } }); const ctx = await browser.newContext({ viewport: { width: 1280, height: 860 } });
const antwort = await ctx.request.post("http://127.0.0.1:4373/workspace/api/anmelden", { const antwort = await ctx.request.post(`http://127.0.0.1:${PORT}/workspace/api/anmelden`, {
data: { rolle: wer.rolle, code: wer.code }, data: { rolle: wer.rolle, code: wer.code },
}); });
ok(antwort.ok(), wer.name + ": die Anmeldung geht durch"); ok(antwort.ok(), wer.name + ": die Anmeldung geht durch");
const seite = await ctx.newPage(); const seite = await ctx.newPage();
await seite.goto("http://127.0.0.1:4373/workspace/aufgaben.html", { waitUntil: "networkidle" }); await seite.goto(`http://127.0.0.1:${PORT}/workspace/aufgaben.html`, { waitUntil: "networkidle" });
await seite.waitForTimeout(500); await seite.waitForTimeout(500);
const titel = await seite.title(); const titel = await seite.title();
+4 -4
View File
@@ -34,10 +34,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-dabei-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4293, "die Optikpruefung der Teilnehmerwahl"); const PORT = await eigenerPort(import.meta, "die Optikpruefung der Teilnehmerwahl");
process.env.PORT = "4293"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -52,7 +52,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-dabei-optik"); notbremse(480_000, "pruef-dabei-optik");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4293"; const BASIS = `http://127.0.0.1:${PORT}`;
/* LAUFEND MITSCHREIBEN. Node puffert stdout, sobald es umgeleitet wird /* LAUFEND MITSCHREIBEN. Node puffert stdout, sobald es umgeleitet wird
-- bei einem Lauf mit sechs Browser-Anmeldungen steht bis zum Schluss -- bei einem Lauf mit sechs Browser-Anmeldungen steht bis zum Schluss
+2 -2
View File
@@ -40,9 +40,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4475, "pruef-entwicklung-kacheln"); const PORT = await eigenerPort(import.meta, "pruef-entwicklung-kacheln");
const ordner = mkdtempSync(join(tmpdir(), "ws-ekach-")); const ordner = mkdtempSync(join(tmpdir(), "ws-ekach-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+47 -10
View File
@@ -32,10 +32,10 @@ import { request } from "node:http";
const ordner = mkdtempSync(join(tmpdir(), "ws-entw-")); const ordner = mkdtempSync(join(tmpdir(), "ws-entw-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4389, "die Entwicklungspruefung"); const PORT = await eigenerPort(import.meta, "die Entwicklungspruefung");
process.env.PORT = "4389"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -62,7 +62,7 @@ function hole(pfad, { host = WS, methode = "GET", rumpf = null, keks = "" } = {}
const kopf = { Host: host }; const kopf = { Host: host };
if (rumpf) { kopf["Content-Type"] = "application/json"; kopf["Content-Length"] = Buffer.byteLength(rumpf); } if (rumpf) { kopf["Content-Type"] = "application/json"; kopf["Content-Length"] = Buffer.byteLength(rumpf); }
if (keks) kopf.Cookie = keks; if (keks) kopf.Cookie = keks;
const a = request({ host: "127.0.0.1", port: 4389, path: pfad, method: methode, headers: kopf }, const a = request({ host: "127.0.0.1", port: PORT, path: pfad, method: methode, headers: kopf },
(antwort) => { (antwort) => {
let text = ""; let text = "";
antwort.setEncoding("utf8"); antwort.setEncoding("utf8");
@@ -308,12 +308,49 @@ console.log("=== Die Kacheln ===");
ok(!!befinden, `${wer} hat „${befinden?.name || "—"}"`); ok(!!befinden, `${wer} hat „${befinden?.name || "—"}"`);
ok(befinden?.gruppe === "Für dich", ok(befinden?.gruppe === "Für dich",
`und sie steht bei „Für dich" (${befinden?.gruppe})`); `und sie steht bei „Für dich" (${befinden?.gruppe})`);
/* GEGENPROBE: Sie fuehrt NICHT mehr dorthin, wo andere Menschen /* GEGENPROBE: Die Kachel, die VERTRAULICHKEIT VERSPRICHT, fuehrt
stehen -- sonst waere der gemeldete Fehler beim naechsten Umbau nicht dorthin, wo andere Menschen stehen.
still wieder da. */
ok(!alleX.some((k) => k.ziel === "entwicklung.html" HIER STAND EINE NAMENSLISTE (20.09.2026 ersetzt). Sie lautete
&& !["Eure Aufgaben", "Talente"].includes(k.name)), `!["Eure Aufgaben", "Talente"].includes(k.name)` -- und war damit
`${wer}: keine Kachel fuehrt mehr ersatzweise auf die Entwicklungsseite`); eine abgeschriebene Liste, genau die Sorte, vor der dieses Haus
an drei Stellen warnt. Als ein Modi eine eigene Kachel bekam
("Deine Aufgaben", weil "Eure" aus seiner Sicht falsch ist),
wurde diese Pruefung rot, OHNE dass irgendetwas kaputt war. Eine
rote Pruefung, die rot bleibt, gewoehnt einem das Hinsehen ab --
sie ist schaedlicher als gar keine.
Geprueft wird jetzt, was Filipe eigentlich gemeldet hat: Auf der
Kachel stand "die Antworten sieht nur du", und sie fuehrte auf
eine Seite mit Namen anderer Leute. Das ist eine Eigenschaft des
VERSPRECHENS, nicht des Namens -- und Versprechen stehen im
Untertitel. Wer morgen eine Kachel "Dein Kopf" nennt und dasselbe
verspricht, ist damit mitgeprueft; die Namensliste haette ihn
durchgelassen. */
const verspricht = (k) => /nur du|nur dich|siehst nur du/i.test(k.unter || "");
const heikel = alleX.filter((k) => verspricht(k) && k.ziel === "entwicklung.html");
ok(alleX.some(verspricht) && heikel.length === 0,
`${wer}: keine Kachel verspricht Vertraulichkeit und fuehrt doch auf die`
+ ` Entwicklungsseite (${alleX.filter(verspricht).length} mit Versprechen geprueft)`);
/* UND DIE ECHTE GRENZE, die bisher NIEMAND gemessen hat.
Ob eine Kachel richtig zeigt, ist Beschriftung. Ob die Seite
dahinter fremde Namen herausgibt, sind Daten -- und nur das
schuetzt jemanden wirklich. Ein Modi darf dort NIEMANDEN
bekommen ausser sich selbst. */
const lage = await hole("/workspace/api/entwicklung/lage", { host: CREW, keks });
const fremde = (lage.daten?.personen || []).filter((q) => q.id !== undefined);
if (wer === "ein Modi") {
ok(lage.status === 200 && fremde.length === 0,
`${wer} bekommt auf der Entwicklungsseite KEINE fremden Namen (${fremde.length})`);
} else {
/* Die Gegenprobe zur Zeile darueber: Waere der Filter kaputt und
liesse niemanden durch, saehe auch die Leitung nichts -- und
die Modi-Zeile waere trotzdem gruen. Beide Richtungen gehoeren
gemessen, sonst beweist keine etwas. */
ok(lage.status === 200 && fremde.length > 0,
`${wer} bekommt sie sehr wohl (${fremde.length}) -- der Filter ist nicht einfach zu`);
}
} }
const a = await hole("/workspace/api/ich", { host: CREW, keks: ayla.keks }); const a = await hole("/workspace/api/ich", { host: CREW, keks: ayla.keks });
+2 -2
View File
@@ -38,12 +38,12 @@ import { tmpdir } from "node:os";
import { join, dirname } from "node:path"; import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { erwaehnungenFinden, erwaehnteIds } from "./chat-erwaehnung.js"; import { erwaehnungenFinden, erwaehnteIds } from "./chat-erwaehnung.js";
const HIER = dirname(fileURLToPath(import.meta.url)); const HIER = dirname(fileURLToPath(import.meta.url));
const PORT = await portMussFreiSein(4426, "pruef-erwaehnung"); const PORT = await eigenerPort(import.meta, "pruef-erwaehnung");
const ordner = mkdtempSync(join(tmpdir(), "ws-erwaehnung-")); const ordner = mkdtempSync(join(tmpdir(), "ws-erwaehnung-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -29,10 +29,10 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { heuteLokal, tagLokal, tagVon } from "./helfer-tag.mjs"; import { heuteLokal, tagLokal, tagVon } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4417, "pruef-eskalation"); const PORT = await eigenerPort(import.meta, "pruef-eskalation");
const ordner = mkdtempSync(join(tmpdir(), "ws-eskal-")); const ordner = mkdtempSync(join(tmpdir(), "ws-eskal-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -34,9 +34,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4415, "pruef-fassungen"); const PORT = await eigenerPort(import.meta, "pruef-fassungen");
const ordner = mkdtempSync(join(tmpdir(), "ws-fass-")); const ordner = mkdtempSync(join(tmpdir(), "ws-fass-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -26,8 +26,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4203, "pruef-formulare"); const PORT = await eigenerPort(import.meta, "pruef-formulare");
process.env.PORT = "4203"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -36,7 +36,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -45,7 +45,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-formulare"); notbremse(480_000, "pruef-formulare");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4203"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 250_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 250_000).unref?.();
let fehler = 0; let fehler = 0;
+4 -4
View File
@@ -31,8 +31,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4192, "pruef-freie-namen"); const PORT = await eigenerPort(import.meta, "pruef-freie-namen");
process.env.PORT = "4192"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -42,7 +42,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -51,7 +51,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-freie-namen"); notbremse(480_000, "pruef-freie-namen");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4192"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 240_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 240_000).unref?.();
let fehler = 0; let fehler = 0;
+2 -2
View File
@@ -41,10 +41,10 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { heuteLokal } from "./helfer-tag.mjs"; import { heuteLokal } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4487, "pruef-galerie"); const PORT = await eigenerPort(import.meta, "pruef-galerie");
const ordner = mkdtempSync(join(tmpdir(), "ws-gal-")); const ordner = mkdtempSync(join(tmpdir(), "ws-gal-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.WORKSPACE_DATEN = join(ordner, "daten"); process.env.WORKSPACE_DATEN = join(ordner, "daten");
+2 -2
View File
@@ -30,10 +30,10 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { heuteLokal } from "./helfer-tag.mjs"; import { heuteLokal } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4493, "pruef-gespraech"); const PORT = await eigenerPort(import.meta, "pruef-gespraech");
const ordner = mkdtempSync(join(tmpdir(), "ws-gespr-")); const ordner = mkdtempSync(join(tmpdir(), "ws-gespr-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -52,10 +52,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-glocke-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4299, "die Glockenpruefung"); const PORT = await eigenerPort(import.meta, "die Glockenpruefung");
process.env.PORT = "4299"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -70,7 +70,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-glocke"); notbremse(480_000, "pruef-glocke");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4299"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-glocke-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-glocke-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+4 -4
View File
@@ -49,8 +49,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4218, "pruef-grosscheck"); const PORT = await eigenerPort(import.meta, "pruef-grosscheck");
process.env.PORT = "4218"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -60,7 +60,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -69,7 +69,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-grosscheck"); notbremse(480_000, "pruef-grosscheck");
await new Promise((r) => setTimeout(r, 800)); await new Promise((r) => setTimeout(r, 800));
const BASIS = "http://127.0.0.1:4218"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH — zu lange gelaufen"); process.exit(1); }, 900_000).unref?.(); setTimeout(() => { console.log("ABBRUCH — zu lange gelaufen"); process.exit(1); }, 900_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
Binary file not shown.
+2 -2
View File
@@ -103,13 +103,13 @@ import { tmpdir } from "node:os";
import { join, dirname } from "node:path"; import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const REPO = join(dirname(fileURLToPath(import.meta.url)), ".."); const REPO = join(dirname(fileURLToPath(import.meta.url)), "..");
const ordner = mkdtempSync(join(tmpdir(), "ws-handy-")); const ordner = mkdtempSync(join(tmpdir(), "ws-handy-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const PORT = await portMussFreiSein(4231, "pruef-handy-teamdogi"); const PORT = await eigenerPort(import.meta, "pruef-handy-teamdogi");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
+4 -4
View File
@@ -33,8 +33,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4198, "pruef-handy"); const PORT = await eigenerPort(import.meta, "pruef-handy");
process.env.PORT = "4198"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -43,7 +43,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -52,7 +52,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-handy"); notbremse(480_000, "pruef-handy");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4198"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 400_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 400_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+2 -2
View File
@@ -30,9 +30,9 @@ import { mkdtempSync, rmSync, readdirSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4422, "pruef-haus-seiten"); const PORT = await eigenerPort(import.meta, "pruef-haus-seiten");
const ordner = mkdtempSync(join(tmpdir(), "ws-haus-")); const ordner = mkdtempSync(join(tmpdir(), "ws-haus-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+66 -9
View File
@@ -37,10 +37,10 @@ import { request } from "node:http";
const ordner = mkdtempSync(join(tmpdir(), "ws-haus-")); const ordner = mkdtempSync(join(tmpdir(), "ws-haus-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4381, "die Haustrennung"); const PORT = await eigenerPort(import.meta, "die Haustrennung");
process.env.PORT = "4381"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -67,7 +67,7 @@ function hole(pfad, { host, methode = "GET", rumpf = null, keks = "" } = {}) {
const kopf = { Host: host }; const kopf = { Host: host };
if (rumpf) { kopf["Content-Type"] = "application/json"; kopf["Content-Length"] = Buffer.byteLength(rumpf); } if (rumpf) { kopf["Content-Type"] = "application/json"; kopf["Content-Length"] = Buffer.byteLength(rumpf); }
if (keks) kopf.Cookie = keks; if (keks) kopf.Cookie = keks;
const a = request({ host: "127.0.0.1", port: 4381, path: pfad, method: methode, headers: kopf }, const a = request({ host: "127.0.0.1", port: PORT, path: pfad, method: methode, headers: kopf },
(antwort) => { (antwort) => {
let text = ""; let text = "";
antwort.setEncoding("utf8"); antwort.setEncoding("utf8");
@@ -420,7 +420,13 @@ console.log("=== Personen & Zugaenge ===");
const neuCrew = await hole("/workspace/api/verwaltung/personen", { host: CREW, const neuCrew = await hole("/workspace/api/verwaltung/personen", { host: CREW,
methode: "POST", keks: dogi.keks, methode: "POST", keks: dogi.keks,
rumpf: JSON.stringify({ name: "Testcreator", rolle: "creator" }) }); rumpf: JSON.stringify({ name: "Testcreator", rolle: "creator" }) });
ok(neuCrew.status === 403, /* 400, NICHT 403 (berichtigt 20.09.2026). Diese Erwartung stammt vom
10.09.; am 17.09. wurde entschieden, dass eine abgelehnte Rolle
IMMER "Unbekannte Rolle." mit 400 bekommt -- egal ob es sie nicht
gibt oder ob sie hier nur nicht erlaubt ist. Zwei verschiedene
Antworten verraten beim Durchprobieren, WELCHE Rollen existieren.
Die Pruefung war sieben Tage aelter als die Regel. */
ok(neuCrew.status === 400,
`ein Creator laesst sich auf crew. nicht anlegen (${neuCrew.status})`); `ein Creator laesst sich auf crew. nicht anlegen (${neuCrew.status})`);
/* GEGENPROBE: Auf der Agenturadresse geht genau das. Ohne sie hiesse /* GEGENPROBE: Auf der Agenturadresse geht genau das. Ohne sie hiesse
die 403 oben auch dann gruen, wenn Anlegen ueberhaupt kaputt waere. */ die 403 oben auch dann gruen, wenn Anlegen ueberhaupt kaputt waere. */
@@ -499,7 +505,8 @@ console.log("=== Die Rolle aendern ===");
Rollen kommen aus derselben Auskunft wie beim Anlegen. */ Rollen kommen aus derselben Auskunft wie beim Anlegen. */
const fremd = await hole(`${weg}/${idModi}/rolle`, { host: CREW, methode: "PUT", const fremd = await hole(`${weg}/${idModi}/rolle`, { host: CREW, methode: "PUT",
keks: dogi.keks, rumpf: JSON.stringify({ rolle: "creator" }) }); keks: dogi.keks, rumpf: JSON.stringify({ rolle: "creator" }) });
ok(fremd.status === 403, `auf crew. auch nicht zum Creator (${fremd.status})`); /* Auch hier 400 statt 403 -- gleiche Begruendung wie oben. */
ok(fremd.status === 400, `auf crew. auch nicht zum Creator (${fremd.status})`);
/* SEIT DEM 11.09.2026 LAESST SICH DIE ROLLE NICHT MEHR VERGEBEN. /* SEIT DEM 11.09.2026 LAESST SICH DIE ROLLE NICHT MEHR VERGEBEN.
@@ -624,9 +631,59 @@ console.log("=== Alle Kategorien ===");
const codeVersuch = await hole(`/workspace/api/verwaltung/personen/${idModi}/code`, const codeVersuch = await hole(`/workspace/api/verwaltung/personen/${idModi}/code`,
{ host: CREW, methode: "POST", keks: hand.keks, rumpf: "{}" }); { host: CREW, methode: "POST", keks: hand.keks, rumpf: "{}" });
ok(codeVersuch.status === 404, `sie kann keinen Code neu setzen (${codeVersuch.status})`); ok(codeVersuch.status === 404, `sie kann keinen Code neu setzen (${codeVersuch.status})`);
const rolleVersuch = await hole(`/workspace/api/verwaltung/personen/${idModi}/rolle`, /* ROLLEN WECHSELN DARF SIE SEIT DEM 20.09. -- aber nicht alles.
Filipe: "ich will dass ich da auch die rollen der leute wechseln
kann ohne dass ich denen einen neuen account machen muss ...
perfektionier das fuer die rolle dogfather und rechte hand. nur
die sollen das machen koennen."
Hier stand `=== 404` ("sie kann gar nichts"). Das war bis zum
19.09. richtig. Jetzt werden BEIDE Richtungen gemessen -- eine
Pruefung, die nur das Verbotene misst, laesst den Fall offen, dass
auch das Erlaubte nicht geht, und genau das faellt niemandem auf,
bis sich jemand beschwert.
Ayla ist an dieser Stelle laengst zur rechten Hand befoerdert
(Abschnitt weiter oben) -- deshalb ist sie der Fall "nicht unter
sich". */
const anEinerHand = await hole(`/workspace/api/verwaltung/personen/${idModi}/rolle`,
{ host: CREW, methode: "PUT", keks: hand.keks, rumpf: JSON.stringify({ rolle: "modi" }) }); { host: CREW, methode: "PUT", keks: hand.keks, rumpf: JSON.stringify({ rolle: "modi" }) });
ok(rolleVersuch.status === 404, `und keine Rolle vergeben (${rolleVersuch.status})`); ok(anEinerHand.status === 403,
`an einer anderen rechten Hand aendert sie nichts (${anEinerHand.status})`);
const anDogFather = await hole(`/workspace/api/verwaltung/personen/${idDogi}/rolle`,
{ host: CREW, methode: "PUT", keks: hand.keks, rumpf: JSON.stringify({ rolle: "modi" }) });
ok(anDogFather.status === 403,
`und an DogFather erst recht nicht (${anDogFather.status})`);
/* UND DIE ANDERE RICHTUNG: Was sie DARF, muss auch gehen. Ohne diese
Zeile waere die Sperre oben auch dann gruen, wenn ihr Weg voellig
zu waere. */
/* DIREKT IN DIE DATENBANK statt ueber `anlegen()`: In diesem Block
steht weiter unten ein `const anlegen = await hole(...)`, und das
verdeckt die gleichnamige Funktion im ganzen Block -- auch OBERHALB
seiner eigenen Zeile. JavaScript nennt das die tote Zone, und sie
kostete hier einen Absturz mit der Meldung "Cannot access
'anlegen' before initialization". */
const frischerModi = (() => {
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)"
+ " VALUES ('Probe-Modi','modi','x','y',1,1,?)").run(jetzt);
return d.prepare("SELECT last_insert_rowid() AS id").get().id;
})();
const anEinemModi = await hole(`/workspace/api/verwaltung/personen/${frischerModi}/rolle`,
{ host: CREW, methode: "PUT", keks: hand.keks, rumpf: JSON.stringify({ rolle: "gast" }) });
ok(anEinemModi.status === 200,
`einen Modi macht sie sehr wohl zur Community (${anEinemModi.status})`);
const nachher = d.prepare("SELECT rolle FROM personen WHERE id = ?").get(frischerModi)?.rolle;
ok(nachher === "gast", `und es steht so in der Datenbank (${nachher})`);
/* Eine Rolle, die sie nicht vergeben darf, bleibt zu -- sonst waere
"sie darf wechseln" ein Freibrief. */
const zuHoch = await hole(`/workspace/api/verwaltung/personen/${frischerModi}/rolle`,
{ host: CREW, methode: "PUT", keks: hand.keks, rumpf: JSON.stringify({ rolle: "hand" }) });
ok(zuHoch.status === 400,
`eine zweite rechte Hand ernennt sie nicht (${zuHoch.status})`);
const anlegen = await hole("/workspace/api/verwaltung/personen", const anlegen = await hole("/workspace/api/verwaltung/personen",
{ host: CREW, methode: "POST", keks: hand.keks, { host: CREW, methode: "POST", keks: hand.keks,
rumpf: JSON.stringify({ name: "Nochwer", rolle: "modi" }) }); rumpf: JSON.stringify({ name: "Nochwer", rolle: "modi" }) });
@@ -652,7 +709,7 @@ console.log("=== Haengt es wirklich an der Adresse? ===");
Pruefungen im Haus laufen dort, und eine stille Einschraenkung Pruefungen im Haus laufen dort, und eine stille Einschraenkung
haette sie alle blind gemacht, ohne dass irgendwo etwas rot wird. haette sie alle blind gemacht, ohne dass irgendwo etwas rot wird.
Genau diese Falle steht schon in crew-adresse.js beschrieben. */ Genau diese Falle steht schon in crew-adresse.js beschrieben. */
const lokal = await hole("/workspace/api/aufgaben", { host: "127.0.0.1:4381", keks: dogi.keks }); const lokal = await hole("/workspace/api/aufgaben", { host: `127.0.0.1:${PORT}`, keks: dogi.keks });
const t = (lokal.daten?.aufgaben || []).map((z) => z.titel); const t = (lokal.daten?.aufgaben || []).map((z) => z.titel);
ok(t.includes("Lunas Steckbrief nachtragen"), ok(t.includes("Lunas Steckbrief nachtragen"),
`auf 127.0.0.1 bleibt alles wie bisher (${t.length} Aufgaben)`); `auf 127.0.0.1 bleibt alles wie bisher (${t.length} Aufgaben)`);
+10 -3
View File
@@ -27,10 +27,11 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { tagLokal } from "./helfer-zeit.mjs";
import { eigenerPort } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4438, "pruef-highlights"); const PORT = await eigenerPort(import.meta, "pruef-highlights");
const ordner = mkdtempSync(join(tmpdir(), "ws-highlight-")); const ordner = mkdtempSync(join(tmpdir(), "ws-highlight-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
@@ -83,7 +84,13 @@ const einf = (titel, kanal, wannTage) => d.prepare(
+ " datum, quelle_kanal, erstellt_von, erstellt)" + " datum, quelle_kanal, erstellt_von, erstellt)"
+ " VALUES (?,?,?,?,?,?,?,?,?,?)") + " VALUES (?,?,?,?,?,?,?,?,?,?)")
.run("highlight", "clip", titel, "", "offen", "mittel", .run("highlight", "clip", titel, "", "offen", "mittel",
vorTagen(wannTage).toISOString().slice(0, 10), kanal, 1, /* Das TAGESDATUM ueber den Hausschluessel, nicht ueber UTC:
`vorTagen` verankert zwar um neun Uhr und waere damit richtig,
aber das sieht man der Zeile nicht an -- pruef-struktur hat sie
als UTC-Rechnung gemeldet. Ein Fehlalarm ist schlimmer als keine
Pruefung. Der volle Zeitstempel eine Zeile tiefer darf bleiben:
Dort ist UTC richtig, weil er eine ZEIT ist und keinen Tag. */
tagLokal(-wannTage), kanal, 1,
vorTagen(wannTage).toISOString()); vorTagen(wannTage).toISOString());
einf("Heute DogFather", "dogfather", 0); einf("Heute DogFather", "dogfather", 0);
+2 -2
View File
@@ -32,9 +32,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4188, "pruef-hilfe"); const PORT = await eigenerPort(import.meta, "pruef-hilfe");
const ordner = mkdtempSync(join(tmpdir(), "ws-hilfe-")); const ordner = mkdtempSync(join(tmpdir(), "ws-hilfe-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -68,8 +68,8 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-hochlade-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
const PORT = await portMussFreiSein(4327, "die Hochladepruefung"); const PORT = await eigenerPort(import.meta, "die Hochladepruefung");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
+5 -5
View File
@@ -32,10 +32,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-ics-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4345, "die Kalender-Abo-Pruefung"); const PORT = await eigenerPort(import.meta, "die Kalender-Abo-Pruefung");
process.env.PORT = "4345"; process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -45,7 +45,7 @@ express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(
await import("./index.js"); await import("./index.js");
notbremse(240_000, "pruef-ics"); notbremse(240_000, "pruef-ics");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4345"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-ics-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-ics-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
@@ -185,7 +185,7 @@ melde("=== Der Link entsteht erst auf Wunsch ===");
} }
const linkLuna = await linkHolen(keksLuna); const linkLuna = await linkHolen(keksLuna);
ok(/^http:\/\/127\.0\.0\.1:4345\/workspace\/kalender\/[A-Za-z0-9_-]{40,}\.ics$/.test(linkLuna || ""), ok(new RegExp(`^http://127\\.0\\.0\\.1:${PORT}/workspace/kalender/[A-Za-z0-9_-]{40,}\\.ics$`).test(linkLuna || ""),
`der Link sieht richtig aus (…${String(linkLuna).slice(-24)})`); `der Link sieht richtig aus (…${String(linkLuna).slice(-24)})`);
/* ======================================================================= /* =======================================================================
+2 -2
View File
@@ -33,10 +33,10 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4435, "pruef-installieren"); const PORT = await eigenerPort(import.meta, "pruef-installieren");
const ordner = mkdtempSync(join(tmpdir(), "ws-install-")); const ordner = mkdtempSync(join(tmpdir(), "ws-install-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -41,9 +41,9 @@ import { mkdtempSync, rmSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4191, "pruef-jeder-hat-eine-seite"); const PORT = await eigenerPort(import.meta, "pruef-jeder-hat-eine-seite");
const ordner = mkdtempSync(join(tmpdir(), "ws-seite-")); const ordner = mkdtempSync(join(tmpdir(), "ws-seite-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -45,7 +45,7 @@ import { mkdtempSync, rmSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join, dirname } from "node:path"; import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { pngLesen, pixel, kontrast } from "./helfer-png.mjs"; import { pngLesen, pixel, kontrast } from "./helfer-png.mjs";
const HIER = dirname(fileURLToPath(import.meta.url)); const HIER = dirname(fileURLToPath(import.meta.url));
@@ -216,7 +216,7 @@ melde("=== 2. Das Universum im Hintergrund ===");
melde(""); melde("");
melde("=== 3. Der Text auf der fertigen Kachel ==="); melde("=== 3. Der Text auf der fertigen Kachel ===");
const PORT = await portMussFreiSein(4194, "pruef-kachel-universum"); const PORT = await eigenerPort(import.meta, "pruef-kachel-universum");
const ordner = mkdtempSync(join(tmpdir(), "ws-kachel-")); const ordner = mkdtempSync(join(tmpdir(), "ws-kachel-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -42,9 +42,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4479, "pruef-kachelraster"); const PORT = await eigenerPort(import.meta, "pruef-kachelraster");
const ordner = mkdtempSync(join(tmpdir(), "ws-raster-")); const ordner = mkdtempSync(join(tmpdir(), "ws-raster-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -18,8 +18,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4188, "pruef-kalender"); const PORT = await eigenerPort(import.meta, "pruef-kalender");
process.env.PORT = "4188"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -29,7 +29,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -38,7 +38,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-kalender"); notbremse(480_000, "pruef-kalender");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4188"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+2 -2
View File
@@ -36,9 +36,9 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4477, "pruef-kanaele"); const PORT = await eigenerPort(import.meta, "pruef-kanaele");
const ordner = mkdtempSync(join(tmpdir(), "ws-kanal-")); const ordner = mkdtempSync(join(tmpdir(), "ws-kanal-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+5 -5
View File
@@ -26,10 +26,10 @@ import { createServer } from "node:http";
const ordner = mkdtempSync(join(tmpdir(), "ws-kz-")); const ordner = mkdtempSync(join(tmpdir(), "ws-kz-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4332, "das Bildwerkzeug"); const PORT = await eigenerPort(import.meta, "das Bildwerkzeug");
const TIKTOK = await portMussFreiSein(4502, "nachgebautes TikTok"); const TIKTOK = await eigenerPort(import.meta, "nachgebautes TikTok", 1);
process.env.PORT = "4332"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
process.env.TIKTOK_OEMBED_BASIS = `http://127.0.0.1:${TIKTOK}/oembed`; process.env.TIKTOK_OEMBED_BASIS = `http://127.0.0.1:${TIKTOK}/oembed`;
@@ -67,7 +67,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 1200)); await new Promise((r) => setTimeout(r, 1200));
const BASIS = "http://127.0.0.1:4332"; const BASIS = `http://127.0.0.1:${PORT}`;
const { DatabaseSync } = await import("node:sqlite"); const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes } = await import("node:crypto"); const { scryptSync, randomBytes } = await import("node:crypto");
+4 -4
View File
@@ -31,8 +31,8 @@ process.env.WORKSPACE_DB = join(ordner, "pruef.sqlite");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4179, "pruef-kopf-messen"); const PORT = await eigenerPort(import.meta, "pruef-kopf-messen");
process.env.PORT = "4179"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -42,7 +42,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -51,7 +51,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-kopf-messen"); notbremse(480_000, "pruef-kopf-messen");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4179"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
let geprueft = 0; let geprueft = 0;
+2 -2
View File
@@ -39,10 +39,10 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { heuteLokal } from "./helfer-tag.mjs"; import { heuteLokal } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4491, "pruef-kreislauf"); const PORT = await eigenerPort(import.meta, "pruef-kreislauf");
const ordner = mkdtempSync(join(tmpdir(), "ws-kreis-")); const ordner = mkdtempSync(join(tmpdir(), "ws-kreis-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -56,8 +56,8 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-ladefehler-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
const PORT = await portMussFreiSein(4339, "die Ladefehlerpruefung"); const PORT = await eigenerPort(import.meta, "die Ladefehlerpruefung");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
+4 -4
View File
@@ -36,10 +36,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-leistoptik-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4337, "die Zahlen-Optikpruefung"); const PORT = await eigenerPort(import.meta, "die Zahlen-Optikpruefung");
process.env.PORT = "4337"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -54,7 +54,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-leistung-optik"); notbremse(480_000, "pruef-leistung-optik");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4337"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-leistung-optik-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-leistung-optik-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+4 -4
View File
@@ -30,10 +30,10 @@ import { join } from "node:path";
const ordner = mkdtempSync(join(tmpdir(), "ws-leistung-")); const ordner = mkdtempSync(join(tmpdir(), "ws-leistung-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4333, "die Leistungspruefung"); const PORT = await eigenerPort(import.meta, "die Leistungspruefung");
process.env.PORT = "4333"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -42,7 +42,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 1000)); await new Promise((r) => setTimeout(r, 1000));
const BASIS = "http://127.0.0.1:4333"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; }; const ok = (b, t) => { console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
+4 -4
View File
@@ -33,8 +33,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4214, "pruef-lesbarkeit"); const PORT = await eigenerPort(import.meta, "pruef-lesbarkeit");
process.env.PORT = "4214"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -43,7 +43,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -52,7 +52,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-lesbarkeit"); notbremse(480_000, "pruef-lesbarkeit");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4214"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+4 -4
View File
@@ -43,8 +43,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4199, "pruef-manager-sicht"); const PORT = await eigenerPort(import.meta, "pruef-manager-sicht");
process.env.PORT = "4199"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -54,7 +54,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -63,7 +63,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-manager-sicht"); notbremse(480_000, "pruef-manager-sicht");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4199"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.();
let fehler = 0; let fehler = 0;
+4 -4
View File
@@ -31,8 +31,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4369, "pruef-modi-checkliste"); const PORT = await eigenerPort(import.meta, "pruef-modi-checkliste");
process.env.PORT = "4369"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -41,11 +41,11 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-modi-checkliste"); notbremse(180_000, "pruef-modi-checkliste");
await new Promise((r) => setTimeout(r, 800)); await new Promise((r) => setTimeout(r, 800));
const BASIS = "http://127.0.0.1:4369"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
let geprueft = 0; let geprueft = 0;
+4 -4
View File
@@ -36,8 +36,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4365, "pruef-modi-ideen"); const PORT = await eigenerPort(import.meta, "pruef-modi-ideen");
process.env.PORT = "4365"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -102,11 +102,11 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-modi-ideen"); notbremse(180_000, "pruef-modi-ideen");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4365"; const BASIS = `http://127.0.0.1:${PORT}`;
console.log("\n=== 2. Die Umstellung ===\n"); console.log("\n=== 2. Die Umstellung ===\n");
{ {
+4 -4
View File
@@ -27,8 +27,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4363, "pruef-modi-katalog"); const PORT = await eigenerPort(import.meta, "pruef-modi-katalog");
process.env.PORT = "4363"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -39,11 +39,11 @@ express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { ersatzschreibungen } from "./helfer-deutsch.mjs"; import { ersatzschreibungen } from "./helfer-deutsch.mjs";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-modi-katalog"); notbremse(180_000, "pruef-modi-katalog");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4363"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
let geprueft = 0; let geprueft = 0;
+4 -4
View File
@@ -28,8 +28,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4361, "pruef-modi-kategorien"); const PORT = await eigenerPort(import.meta, "pruef-modi-kategorien");
process.env.PORT = "4361"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -38,11 +38,11 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-modi-kategorien"); notbremse(180_000, "pruef-modi-kategorien");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4361"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
let geprueft = 0; let geprueft = 0;
+4 -4
View File
@@ -32,8 +32,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4367, "pruef-modi-livecheck"); const PORT = await eigenerPort(import.meta, "pruef-modi-livecheck");
process.env.PORT = "4367"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -42,11 +42,11 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
notbremse(180_000, "pruef-modi-livecheck"); notbremse(180_000, "pruef-modi-livecheck");
await new Promise((r) => setTimeout(r, 800)); await new Promise((r) => setTimeout(r, 800));
const BASIS = "http://127.0.0.1:4367"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
let geprueft = 0; let geprueft = 0;
+4 -4
View File
@@ -28,8 +28,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4359, "pruef-modi-verborgen"); const PORT = await eigenerPort(import.meta, "pruef-modi-verborgen");
process.env.PORT = "4359"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -38,14 +38,14 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* NACH index.js: Der Server haengt dort zwei Auffangnetze ein, die /* NACH index.js: Der Server haengt dort zwei Auffangnetze ein, die
einen Absturz nur protokollieren. Fuer den Betrieb richtig, fuer eine einen Absturz nur protokollieren. Fuer den Betrieb richtig, fuer eine
Pruefung fatal -- ohne diese Zeile bliebe der Prozess ewig stehen. */ Pruefung fatal -- ohne diese Zeile bliebe der Prozess ewig stehen. */
notbremse(180_000, "pruef-modi-verborgen"); notbremse(180_000, "pruef-modi-verborgen");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4359"; const BASIS = `http://127.0.0.1:${PORT}`;
let fehler = 0; let fehler = 0;
let geprueft = 0; let geprueft = 0;
+2 -2
View File
@@ -326,12 +326,12 @@ if (process.env.OHNE_BROWSER === "ja") {
} else { } else {
const { mkdtempSync, rmSync } = await import("node:fs"); const { mkdtempSync, rmSync } = await import("node:fs");
const { tmpdir } = await import("node:os"); const { tmpdir } = await import("node:os");
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
const { notbremse } = await import("./helfer-notbremse.mjs"); const { notbremse } = await import("./helfer-notbremse.mjs");
const ordner = mkdtempSync(join(tmpdir(), "ws-nachfrage-")); const ordner = mkdtempSync(join(tmpdir(), "ws-nachfrage-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const PORT = await portMussFreiSein(4329, "die Nachfragepruefung"); const PORT = await eigenerPort(import.meta, "die Nachfragepruefung");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
+2 -2
View File
@@ -35,9 +35,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4191, "pruef-nachruesten"); const PORT = await eigenerPort(import.meta, "pruef-nachruesten");
const ordner = mkdtempSync(join(tmpdir(), "ws-nachruesten-")); const ordner = mkdtempSync(join(tmpdir(), "ws-nachruesten-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+2 -2
View File
@@ -24,10 +24,10 @@ import { mkdtempSync, rmSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
import { tagLokal } from "./helfer-tag.mjs"; import { tagLokal } from "./helfer-tag.mjs";
const PORT = await portMussFreiSein(4404, "pruef-nachwuchs"); const PORT = await eigenerPort(import.meta, "pruef-nachwuchs");
const ordner = mkdtempSync(join(tmpdir(), "ws-nachwuchs-")); const ordner = mkdtempSync(join(tmpdir(), "ws-nachwuchs-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -35,9 +35,9 @@ import { mkdtempSync, rmSync, mkdirSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4403, "pruef-neue-seiten"); const PORT = await eigenerPort(import.meta, "pruef-neue-seiten");
const ordner = mkdtempSync(join(tmpdir(), "ws-treffs-")); const ordner = mkdtempSync(join(tmpdir(), "ws-treffs-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+4 -4
View File
@@ -29,8 +29,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4198, "pruef-personen-formular"); const PORT = await eigenerPort(import.meta, "pruef-personen-formular");
process.env.PORT = "4198"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -40,7 +40,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -49,7 +49,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-personen-formular"); notbremse(480_000, "pruef-personen-formular");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4198"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.();
let fehler = 0; let fehler = 0;
+4 -4
View File
@@ -31,10 +31,10 @@ const ordner = mkdtempSync(join(tmpdir(), "ws-perskachel-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
const { portMussFreiSein } = await import("./helfer-port.mjs"); const { eigenerPort } = await import("./helfer-port.mjs");
await portMussFreiSein(4329, "die Personenkachel-Pruefung"); const PORT = await eigenerPort(import.meta, "die Personenkachel-Pruefung");
process.env.PORT = "4329"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
@@ -44,7 +44,7 @@ express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(
await import("./index.js"); await import("./index.js");
notbremse(420_000, "pruef-personen-kachel"); notbremse(420_000, "pruef-personen-kachel");
await new Promise((r) => setTimeout(r, 900)); await new Promise((r) => setTimeout(r, 900));
const BASIS = "http://127.0.0.1:4329"; const BASIS = `http://127.0.0.1:${PORT}`;
const PROTOKOLL = join(process.cwd(), "pruef-personen-kachel-lauf.txt"); const PROTOKOLL = join(process.cwd(), "pruef-personen-kachel-lauf.txt");
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ } try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
+4 -4
View File
@@ -23,8 +23,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4187, "pruef-personen-liste"); const PORT = await eigenerPort(import.meta, "pruef-personen-liste");
process.env.PORT = "4187"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -34,7 +34,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -43,7 +43,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-personen-liste"); notbremse(480_000, "pruef-personen-liste");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4187"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
let fehler = 0; let fehler = 0;
+4 -4
View File
@@ -8,7 +8,7 @@
import { mkdtempSync, rmSync, readdirSync } from "node:fs"; import { mkdtempSync, rmSync, readdirSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const ordner = mkdtempSync(join(tmpdir(), "ws-loeschen-")); const ordner = mkdtempSync(join(tmpdir(), "ws-loeschen-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
@@ -17,8 +17,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4188, "pruef-personen-loeschen"); const PORT = await eigenerPort(import.meta, "pruef-personen-loeschen");
process.env.PORT = "4188"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -29,7 +29,7 @@ const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js"); await import("./index.js");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4188"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
/* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des /* ORTSZEIT, nicht UTC. Die Anwendung rechnet "heute" nach der Uhr des
+143
View File
@@ -0,0 +1,143 @@
/* =====================================================================
pruef-portnummern.mjs — Zwei Pruefungen, eine Nummer
WAS HIER SCHIEFGING (20.09.2026 gemessen):
164 Pruefdateien, 129 verschiedene Nummern -- NEUNZEHN waren doppelt
vergeben, 4186 und 4188 und 4196 und 4198 sogar dreifach. Niemand
hatte das gewollt; jede neue Pruefung wurde von einer vorhandenen
abgeschrieben, und die Nummer kam mit.
WAS DAS ANRICHTET: Der Waechter bricht ab, statt gegen einen fremden
Server zu messen -- so weit, so richtig. Aber zwei Pruefungen mit
derselben Nummer koennen nie gleichzeitig laufen, und ein
liegengebliebener Prozess der einen laesst die andere mit einer
Meldung abbrechen, die wie ein Befund aussieht. Genau das ist am
20.09. zweimal passiert, beide Male mit Fehlersuche an der falschen
Stelle.
WAS DIESE PRUEFUNG SICHERT: Dass die Nummer ABGELEITET bleibt. Eine
von Hand eingetragene Zahl ist der Anfang der naechsten Doppelung --
sie faellt nur niemandem auf, bis zwei Laeufe kollidieren.
===================================================================== */
import { readdirSync, readFileSync } from "node:fs";
import { eigenerPort, portNummer } from "./helfer-port.mjs";
let ok_ = 0, fehl = 0;
const ok = (b, text) => { if (b) { ok_++; console.log(" ok " + text); }
else { fehl++; console.log(" FEHL " + text); } };
const ORDNER = new URL(".", import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, "$1");
const dateien = readdirSync(ORDNER)
.filter((f) => f.startsWith("pruef-") && f.endsWith(".mjs")).sort();
console.log("\n=== 1. Niemand traegt eine Nummer von Hand ein ===");
const vonHand = [];
const ohneWaechter = [];
for (const f of dateien) {
const s = readFileSync(ORDNER + "/" + f, "utf8");
/* Kommentare zaehlen nicht: In helfer-port.mjs und hier stehen alte
Nummern als Beleg, und ein Beleg ist kein Eintrag. */
const code = s.replace(/\/\*[\s\S]*?\*\//g, "").replace(/^\s*\/\/.*$/gm, "");
if (/portMussFreiSein\(\s*\d/.test(code)) vonHand.push(f);
const startetServer = /listen\(|process\.env\.PORT\s*=/.test(code);
if (startetServer && !/eigenerPort\(\s*import\.meta/.test(code)) ohneWaechter.push(f);
}
ok(dateien.length > 100, `${dateien.length} Pruefdateien angesehen`);
ok(vonHand.length === 0,
`keine traegt eine feste Nummer im Waechter (${vonHand.slice(0, 4).join(", ") || "—"})`);
ok(ohneWaechter.length === 0,
`jede, die einen Server startet, leitet ihre Nummer ab (${ohneWaechter.slice(0, 4).join(", ") || "—"})`);
console.log("\n=== 2. Die abgeleiteten Nummern sind eindeutig ===");
const belegt = new Map();
let doppelt = 0;
dateien.forEach((f, i) => {
for (let n = 0; n < 2; n++) {
const p = portNummer(i * 2 + n);
if (belegt.has(p)) { doppelt++; console.log(` ${p}: ${belegt.get(p)} und ${f}`); }
belegt.set(p, f);
}
});
ok(belegt.size === dateien.length * 2 && doppelt === 0,
`${belegt.size} Nummern fuer ${dateien.length} Dateien, ${doppelt} doppelt`);
console.log("\n=== 2b. Keine davon ist eine, die `fetch` verweigert ===");
/* DIE TEUERSTE HALBE STUNDE DIESES ABENDS. Nach der Umstellung bekam
pruef-chat-kanaele die 5060 und stuerzte ab -- obwohl der Server
nachweislich lief und die Anmeldung ueber `http.request` geklappt
hatte. 5060 ist SIP und steht auf der "bad ports"-Liste der
Fetch-Spezifikation, die Node uebernommen hat: `fetch` baut dorthin
keine Verbindung auf.
Die Meldung lautet "fetch failed" -- genau wie bei einem Server, der
nicht laeuft. Wer sie liest, sucht am Server. Deshalb steht sie
jetzt hier als eigene Pruefung: Die naechste Datei, die in so eine
Nummer rutscht, soll es HIER erfahren und nicht in einer
Fehlersuche. */
const BOESE = [1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53,
69, 77, 79, 87, 95, 101, 102, 103, 104, 109, 110, 111, 113, 115, 117, 119,
123, 135, 137, 138, 139, 143, 161, 179, 389, 427, 465, 512, 513, 514, 515,
526, 530, 531, 532, 540, 548, 554, 556, 563, 587, 601, 636, 989, 990, 993,
995, 1719, 1720, 1723, 2049, 3659, 4045, 4190, 5060, 5061, 6000, 6566, 6665,
6666, 6667, 6668, 6669, 6679, 6697, 10080];
const getroffen = [...belegt.keys()].filter((x) => BOESE.includes(x));
ok(getroffen.length === 0,
`keine der ${belegt.size} Nummern steht auf der Sperrliste (${getroffen.join(", ") || "—"})`);
/* GEGENPROBE AM ECHTEN VERHALTEN, nicht an der Liste: Ein Zuhoerer auf
einer gesperrten Nummer muss fuer `fetch` unerreichbar sein, einer
daneben erreichbar. Ohne das waere die Liste oben nur eine
Behauptung ueber Node -- und Behauptungen altern. */
{
const { createServer } = await import("node:http");
const probe = async (nummer) => {
const dienst = createServer((q, a) => { a.writeHead(200); a.end("da"); });
await new Promise((r) => dienst.listen(nummer, "127.0.0.1", r));
let grund = "erreichbar";
try { await fetch(`http://127.0.0.1:${nummer}/`); }
catch (f) { grund = f?.cause?.message || f?.message || "?"; }
await new Promise((r) => dienst.close(r));
return grund;
};
const gesperrt = await probe(5060);
const erlaubt = await probe(portNummer(0));
ok(/bad port/i.test(gesperrt),
`eine gesperrte Nummer ist fuer fetch tot, obwohl jemand lauscht (5060: ${gesperrt})`);
ok(erlaubt === "erreichbar",
`eine abgeleitete dagegen nicht (${portNummer(0)}: ${erlaubt})`);
}
console.log("\n=== 3. Die Ableitung stimmt wirklich (gemessen, nicht gerechnet) ===");
/* NICHT die Formel gegen sich selbst pruefen -- das waere eine
Bestaetigung ohne Aussage. Gefragt wird die Funktion, die die
Pruefungen auch benutzen, und verglichen wird mit der Stelle im
Alphabet. */
const ersteDatei = dateien[0];
const meine = dateien.indexOf("pruef-portnummern.mjs");
const p0 = await eigenerPort(import.meta, "pruef-portnummern (Selbsttest)", 0);
ok(p0 === portNummer(meine * 2),
`meine eigene Nummer ist ${p0} — Stelle ${meine} im Alphabet, erste Datei ${ersteDatei}`);
const p1 = await eigenerPort(import.meta, "pruef-portnummern (Selbsttest)", 1);
ok(p1 === p0 + 1, `und die zweite ist ${p1}, also genau eine daneben`);
console.log("\n=== 4. Gegenprobe: kann sie auch NICHT IN ORDNUNG sagen? ===");
/* Eine Pruefung, die immer bestaetigt, bestaetigt nichts. */
let drittesAusgangGriff = false;
try {
/* Eine Datei, die es nicht gibt -- die Ableitung darf dann NICHT
raten, sondern muss abbrechen. */
await eigenerPort({ url: new URL("./gibt-es-nicht.mjs", import.meta.url).href }, "Gegenprobe");
} catch (f) {
drittesAusgangGriff = /steht nicht in der Liste/.test(f?.message || "");
}
ok(drittesAusgangGriff, "eine unbekannte Datei bekommt keine geratene Nummer, sondern einen Abbruch");
let zuHoheNummer = false;
try { await eigenerPort(import.meta, "Gegenprobe", 7); }
catch (f) { zuHoheNummer = /Nummern je Datei/.test(f?.message || ""); }
ok(zuHoheNummer, "und eine dritte Nummer je Datei gibt es nicht");
console.log(`\n${ok_} Pruefungen, ${fehl} Fehler`);
console.log(fehl ? "NICHT IN ORDNUNG\n" : "ALLES IN ORDNUNG\n");
process.exit(fehl ? 1 : 0);
+4 -4
View File
@@ -15,8 +15,8 @@ process.env.WORKSPACE_DB = join(ordner, "pruef.sqlite");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4180, "pruef-protokoll-klappe"); const PORT = await eigenerPort(import.meta, "pruef-protokoll-klappe");
process.env.PORT = "4180"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -26,7 +26,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -35,7 +35,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-protokoll-klappe"); notbremse(480_000, "pruef-protokoll-klappe");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4180"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 200_000).unref?.();
let fehler = 0; let fehler = 0;
+4 -4
View File
@@ -36,8 +36,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4197, "pruef-protokoll-loeschen"); const PORT = await eigenerPort(import.meta, "pruef-protokoll-loeschen");
process.env.PORT = "4197"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -47,7 +47,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -56,7 +56,7 @@ await import("./index.js");
Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */ Server ihn am Leben haelt (siehe helfer-notbremse.mjs). */
notbremse(480_000, "pruef-protokoll-loeschen"); notbremse(480_000, "pruef-protokoll-loeschen");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4197"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 300_000).unref?.();
let fehler = 0; let fehler = 0;
+16 -4
View File
@@ -51,6 +51,18 @@ import {
`unref()` allein genuegt nicht -- es nimmt dem Handle nur das Recht, `unref()` allein genuegt nicht -- es nimmt dem Handle nur das Recht,
den Prozess am Leben zu halten; im Schliessen ist es trotzdem. */ den Prozess am Leben zu halten; im Schliessen ist es trotzdem. */
/* ZWEI NACHGEBAUTE PUSH-DIENSTE, ZWEI NUMMERN (20.09.2026).
Vorher standen hier 4341 und 4342 fest -- und 4341 gehoerte
gleichzeitig pruef-agentur. Aufgefallen ist das NICHT beim
Nachzaehlen der Doppelungen: Diese Datei rief den Waechter gar
nicht auf und tauchte in der Liste deshalb nie auf. Gefunden hat
sie erst pruef-portnummern mit der anderen Frage -- "wer startet
einen Server, ohne seine Nummer abzuleiten?". Eine Liste zeigt
nur, was auf ihr steht. */
const { eigenerPort } = await import("./helfer-port.mjs");
const PORT = await eigenerPort(import.meta, "pruef-push-weg", 0);
const PORT2 = await eigenerPort(import.meta, "pruef-push-weg (Fehlercodes)", 1);
const schliessen = (dienst) => new Promise((fertig) => { const schliessen = (dienst) => new Promise((fertig) => {
if (!dienst.listening) return fertig(); if (!dienst.listening) return fertig();
dienst.close(() => fertig()); dienst.close(() => fertig());
@@ -141,10 +153,10 @@ let empfangen = null, kopfzeilen = null;
a.writeHead(201); a.end(); a.writeHead(201); a.end();
}); });
}); });
await new Promise((r) => dienst.listen(4341, "127.0.0.1", r)); await new Promise((r) => dienst.listen(PORT, "127.0.0.1", r));
const paar = schluesselErzeugen(); const paar = schluesselErzeugen();
const e = await schicken({ endpunkt: "http://127.0.0.1:4341/push/abc", ...anmeldung }, const e = await schicken({ endpunkt: `http://127.0.0.1:${PORT}/push/abc`, ...anmeldung },
TEXT, paar, "mailto:[email protected]"); TEXT, paar, "mailto:[email protected]");
ok(e.ok, `zugestellt (Status ${e.status})`); ok(e.ok, `zugestellt (Status ${e.status})`);
@@ -181,8 +193,8 @@ console.log("\n=== Ein Geraet, das es nicht mehr gibt ===");
const paar = schluesselErzeugen(); const paar = schluesselErzeugen();
for (const [code, erwartetWeg] of [[410, true], [404, true], [500, false], [429, false]]) { for (const [code, erwartetWeg] of [[410, true], [404, true], [500, false], [429, false]]) {
const d = createServer((q, a) => { a.writeHead(code); a.end(); }); const d = createServer((q, a) => { a.writeHead(code); a.end(); });
await new Promise((r) => d.listen(4342, "127.0.0.1", r)); await new Promise((r) => d.listen(PORT2, "127.0.0.1", r));
const e = await schicken({ endpunkt: "http://127.0.0.1:4342/x", ...anmeldung }, const e = await schicken({ endpunkt: `http://127.0.0.1:${PORT2}/x`, ...anmeldung },
TEXT, paar, "mailto:[email protected]"); TEXT, paar, "mailto:[email protected]");
ok(e.weg === erwartetWeg, ok(e.weg === erwartetWeg,
`${code} -> weg=${e.weg} (erwartet ${erwartetWeg})` `${code} -> weg=${e.weg} (erwartet ${erwartetWeg})`
+3 -3
View File
@@ -37,10 +37,10 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { createServer } from "node:http"; import { createServer } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4423, "pruef-push-ziel"); const PORT = await eigenerPort(import.meta, "pruef-push-ziel");
const DIENST = await portMussFreiSein(4424, "pruef-push-ziel (Push-Dienst)"); const DIENST = await eigenerPort(import.meta, "pruef-push-ziel (Push-Dienst)", 1);
const ordner = mkdtempSync(join(tmpdir(), "ws-pz-")); const ordner = mkdtempSync(join(tmpdir(), "ws-pz-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -24,9 +24,9 @@ import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { request as httpAnfrage } from "node:http"; import { request as httpAnfrage } from "node:http";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4405, "pruef-rechte-umstellen"); const PORT = await eigenerPort(import.meta, "pruef-rechte-umstellen");
const ordner = mkdtempSync(join(tmpdir(), "ws-rechte-")); const ordner = mkdtempSync(join(tmpdir(), "ws-rechte-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -46,9 +46,9 @@
import { mkdtempSync, rmSync, readdirSync, existsSync } from "node:fs"; import { mkdtempSync, rmSync, readdirSync, existsSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4397, "pruef-rechtetafel"); const PORT = await eigenerPort(import.meta, "pruef-rechtetafel");
const ordner = mkdtempSync(join(tmpdir(), "ws-rechte-")); const ordner = mkdtempSync(join(tmpdir(), "ws-rechte-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
+2 -2
View File
@@ -40,9 +40,9 @@
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
const PORT = await portMussFreiSein(4497, "pruef-rollen-anlegen"); const PORT = await eigenerPort(import.meta, "pruef-rollen-anlegen");
const ordner = mkdtempSync(join(tmpdir(), "ws-ra-")); const ordner = mkdtempSync(join(tmpdir(), "ws-ra-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db"); process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT); process.env.PORT = String(PORT);
+4 -4
View File
@@ -38,8 +38,8 @@ process.env.WORKSPACE_DB = join(ordner, "workspace.db");
STILL nicht -- und alles Folgende misst gegen einen fremden STILL nicht -- und alles Folgende misst gegen einen fremden
Stand. Das ist der dritte Ausgang: belegt ist etwas anderes Stand. Das ist der dritte Ausgang: belegt ist etwas anderes
als kaputt. */ als kaputt. */
await portMussFreiSein(4193, "pruef-rollen"); const PORT = await eigenerPort(import.meta, "pruef-rollen");
process.env.PORT = "4193"; process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1"; process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1"; process.env.SITE_ACCESS_CODE_VANVAN = "VANVAN-TEST-1";
@@ -49,7 +49,7 @@ const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
import { notbremse } from "./helfer-notbremse.mjs"; import { notbremse } from "./helfer-notbremse.mjs";
import { portMussFreiSein } from "./helfer-port.mjs"; import { eigenerPort } from "./helfer-port.mjs";
await import("./index.js"); await import("./index.js");
/* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort /* DIE NOTBREMSE. Muss NACH index.js stehen: Der Server haengt dort
zwei Auffangnetze ein, die einen Absturz nur protokollieren -- zwei Auffangnetze ein, die einen Absturz nur protokollieren --
@@ -76,7 +76,7 @@ await import("./index.js");
irgendwann gar nichts mehr. */ irgendwann gar nichts mehr. */
notbremse(900_000, "pruef-rollen"); notbremse(900_000, "pruef-rollen");
await new Promise((r) => setTimeout(r, 700)); await new Promise((r) => setTimeout(r, 700));
const BASIS = "http://127.0.0.1:4193"; const BASIS = `http://127.0.0.1:${PORT}`;
setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 540_000).unref?.(); setTimeout(() => { console.log("ABBRUCH"); process.exit(1); }, 540_000).unref?.();
let fehler = 0; let fehler = 0;

Some files were not shown because too many files have changed in this diff Show More