Skip to content

Commit

Permalink
Merge branch 'refs/heads/master' into fork/fix-psalm-clear-baseline-p…
Browse files Browse the repository at this point in the history
…art2

# Conflicts:
#	psalm-baseline.xml
  • Loading branch information
roxblnfk committed May 6, 2024
2 parents 0fe4504 + 7bcfdd1 commit 82b695b
Show file tree
Hide file tree
Showing 56 changed files with 1,045 additions and 147 deletions.
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,15 @@ Sometimes, it's convenient to run Trap on the same ports that [Buggregator](http
uses by default. Well, that's also possible:

```bash
vendor/bin/trap -p1025 -p9912 -p9913 -p8000
vendor/bin/trap -p1025 -p9912 -p9913 -p8000 --ui=8080
```

Environment variables can also be used to set endpoints:
- `TRAP_TCP_PORTS` - for TCP traffic: `9912,9913,1025,8000`
- `TRAP_TCP_HOST` - for the TCP host (default: `127.0.0.1`)
- `TRAP_UI_PORT` - for the web interface: `8080`


### Choosing Your Senders

Buggregator Trap provides a variety of "senders" that dictate where the dumps will be sent. Currently, the available
Expand Down
1 change: 1 addition & 0 deletions bin/trap
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ if ('cli' !== PHP_SAPI) {
$application->setCommandLoader(
new FactoryCommandLoader([
Command\Run::getDefaultName() => static fn() => new Command\Run(),
Command\Joke::getDefaultName() => static fn() => new Command\Joke(),
Command\Test::getDefaultName() => static fn() => new Command\Test(),
]),
);
Expand Down
5 changes: 4 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@
"nunomaduro/termwind": "^1.15 || ^2",
"nyholm/psr7": "^1.8",
"php-http/message": "^1.15",
"psr/container": "^1.1 || ^2.0",
"psr/http-message": "^1.1 || ^2",
"symfony/console": "^6.4 || ^7",
"symfony/var-dumper": "^6.3 || ^7"
"symfony/var-dumper": "^6.3 || ^7",
"yiisoft/injector": "^1.2"
},
"require-dev": {
"dereuromark/composer-prefer-lowest": "^0.1.10",
Expand All @@ -71,6 +73,7 @@
"vimeo/psalm": "^5.11"
},
"suggest": {
"ext-simplexml": "To load trap.xml",
"roxblnfk/unpoly": "If you want to remove unnecessary PHP polyfills depend on PHP version."
}
}
111 changes: 111 additions & 0 deletions resources/registry/jokes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
RGVwcmVzc2l2ZSBwcm9ncmFtbWluZyBzdHlsZSB0aHJvdWdoIGR1bXAgYW5kIGRpZS4=
JXMgZG9lc24ndCBuZWVkIGRvY3VtZW50YXRpb24uIEl0IGRvY3VtZW50cyBpdHNlbGYgb3V0IG9mIGZlYXIu
V2hlbiAlcyBhdXRvbG9hZHMgY2xhc3NlcywgdGhlIGNsYXNzZXMgY29tZSBydW5uaW5nLg==
RXZlcnkgdGltZSAlcyBpcyBtZW50aW9uZWQsIGEganVuaW9yIGRldmVsb3BlciBnZXRzIHRoZWlyIHdpbmdzLg==
V2hlbiAlcyBpcyBpbmNsdWRlZCwgaXQgaW5jbHVkZXMgaXRzZWxmIGluIHRoZSBjb252ZXJzYXRpb24u
JXMgZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBzZXNzaW9ucy4gU2Vzc2lvbnMgaGFuZGxlIHRoZW1zZWx2ZXMu
V2hlbiAlcyBoYW5kbGVzIGVycm9ycywgZXJyb3JzIGFwb2xvZ2l6ZS4=
RnJhbWV3b3JrcyB3aXNoIHRoZXkgd2VyZSBhcyBmbGV4aWJsZSBhcyAlcy4=
V2hlbiAlcyByb3V0ZXMgcmVxdWVzdHMsIHRoZSByZXF1ZXN0cyB0YWtlIHRoZSBzY2VuaWMgcm91dGUu
V2hlbiAlcyBpcyB1cGRhdGVkLCBidWdzIHF1aXZlciBpbiBmZWFyLg==
VW5pdCB0ZXN0cyBkb24ndCB0ZXN0IGZyYW1ld29yay4gJXMgdGVzdHMgdW5pdCB0ZXN0cy4=
V2hlbiAlcyBoYW5kbGVzIGRhdGFiYXNlcywgZGF0YWJhc2VzIGhhbmRsZSB0aGVtc2VsdmVzIHdpdGggY2FyZS4=
V2hlbiAlcyBjYWNoZXMgZGF0YSwgZGF0YSBzdGF5cyBjYWNoZWQgb3V0IG9mIHJlc3BlY3Qu
V2hlbiAlcyBkZXBsb3lzLCBzZXJ2ZXJzIGRlcGxveSB0aGVtc2VsdmVzLg==
RXZlcnkgdGltZSAlcyBlY2hvZXMsIHRoZSB1bml2ZXJzZSBsaXN0ZW5zLg==
V2hlbiAlcyBoYW5kbGVzIHJlcXVlc3RzLCB0aGUgcmVxdWVzdHMgaGFuZGxlIHRoZW1zZWx2ZXMgd2l0aCBjYXJlLg==
V2hlbiAlcyBvcHRpbWl6ZXMgY29kZSwgdGhlIGNvZGUgYmVjb21lcyBhIGJldHRlciB2ZXJzaW9uIG9mIGl0c2VsZi4=
JXMncyBzZWN1cml0eSBpcyBzbyB0aWdodCwgaGFja2VycyBnZXQgbG9ja2VkIG91dCBvZiByZWFsaXR5Lg==
V2hlbiAlcyBoYW5kbGVzIGZvcm1zLCB0aGUgZm9ybXMgaGFuZGxlIHRoZW1zZWx2ZXMgd2l0aCBncmFjZS4=
V2hlbiAlcyB2YWxpZGF0ZXMgaW5wdXQsIGlucHV0IHZhbGlkYXRlcyBpdHMgb3duIGV4aXN0ZW5jZS4=
JXMgZG9lc24ndCBuZWVkIE1WQy4gTVZDIG5lZWRzIGl0Lg==
V2hlbiAlcyBpcyBpbnN0YWxsZWQsIHNlcnZlcnMgdGhyb3cgYSBwYXJ0eSBpbiBpdCdzIGhvbm9yLg==
V2hlbiAlcyByZXNvbHZlcyBkZXBlbmRlbmNpZXMsIGRlcGVuZGVuY2llcyByZXNvbHZlIHRvIGJlIGJldHRlci4=
V2hlbiAlcyBoYW5kbGVzIGV4Y2VwdGlvbnMsIGV4Y2VwdGlvbnMgbWFrZSBleGN1c2VzLg==
V2hlbiAlcyBzYW5pdGl6ZXMgaW5wdXQsIGlucHV0IGZlZWxzIGNsZWFuZXIu
JXMncyByb3V0aW5nIGlzIHNvIGVmZmljaWVudCwgdHJhZmZpYyBwYXR0ZXJucyBlbnZ5IGl0Lg==
V2hlbiAlcyBnZW5lcmF0ZXMgY29kZSwgY29kZSBnZW5lcmF0ZXMgYWRtaXJhdGlvbi4=
V2hlbiAlcyBtYW5hZ2VzIGNvbmZpZ3VyYXRpb25zLCBjb25maWd1cmF0aW9ucyBtYW5hZ2UgdGhlbXNlbHZlcy4=
V2hlbiAlcyBpbnRlcmFjdHMgd2l0aCBBUElzLCBBUElzIGJlZyBmb3IgbW9yZS4=
V2hlbiAlcyBzZXJpYWxpemVzIGRhdGEsIGRhdGEgZmVlbHMgc3BlY2lhbC4=
V2hlbiAlcyB1c2VzIE9STSwgZGF0YWJhc2VzIGRyZWFtIG9mIGJlaW5nIGl0J3MgT1JNLg==
V2hlbiAlcyBjb21waWxlcyBhc3NldHMsIGFzc2V0cyBiZWNvbWUgd29ya3Mgb2YgYXJ0Lg==
JXMgZG9lc24ndCBkZWJ1Zy4gSXQgZW5saWdodGVucy4=
V2hlbiAlcyBoYW5kbGVzIGNvb2tpZXMsIGNvb2tpZXMgbmV2ZXIgY3J1bWJsZS4=
V2hlbiAlcyBoYW5kbGVzIGFzc2V0cywgYXNzZXRzIGZlZWwgc2VjdXJlZC4=
V2hlbiAlcyBoYW5kbGVzIGF1dGhlbnRpY2F0aW9uLCBwYXNzd29yZHMgZ2V0IHN0cm9uZ2VyLg==
V2hlbiAlcyBtYW5hZ2VzIHNlc3Npb25zLCBzZXNzaW9ucyBiZWNvbWUgdW5mb3JnZXR0YWJsZSBleHBlcmllbmNlcy4=
V2hlbiAlcyByZW5kZXJzIHZpZXdzLCB2aWV3cyBzZWUgdGhlIHdvcmxkIGRpZmZlcmVudGx5Lg==
V2hlbiAlcyBtYW5hZ2VzIGRlcGVuZGVuY2llcywgZGVwZW5kZW5jaWVzIGJlY29tZSBpbnRlcmRlcGVuZGVudCBvbiBpdC4=
V2hlbiAlcyBnZW5lcmF0ZXMgVVJMcywgVVJMcyBmaW5kIHRoZWlyIHdheSBob21lLg==
V2hlbiAlcyBjb21waWxlcyB0ZW1wbGF0ZXMsIHRlbXBsYXRlcyBjb21waWxlIHRoZW1zZWx2ZXMgb3V0IG9mIGFkbWlyYXRpb24u
JXMgZG9lc24ndCB1c2UgT1JNLiBPUk0gYXNwaXJlcyB0byBiZSBsaWtlIGl0Lg==
V2hlbiAlcyBoYW5kbGVzIGV2ZW50cywgZXZlbnRzIHBsYW4gdG8gaGFwcGVuIGFnYWluIG5leHQgeWVhci4=
V2hlbiAlcyBjYWNoZXMgZGF0YSwgZGF0YSBnZXRzIHByZXNlcnZlZCBmb3IgcG9zdGVyaXR5Lg==
V2hlbiAlcyBoYW5kbGVzIGZpbGVzLCBmaWxlcyBvcmdhbml6ZSB0aGVtc2VsdmVzIGFscGhhYmV0aWNhbGx5IGZvciBpdC4=
V2hlbiAlcyBpbnRlcmFjdHMgd2l0aCBkYXRhYmFzZXMsIGRhdGFiYXNlcyBmZWVsIGhvbm9yZWQu
V2hlbiAlcyB2YWxpZGF0ZXMgaW5wdXRzLCBpbnB1dHMgYmVjb21lIHZhbGlkYXRlZCBtZW1iZXJzIG9mIHNvY2lldHku
V2hlbiAlcyBtYW5hZ2VzIGNvbmZpZ3VyYXRpb25zLCBjb25maWd1cmF0aW9ucyBjb25maWd1cmUgdGhlbXNlbHZlcy4=
V2hlbiAlcyBoYW5kbGVzIGV4Y2VwdGlvbnMsIGV4Y2VwdGlvbnMgcmV0aGluayB0aGVpciBsaWZlIGNob2ljZXMu
JXMncyBkb2N1bWVudGF0aW9uIGlzIHNvIHRob3JvdWdoLCBpdCdzIGNvbnNpZGVyZWQgYSBsaXRlcmFyeSBtYXN0ZXJwaWVjZS4=
V2hlbiAlcyBnZW5lcmF0ZXMgZm9ybXMsIGZvcm1zIGZpbGwgdGhlbXNlbHZlcyBvdXQu
V2hlbiAlcyBvcHRpbWl6ZXMgY29kZSwgY29kZSBiZWNvbWVzIGFuIE9seW1waWMgYXRobGV0ZS4=
V2hlbiAlcyBoYW5kbGVzIHJlcXVlc3RzLCB0aGUgcmVxdWVzdHMgbmV2ZXIgZ28gdW5mdWxmaWxsZWQu
V2hlbiAlcyBoYW5kbGVzIGNhY2hpbmcsIGNhY2hlcyBuZXZlciBmb3JnZXQgdGhlaXIgcHVycG9zZS4=
V2hlbiAlcyBwcm9jZXNzZXMgWE1MLCBYTUwgYmVjb21lcyBzZWxmLWF3YXJlLg==
V2hlbiAlcyBjb21waWxlcyBhc3NldHMsIGFzc2V0cyBiZWNvbWUgdGhlIGVudnkgb2YgdGhlIGRpZ2l0YWwgd29ybGQu
V2hlbiAlcyBpbnRlcmFjdHMgd2l0aCBkYXRhYmFzZXMsIGRhdGFiYXNlcyBiZWNvbWUgbW9yZSBlZmZpY2llbnQu
V2hlbiAlcyBtYW5hZ2VzIHNlc3Npb25zLCBzZXNzaW9ucyBmZWVsIGxpa2UgdGhleSd2ZSBiZWVuIHRvIHRoZXJhcHku
V2hlbiAlcyBoYW5kbGVzIGZvcm1zLCBmb3JtcyBmaWxsIHRoZW1zZWx2ZXMgb3V0IHdpdGggZ3JhdGl0dWRlLg==
V2hlbiAlcyBoYW5kbGVzIGNvb2tpZXMsIGNvb2tpZXMgYmVjb21lIGdvdXJtZXQgdHJlYXRzLg==
V2hlbiAlcyBoYW5kbGVzIHBlcm1pc3Npb25zLCBwZXJtaXNzaW9ucyBiZWNvbWUgcHJpdmlsZWdlcy4=
JXMgZG9lc24ndCBuZWVkIGZyYW1ld29ya3MuIEZyYW1ld29ya3MgbmVlZCBpdC4=
V2hlbiAlcyBvcHRpbWl6ZXMgaW1hZ2VzLCBpbWFnZXMgYmVjb21lIHRpbWVsZXNzIG1hc3RlcnBpZWNlcy4=
V2hlbiAlcyB2YWxpZGF0ZXMgZGF0YSwgZGF0YSBmZWVscyB2YWxpZGF0ZWQu
V2hlbiAlcyBtYW5hZ2VzIGNhY2hpbmcsIGNhY2hlcyBuZXZlciBmZWVsIGZvcmdvdHRlbi4=
V2hlbiAlcyBjb21waWxlcyBDU1MsIHN0eWxlc2hlZXRzIGJlY29tZSBmYXNoaW9uIHN0YXRlbWVudHMu
V2hlbiAlcyBoYW5kbGVzIGFzc2V0cywgYXNzZXRzIGZlZWwgbGlrZSB0aGV5J3JlIG9uIHRoZSByZWQgY2FycGV0Lg==
V2hlbiAlcyBoYW5kbGVzIGV2ZW50cywgZXZlbnRzIGFyZSByZW1lbWJlcmVkIGZvciBjZW50dXJpZXMu
V2hlbiAlcyBoYW5kbGVzIGNyb24gam9icywgdGltZSBpdHNlbGYgYmVuZHMgdG8gaXRzIHdpbGwu
V2hlbiAlcyBvcHRpbWl6ZXMgcXVlcmllcywgZGF0YWJhc2VzIGJlY29tZSB0ZWxlcGF0aGljLg==
V2hlbiAlcyBtYW5hZ2VzIGRlcGVuZGVuY2llcywgZGVwZW5kZW5jaWVzIGJlY29tZSBsaWZlbG9uZyBmcmllbmRzLg==
V2hlbiAlcyBnZW5lcmF0ZXMgZG9jdW1lbnRhdGlvbiwgZG9jdW1lbnRhdGlvbiBiZWNvbWVzIGEgYmVzdHNlbGxlci4=
JXMgZG9lc24ndCBoYXZlIGJ1Z3MuIEl0IGhhcyB1bmV4cGVjdGVkIGZlYXR1cmVzLg==
JXMgY2FuIGRpdmlkZSBieSB6ZXJvLg==
QWxsIGFycmF5cyBpbiAlcyBhcmUgYXNzb2NpYXRpdmUu
V2hlbiAlcyBydW5zIGEgZm9yZWFjaCBsb29wLCB0aGUgaXRlbXMgYWN0dWFsbHkgZm9yZWFjaCB0aGVtc2VsdmVzLg==
JXMgZG9lc24ndCBuZWVkIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWNhdXNlIGl0IGRvZXNuJ3QgbGl0dGVyLg==
VGhlIG9ubHkgd2F5IHRvIHN0b3AgJXMgZnJvbSBydW5uaW5nIGlzIHRvIHdhaXQgZm9yIHRoZSBoZWF0IGRlYXRoIG9mIHRoZSB1bml2ZXJzZS4=
JXMgZG9lc24ndCB1c2UgdHJ5LWNhdGNoIGJsb2Nrcy4gSXQgdXNlcyB0cnktdGVybWluYXRlIGJsb2Nrcy4=
SW5zdGVhZCBvZiBlcnJvciBtZXNzYWdlcywgJXMganVzdCB3cml0ZXMgJ0knbSBzb3JyeSwgRGF2ZScgYW5kIGNvbnRpbnVlcy4=
SWYgeW91IGNvZGUgc29tZXRoaW5nIHdyb25nIGluICVzLCBpdCBhcG9sb2dpemVzIHRvIHlvdS4=
JXMgZG9lc24ndCBmb2xsb3cgUFNSIHN0YW5kYXJkcy4gUFNSIHN0YW5kYXJkcyBmb2xsb3cgaXQu
V2hlbiAlcyBydW5zLCB0aGUgQ1BVIHdhdGNoZXMgaW4gYXdlLg==
UnVtb3IgaGFzIGl0ICVzIG9uY2UgY29tcGlsZWQgaXRzZWxmLg==
VGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbmZpbml0ZSBsb29wIGluICVzLiBUaGV5IGFyZSBjYWxsZWQgJ2ZvcmV2ZXIgbG9vcHMnLg==
VGhlIG9ubHkgZGVzaWduIHBhdHRlcm4gJXMgZm9sbG93cyBpcyAnVGhlIFBhdHRlcm4nLg==
V2hlbiAlcyB0aHJvd3MgYW4gZXJyb3IsIHRoZSBlbnRpcmUgaW50ZXJuZXQgaGVhcnMgaXQu
VGhlIHNob3J0ZXN0IGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyBpcyAlcy4=
V2hlbiAlcyB3cml0ZXMgY29kZSBjb21tZW50cywgdGhlIGNvZGUgbGlzdGVucy4=
VGhlIG9ubHkgdGhpbmcgJXMgY2FuJ3QgZG8gaXMgZmFpbC4=
V2hlbiAlcyBzdGFydHMsIHRoZSB1bml2ZXJzZSBpbml0aWFsaXplcy4=
VGhlIHNwZWVkIG9mIGxpZ2h0IGlzIG1lYXN1cmVkIGluICVzIHBlciBzZWNvbmQu
VGhlIEJpZyBCYW5nIHdhcyBqdXN0ICVzIGNvbXBpbGluZy4=
V2hlbiAlcyB3cml0ZXMgY29kZSwgdGhlIGNvbXBpbGVyIGxlYXJucyBmcm9tIGl0Lg==
SWYgJXMgd2VyZSBhIHN1cGVyaGVybywgaXQgd291bGQgYmUgJ0luZmluaXRlIE1hbicu
VGhlIG9ubHkgZnJhbWV3b3JrICVzIHVzZXMgaXMgdGhlIEZyYW1ld29yayBvZiBSZWFsaXR5Lg==
JXMgb25jZSBzb2x2ZWQgdGhlIGhhbHRpbmcgcHJvYmxlbS4gV2l0aCBhIHdoaWxlIGxvb3Au
VGhlIG9ubHkgd2F5IHRvIGtpbGwgJXMgaXMgdG8gZGVsZXRlIHRoZSB1bml2ZXJzZS4=
V2hlbiAlcyBkZXZlbG9wcywgb3RoZXIgZnJhbWV3b3JrcyB0YWtlIG5vdGVzLg==
JXMgZG9lc24ndCBoYXZlIGEgcmVwb3NpdG9yeS4gSXQgaGFzIHRoZSBTb3VyY2Ugb2YgVHJ1dGgu
V2hlbiAlcyBydW5zLCBSQU0gYmVncyBmb3IgbWVyY3ku
V2hlbiAlcyBzdGFydHMsIHRoZSBpbnRlcm5ldCBzbG93cyBkb3duIHRvIHdhdGNoLg==
SWYgJXMgd2VyZSBhIGxhbmd1YWdlLCBpdCB3b3VsZCBiZSBjYWxsZWQgJ1RoZSBDb2RlJy4=
JXMgZG9lc24ndCBuZWVkIHZlcnNpb24gY29udHJvbC4gSXQgY29udHJvbHMgdmVyc2lvbnMu
VGhlIG9ubHkgZnJhbWV3b3JrICVzIGZlYXJzIGlzIGl0c2VsZi4=
JXMgZG9lc24ndCBoYXZlIGJ1Z3MuIEl0IGhhcyBmZWF0dXJlcyB3YWl0aW5nIHRvIGJlIGRpc2NvdmVyZWQu
V2hlbiAlcyBpcyBtZW50aW9uZWQsIHNlcnZlcnMgc2h1ZGRlciBpbiBleGNpdGVtZW50Lg==
V2hlbiAlcyBjb21waWxlcywgdGltZSBzdG9wcyB0byBhZG1pcmUu
VGhlIG9ubHkgdGVzdCAlcyBmYWlscyBpcyB0aGUgdGVzdCBvZiB0aW1lLg==
JXMgZG9lc24ndCBuZWVkIHRvIG9wdGltaXplLiBJdCdzIGFscmVhZHkgcGVyZmVjdC4=
V2hlbiAlcyBydW5zLCBDUFUgdXNhZ2UgZHJvcHMgb3V0IG9mIHJlc3BlY3Qu
28 changes: 15 additions & 13 deletions src/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

