rm -rf mlog/ mkdir -p mlog/relay mlog/client Running interop tests... Relay: ghcr.io/endel/quic-zig-moq-relay:latest Client: ghcr.io/englishm/moq-interop-runner-moq-dev-js-client:latest URL: https://relay:4443 time="2026-10-26T15:15:25Z" level=warning msg="The \"PORT\" variable is not set. Defaulting to a blank string." time="2026-10-26T15:15:25Z" level=warning msg="The \"PORT\" variable is not set. Defaulting to a blank string." time="2026-10-26T15:15:25Z" level=warning msg="The \"PORT\" variable is not set. Defaulting to a blank string." time="2026-10-26T15:15:25Z" level=warning msg="The \"HEX\" variable is not set. Defaulting to a blank string." time="2026-10-26T15:15:25Z" level=warning msg="The \"HEX\" variable is not set. Defaulting to a blank string." Container runner-upstream-relay-1 Recreate Container runner-upstream-relay-1 Recreated Container runner-upstream-test-client-1 Recreate Container runner-upstream-test-client-1 Recreated Attaching to relay-1, test-client-1 relay-1 | relay-1 | === MoQ Relay (draft-17/18, WebTransport + QUIC) === relay-1 | Certificate SHA-256: 27ba6f09ac3e8e16bedfcf3146ba6861e040cce0b711a4425396949f7e9fd965 relay-1 | relay-1 | Listening on https://0.0.0.0:4443 relay-1 | Video demo: https://127.0.0.1:4443/moq_video.html relay-1 | Clock demo: https://127.0.0.1:4443/moq.html relay-1 | test-client-1 | TAP version 14 test-client-1 | # moq-dev-js-client v0.1.0 (@moq/net 0.4.4) test-client-1 | # Relay: https://relay:4443 test-client-1 | 1..8 relay-1 | [relay] client 0 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 0 SETUP received relay-1 | [relay] client 0 gone test-client-1 | ok 1 - setup-only test-client-1 | --- test-client-1 | duration_ms: 135 test-client-1 | ... relay-1 | [relay] client 0 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 0 SETUP received relay-1 | [relay] PUBLISH_NAMESPACE client=0 ns="moq-test/interop/" relay-1 | [relay] client 0 gone test-client-1 | ok 2 - announce-only test-client-1 | --- test-client-1 | duration_ms: 535 test-client-1 | ... relay-1 | [relay] client 0 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 0 SETUP received relay-1 | [relay] PUBLISH_NAMESPACE client=0 ns="moq-test/interop/" relay-1 | [relay] client 0 gone test-client-1 | ok 3 - publish-namespace-done test-client-1 | --- test-client-1 | duration_ms: 733 test-client-1 | ... relay-1 | [relay] client 0 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 0 SETUP received test-client-1 | subscribe_namespace written: requestId=0 relay-1 | [relay] SUBSCRIBE_NAMESPACE client=0 prefix="moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd/" relay-1 | [relay] client 1 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 1 SETUP received relay-1 | [relay] PUBLISH_NAMESPACE client=1 ns="moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd/" test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=true test-client-1 | not ok 4 - subscribe-namespace-lifecycle test-client-1 | --- test-client-1 | duration_ms: 3016 test-client-1 | test_spec_revision: 1 test-client-1 | message: "timeout after 3000ms: NAMESPACE_DONE" test-client-1 | ... relay-1 | [relay] client 2 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 2 SETUP received test-client-1 | subscribe start: id=2 broadcast=nonexistent/namespace track=test-track relay-1 | [relay] SUBSCRIBE_NAMESPACE client=2 prefix="" relay-1 | [relay] → 1 NAMESPACE to client 2 relay-1 | [relay] SUBSCRIBE client=2 ns="nonexistent/namespace/" track="test-track" relay-1 | [relay] REQUEST_ERROR → client: code=16 no such namespace test-client-1 | subscribe_namespace written: requestId=0 test-client-1 | subscribe written: id=2 broadcast=nonexistent/namespace track=test-track test-client-1 | subscribe error: id=2 broadcast=nonexistent/namespace track=test-track error=SUBSCRIBE error: does_not_exist (code=16) no such namespace test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=true relay-1 | [relay] client 2 gone test-client-1 | subscribe_namespace error: session error: connection error: closed test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=false test-client-1 | broadcast discovery failed; broadcasts resolve on request only. 162 | if (!this.#reader) { test-client-1 | 163 | return false; test-client-1 | 164 | } test-client-1 | 165 | // Every read of this stream funnels through here, so decoding the peer's reset code test-client-1 | 166 | // once is enough to keep the raw transport error out of every caller (and every app). test-client-1 | 167 | const result = await this.#reader.read().catch((err) => { test-client-1 | ^ test-client-1 | error: session error: connection error: closed test-client-1 | code: "GenericFailure" test-client-1 | test-client-1 | at async #fill (/app/node_modules/@moq/net/stream.js:167:50) test-client-1 | at async done (/app/node_modules/@moq/net/stream.js:333:29) test-client-1 | at async (/app/node_modules/@moq/net/ietf/subscriber.js:278:58) test-client-1 | test-client-1 | ok 5 - subscribe-error test-client-1 | --- test-client-1 | duration_ms: 316 test-client-1 | ... relay-1 | [relay] client 2 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 2 SETUP received relay-1 | [relay] PUBLISH_NAMESPACE client=2 ns="moq-test/interop/" relay-1 | [relay] client 3 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 3 SETUP received test-client-1 | subscribe_namespace written: requestId=0 relay-1 | [relay] SUBSCRIBE_NAMESPACE client=3 prefix="" relay-1 | [relay] → 2 NAMESPACE to client 3 test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=true test-client-1 | announced: broadcast=moq-test/interop active=true test-client-1 | subscribe start: id=2 broadcast=moq-test/interop track=test-track test-client-1 | subscribe written: id=2 broadcast=moq-test/interop track=test-track relay-1 | [relay] SUBSCRIBE client=3 ns="moq-test/interop/" track="test-track" relay-1 | [relay] SUBSCRIBE → publisher client 2 ns="moq-test/interop/" track="test-track" test-client-1 | publish ok: broadcast=moq-test/interop track=test-track relay-1 | [relay] SUBSCRIBE_OK ← publisher client 2 alias=1 test-client-1 | subscribe ok: id=2 broadcast=moq-test/interop track=test-track relay-1 | [relay] client 2 gone relay-1 | [relay] PUBLISH_DONE → client 3 status=2 streams=0 test-client-1 | announced: broadcast=moq-test/interop active=false test-client-1 | publish done: broadcast=moq-test/interop track=test-track test-client-1 | publish error: broadcast=moq-test/interop track=test-track error=session error: connection error: closed relay-1 | [relay] client 3 gone test-client-1 | subscribe_namespace error: session error: connection error: closed test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=false test-client-1 | broadcast discovery failed; broadcasts resolve on request only. 162 | if (!this.#reader) { test-client-1 | 163 | return false; test-client-1 | 164 | } test-client-1 | 165 | // Every read of this stream funnels through here, so decoding the peer's reset code test-client-1 | 166 | // once is enough to keep the raw transport error out of every caller (and every app). test-client-1 | 167 | const result = await this.#reader.read().catch((err) => { test-client-1 | ^ test-client-1 | error: session error: connection error: closed test-client-1 | code: "GenericFailure" test-client-1 | test-client-1 | at async #fill (/app/node_modules/@moq/net/stream.js:167:50) test-client-1 | at async done (/app/node_modules/@moq/net/stream.js:333:29) test-client-1 | at async (/app/node_modules/@moq/net/ietf/subscriber.js:278:58) test-client-1 | test-client-1 | ok 6 - announce-subscribe test-client-1 | --- test-client-1 | duration_ms: 347 test-client-1 | ... relay-1 | [relay] client 2 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 2 SETUP received test-client-1 | subscribe_namespace written: requestId=0 relay-1 | [relay] SUBSCRIBE_NAMESPACE client=2 prefix="" relay-1 | [relay] → 1 NAMESPACE to client 2 test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=true relay-1 | [relay] client 3 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 3 SETUP received relay-1 | [relay] PUBLISH_NAMESPACE client=3 ns="moq-test/interop/" test-client-1 | announced: broadcast=moq-test/interop active=true test-client-1 | subscribe start: id=2 broadcast=moq-test/interop track=test-track test-client-1 | subscribe written: id=2 broadcast=moq-test/interop track=test-track relay-1 | [relay] SUBSCRIBE client=2 ns="moq-test/interop/" track="test-track" relay-1 | [relay] SUBSCRIBE → publisher client 3 ns="moq-test/interop/" track="test-track" relay-1 | [relay] SUBSCRIBE_OK ← publisher client 3 alias=1 test-client-1 | publish ok: broadcast=moq-test/interop track=test-track test-client-1 | subscribe ok: id=2 broadcast=moq-test/interop track=test-track relay-1 | [relay] client 3 gone relay-1 | [relay] PUBLISH_DONE → client 2 status=2 streams=0 test-client-1 | publish done: broadcast=moq-test/interop track=test-track test-client-1 | publish error: broadcast=moq-test/interop track=test-track error=session error: connection error: closed test-client-1 | announced: broadcast=moq-test/interop active=false relay-1 | [relay] client 2 gone test-client-1 | subscribe_namespace error: session error: connection error: closed test-client-1 | announced: broadcast=moq-test/interop/subscribe-namespace-lifecycle/444fecec10d70e6f8d769083adfb8bdd active=false test-client-1 | broadcast discovery failed; broadcasts resolve on request only. 162 | if (!this.#reader) { test-client-1 | 163 | return false; test-client-1 | 164 | } test-client-1 | 165 | // Every read of this stream funnels through here, so decoding the peer's reset code test-client-1 | 166 | // once is enough to keep the raw transport error out of every caller (and every app). test-client-1 | 167 | const result = await this.#reader.read().catch((err) => { test-client-1 | ^ test-client-1 | error: session error: connection error: closed test-client-1 | code: "GenericFailure" test-client-1 | test-client-1 | at async #fill (/app/node_modules/@moq/net/stream.js:167:50) test-client-1 | at async done (/app/node_modules/@moq/net/stream.js:333:29) test-client-1 | at async (/app/node_modules/@moq/net/ietf/subscriber.js:278:58) test-client-1 | test-client-1 | ok 7 - subscribe-before-announce test-client-1 | --- test-client-1 | duration_ms: 540 test-client-1 | ... relay-1 | [relay] client 2 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 2 SETUP received relay-1 | [relay] PUBLISH_NAMESPACE client=2 ns="moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/" relay-1 | [relay] client 3 connected (WT session 0, moqt-18) test-client-1 | https://relay:4443/ connected via WebTransport test-client-1 | https://relay:4443/ negotiated ALPN: moqt-18 relay-1 | [relay] client 3 SETUP received test-client-1 | subscribe_namespace written: requestId=0 relay-1 | [relay] SUBSCRIBE_NAMESPACE client=3 prefix="moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/" relay-1 | [relay] → 1 NAMESPACE to client 3 test-client-1 | announced: broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393 active=true test-client-1 | subscribe start: id=2 broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0 track=track test-client-1 | subscribe written: id=2 broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0 track=track relay-1 | [relay] SUBSCRIBE client=3 ns="moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0/" track="track" relay-1 | [relay] SUBSCRIBE → publisher client 2 ns="moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0/" track="track" test-client-1 | publish ok: broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0 track=track test-client-1 | subscribe ok: id=2 broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0 track=track relay-1 | [relay] SUBSCRIBE_OK ← publisher client 2 alias=1 relay-1 | [relay] stream from client 2 → 1 subs (group=0) relay-1 | [relay] stream from client 2 → 1 subs (group=1) relay-1 | [relay] cached group 1 for track 0 (32 bytes) relay-1 | [relay] stream from client 2 → 1 subs (group=2) relay-1 | [relay] cached group 2 for track 0 (32 bytes) relay-1 | [relay] cached group 2 for track 0 (222 bytes) relay-1 | [relay] stream from client 2 → 1 subs (group=3) test-client-1 | publish done: broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0 track=track relay-1 | [relay] cached group 3 for track 0 (3 bytes) relay-1 | [relay] PUBLISH_DONE → client 3 status=2 streams=4 test-client-1 | subscribe close: id=2 broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393/moq-test-00/0/0/0/2/4/5/64/32/2/1/1/0/-1/-1/0 track=track relay-1 | [relay] client 2 gone test-client-1 | announced: broadcast=moq-test/data-subgroup-basic/8070e4578ac7a7bfd596205389c48393 active=false relay-1 | [relay] client 3 gone test-client-1 | subscribe_namespace error: session error: connection error: closed test-client-1 | broadcast discovery failed; broadcasts resolve on request only. 162 | if (!this.#reader) { test-client-1 | 163 | return false; test-client-1 | 164 | } test-client-1 | 165 | // Every read of this stream funnels through here, so decoding the peer's reset code test-client-1 | 166 | // once is enough to keep the raw transport error out of every caller (and every app). test-client-1 | 167 | const result = await this.#reader.read().catch((err) => { test-client-1 | ^ test-client-1 | error: session error: connection error: closed test-client-1 | code: "GenericFailure" test-client-1 | test-client-1 | at async #fill (/app/node_modules/@moq/net/stream.js:167:50) test-client-1 | at async done (/app/node_modules/@moq/net/stream.js:333:29) test-client-1 | at async (/app/node_modules/@moq/net/ietf/subscriber.js:278:58) test-client-1 | test-client-1 | ok 8 - data-subgroup-basic test-client-1 | --- test-client-1 | duration_ms: 100 test-client-1 | test_spec_revision: 2 test-client-1 | ... test-client-1 exited with code 1 Aborting on container exit... Container runner-upstream-test-client-1 Stopping Container runner-upstream-test-client-1 Stopped Container runner-upstream-relay-1 Stopping Container runner-upstream-relay-1 Stopped make: *** [Makefile:86: test] Error 1