Project: STRM Privacy
STRM Privacy is een startup die "privacy first" data streams aanbiedt. Als eerste freelance-opdracht bouwde ik een PHP implementatie van hun driver.
Ontwerp-keuzes
Er was niet bekend wat de minimale PHP versie was die ondersteund moest worden. Voor de veiligheid heb ik ervoor gekozen om versie 7.2 nog te ondersteunen. Deze versie is weliswaar al een tijd niet meer ondersteund, maar in de praktijk wordt 7.2 hier en daar toch nog wel gebruikt.
De driver zou net als de andere drivers open source worden. Dus heb ik er uiteraard een composer package van gemaakt, dat gepubliceerd is op Packagist en dus eenvoudig geinstalleerd kan worden dmv composer.
Apache Avro
De driver is in wezen een simpele API client en dus niet heel complex. Maar van Apache Avro had ik eerlijk gezegd nog nooit gehoord. Dit blijkt niets meer dan een serialisatie-systeem te zijn, maar wel een die een stuk efficienter is dan bijvoorbeeld JSON, en bovendien schema-gebaseerd. Alle data moet dus voldoen aan een schema-definitie, die je zelf kan definieren. Dit zorgt er enerzijds voor dat data altijd een bekende structuur en geldige inhoud heeft; en anderzijds dat het binary geserialiseerde formaat erg efficient is en zeer weinig overhead heeft.
Integratie van Avro bleek niet zo moeilijk. De meeste tijd ging in het zoeken van de beste PHP library, want er bleken een aantal verschillende versies en implementaties te zijn. Uiteindelijk bleek die van Wikimedia de meest up to date. Deze was rechtstreeks gebaseerd op de officiele versie van Apache en inclusief composer support. Wel beetje jammer dat de library niet PSR-4 compliant is. Er is wel een PSR-4 compliant port maar die bleek nog niet productie-rijp genoeg.
Tests en CI
Projecten als deze lenen zich goed voor TDD, al miste ik hier wel het "inversion of control" principe dat in bijv Laravel zit. Hiermee is het makkelijker om in je tests met een custom binding bijvoorbeeld een mock http client te injecteren, in plaats van de standaard client. Maar er zijn natuurlijk ook andere manieren om dit te bereiken. Iets minder elegant misschien, maar uiteindelijk gaat het om het resultaat.
Toen de driver zelf af, getest en goedgekeurd was, heb ik nog de Continuous Integration pipelines ingericht door middel van Github actions, om bij elke push de unit tests te draaien, en om bij een nieuwe release de repository van Packagist automatisch te updaten door middel van een webhook.
In de andere repositories van het bedrijf werd daarnaast ook gebruik gemaakt van Husky in combinatie met commitizen, voor afdwingen van consistente commit messages, en automatische semantic versioning en changelog generatie op basis van deze commits. Ik kende deze tools nog niet, maar ze bleken handig en nuttig, dus ik ga ze zeker vaker gebruiken.
Heb jij ook een project waar je mijn hulp bij kan gebruiken?
Ik help je graag! Neem contact met me op, en we bespreken je wensen.