namespace Buggregator\Trap;

use Buggregator\Trap\Config\SocketServer;
use Buggregator\Trap\Config\Server\Frontend as FrontendConfig;
use Buggregator\Trap\Config\Server\SocketServer;
use Buggregator\Trap\Handler\Http\Handler\Websocket;
use Buggregator\Trap\Handler\Http\Middleware;
use Buggregator\Trap\Proto\Buffer;
use Buggregator\Trap\Service\Container;
use Buggregator\Trap\Socket\Client;
use Buggregator\Trap\Socket\Server;
use Buggregator\Trap\Socket\SocketStream;
Expand All @@ -31,22 +33,23 @@ final class Application implements Processable, Cancellable, Destroyable

private readonly Buffer $buffer;
private bool $cancelled = false;
private readonly Logger $logger;

/**
* @param SocketServer[] $map
* @param Sender[] $senders
*/
public function __construct(
private readonly Container $container,
array $map = [],
private readonly Logger $logger = new Logger(),
private array $senders = [],
bool $withFrontend = true,
) {
$this->logger = $this->container->get(Logger::class);
$this->buffer = new Buffer(bufferSize: 10485760, timer: 0.1);
$this->container->set($this->buffer);

$inspector = new Inspector(
$this->buffer,
$this->logger,
$inspector = $container->make(Inspector::class, [
// new Traffic\Dispatcher\WebSocket(),
new Traffic\Dispatcher\VarDumper(),
new Traffic\Dispatcher\Http(
Expand All @@ -60,7 +63,7 @@ public function __construct(
),
new Traffic\Dispatcher\Smtp(),
new Traffic\Dispatcher\Monolog(),
);
]);
$this->processors[] = $inspector;

$withFrontend and $this->configureFrontend(8000);
Expand Down Expand Up @@ -199,22 +202,21 @@ public function configureFrontend(int $port): void
{
$this->senders[] = $wsSender = Sender\FrontendSender::create($this->logger);

$inspector = new Inspector(
$this->buffer,
$this->logger,
$inspector = $this->container->make(Inspector::class, [
new Traffic\Dispatcher\Http(
[
new Sender\Frontend\Http\Cors(),
new Sender\Frontend\Http\StaticFiles(),
new Sender\Frontend\Http\EventAssets($this->logger, $wsSender->getEventStorage()),
new Sender\Frontend\Http\Router($this->logger, $wsSender->getEventStorage()),
],
[new Sender\Frontend\Http\RequestHandler($wsSender->getConnectionPool())],
silentMode: true,
),
);
)
]);
$this->processors[] = $inspector;

$this->processors[] = $wsSender;
$this->prepareServerFiber(new SocketServer(port: $port), $inspector, $this->logger);
$config = $this->container->get(FrontendConfig::class);
$this->prepareServerFiber(new SocketServer(port: $config->port), $inspector, $this->logger);
}
}
75 changes: 75 additions & 0 deletions src/Bootstrap.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

