First step of the state-machine refactor. Same self-contained pattern
as the rest of the page — FSMs live inline in web/zebra-spaces.html so
the page-integrity stamp keeps working, and the tests extract them with
the same regex/brace-match technique web-protocol.test.js already uses
(page = source of truth, tests track the page).
Added:
- createFSM(spec): minimal state machine. spec.states[name] has optional
entry/exit hooks and an .on table mapping events → target (string) or
{ target, action }. Observers fire after each transition with
{ state, prev, ev, ctx }. No async in transitions; effects belong in
observers (which can call send() to advance the machine).
- publishSpec: pure transition table for the publish flow.
off ──START──▶ acquiring ──ACQUIRED──▶ negotiating ──NEGOTIATED──▶ live
│ FAILED │ FAILED │ STOP/LOST
▼ ▼ ▼
off stopping ◀──── stopping ──┘
│ DONE
▼
off
One instance per kind (mic / screen / camera). FAILED in negotiating
goes to stopping (not off) so any acquired stream/pc gets torn down.
- test/zebra-fsm.test.js: 23 unit tests covering framework semantics +
publishSpec happy path + error/cancel paths + illegal-transition
no-ops. Function-constructor scope handles const-leak; bare eval()
doesn't expose const declarations to the harness.
- Makefile: test-fsm target + included in test-all.
Next: SubscribeFSM, CallFSM, RemoteTileFSM. Then wire each into the
imperative call sites progressively, replacing the firefighting code.
94 lines
3.2 KiB
Makefile
94 lines
3.2 KiB
Makefile
CC = gcc
|
|
CFLAGS = -Wall -Wextra -O2 -Iinclude $(shell pkg-config --cflags libpulse)
|
|
LDFLAGS = $(shell pkg-config --libs libpulse) -lrt -lpthread
|
|
|
|
PULSE = src/pulse.c
|
|
|
|
.PHONY: all clean serve blog test test-all test-web test-zebra-spaces stamp zebrad
|
|
|
|
# stamp each web page with today's date + its own md5/sha256 (run before deploy)
|
|
stamp:
|
|
@node web/stamp.js web/chat.html web/zebra-audio.html web/zebra-spaces.html web/how-it-works.html web/host-your-own.html
|
|
|
|
all: tx rx chat bt carrier zebrad
|
|
|
|
test: test/unit
|
|
@./test/unit
|
|
|
|
# web modem/protocol tests — pure Node, no browser or second device needed
|
|
test-web:
|
|
@node test/web-protocol.test.js
|
|
|
|
# zebra-spaces state-machine tests — pure unit tests for the FSM framework
|
|
# + each machine spec (publish / subscribe / call / remote-tile). Extracts
|
|
# the live code from web/zebra-spaces.html so the tests track the page.
|
|
test-fsm:
|
|
@node test/zebra-fsm.test.js
|
|
|
|
# zebra-spaces JS↔Go protocol parity + vault + ed25519 + (optionally) a live
|
|
# server flow. The live-server tier auto-runs when proxy.unturf.com sits
|
|
# alongside this checkout AND has a Go toolchain — we build the relay binary
|
|
# transparently and point the test at it. Otherwise that tier is skipped and
|
|
# only the pure-protocol/crypto tiers run.
|
|
test-zebra-spaces:
|
|
@bin=""; \
|
|
if [ -d ../proxy.unturf.com/cmd/zebra-spaces-signal ]; then \
|
|
go=$$(command -v go || echo /home/fox/.local/go/bin/go); \
|
|
if [ -x "$$go" ]; then \
|
|
echo "Building zebra-spaces-signal for live-server test..."; \
|
|
(cd ../proxy.unturf.com && "$$go" build -o /tmp/zspc-signal-test ./cmd/zebra-spaces-signal/) && bin=/tmp/zspc-signal-test; \
|
|
fi; \
|
|
fi; \
|
|
ZEBRA_SPACES_BINARY=$$bin node test/zebra-spaces.test.js; \
|
|
rc=$$?; rm -f /tmp/zspc-signal-test; exit $$rc
|
|
|
|
test-all: test/unit test/integration test/functional test-web test-fsm test-zebra-spaces
|
|
@echo "--- unit ---"
|
|
@./test/unit
|
|
@echo "--- integration ---"
|
|
@./test/integration
|
|
@echo "--- functional ---"
|
|
@./test/functional
|
|
@echo "--- web protocol ---"
|
|
@node test/web-protocol.test.js
|
|
@echo "--- zebra-fsm ---"
|
|
@node test/zebra-fsm.test.js
|
|
@echo "--- zebra-spaces ---"
|
|
@$(MAKE) -s test-zebra-spaces
|
|
|
|
test/unit: test/unit.c include/zebra.h include/modem.h test/test.h
|
|
$(CC) $(CFLAGS) -o $@ test/unit.c
|
|
|
|
test/integration: test/integration.c src/pulse.c include/zebra.h include/modem.h test/test.h
|
|
$(CC) $(CFLAGS) -o $@ test/integration.c src/pulse.c $(LDFLAGS)
|
|
|
|
test/functional: test/functional.c src/pulse.c include/zebra.h include/modem.h test/test.h
|
|
$(CC) $(CFLAGS) -o $@ test/functional.c src/pulse.c $(LDFLAGS)
|
|
|
|
tx: src/tx.c $(PULSE)
|
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
|
|
|
rx: src/rx.c $(PULSE)
|
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
|
|
|
chat: src/chat.c $(PULSE)
|
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
|
|
|
bt: src/bt.c $(PULSE)
|
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
|
|
|
carrier: src/carrier.c
|
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
|
|
|
zebrad: src/zebrad.c include/zebra.h
|
|
$(CC) $(CFLAGS) -o $@ src/zebrad.c $(LDFLAGS) -lm
|
|
|
|
blog:
|
|
python3 blog/build.py
|
|
|
|
serve: blog
|
|
cd web && python3 -m http.server 8765
|
|
|
|
clean:
|
|
rm -f tx rx chat bt carrier zebrad test/unit test/integration test/functional
|
|
rm -rf web/blog/001-volume-modem web/blog/002-sse-chatroom web/blog/index.html
|