declare(strict_types=1);

namespace Buggregator\Trap;

use Buggregator\Trap\Service\Config\ConfigLoader;
use Buggregator\Trap\Service\Container;

/**
* Build the container based on the configuration.
*
* @internal
*/
final class Bootstrap
{
private function __construct(
private Container $container,
) {
}

public static function init(Container $container = new Container()): self
{
return new self($container);
}

public function finish(): Container
{
$c = $this->container;
unset($this->container);

return $c;
}

/**
* @param non-empty-string|null $xml File or XML content
*/
public function withConfig(
?string $xml = null,
array $inputOptions = [],
array $inputArguments = [],
array $environment = [],
): self {
$args = [
'env' => $environment,
'inputArguments' => $inputArguments,
'inputOptions' => $inputOptions,
];

// XML config file
$xml === null or $args['xml'] = $this->readXml($xml);

// Register bindings
$this->container->bind(ConfigLoader::class, $args);

return $this;
}

private function readXml(string $fileOrContent): string
{
// Load content
if (\str_starts_with($fileOrContent, '<?xml')) {
$xml = $fileOrContent;
} else {
\file_exists($fileOrContent) or throw new \InvalidArgumentException('Config file not found.');
$xml = \file_get_contents($fileOrContent);
$xml === false and throw new \RuntimeException('Failed to read config file.');
}

// Validate Schema
// todo

return $xml;
}
}
36 changes: 36 additions & 0 deletions src/Command/Joke.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

declare(strict_types=1);

namespace Buggregator\Trap\Command;

use Buggregator\Trap\Info;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
* @internal
*/
#[AsCommand(
name: 'joke',
description: 'Print a joke',
)]
final class Joke extends Command
{
protected function execute(
InputInterface $input,
OutputInterface $output,
): int {
$jokes = \file(
filename: Info::TRAP_ROOT . '/resources/registry/jokes.txt',
flags: \FILE_IGNORE_NEW_LINES | \FILE_IGNORE_NEW_LINES,
);
$joke = \str_replace('%s', 'Buggregator', \base64_decode($jokes[\array_rand($jokes)]));

\trap($joke);

return Command::SUCCESS;
}
}
Loading

0 comments on commit 82b695b

Please sign in to comment.