From 7c6284efcbf4d2b0cf7e55b745205a5638228508 Mon Sep 17 00:00:00 2001 From: Konstantin Grachev Date: Mon, 18 Jan 2021 16:09:51 +0300 Subject: [PATCH] Initial commit --- .github/workflows/ci.yaml | 122 ++++++++++++++++++++++++++++++++++ .gitignore | 2 + .php_cs.dist | 19 ++++++ LICENSE | 21 ++++++ README.md | 42 ++++++++++++ composer.json | 52 +++++++++++++++ docker-compose.yml | 14 ++++ logo.png | Bin 0 -> 100568 bytes phpstan.neon | 10 +++ phpunit.xml.dist | 20 ++++++ psalm.xml | 16 +++++ src/Config.php | 19 ++++++ src/Connection.php | 136 ++++++++++++++++++++++++++++++++++++++ src/Envelope.php | 51 ++++++++++++++ src/Message.php | 27 ++++++++ src/Reader.php | 99 +++++++++++++++++++++++++++ src/Subscriber.php | 74 +++++++++++++++++++++ src/Writer.php | 68 +++++++++++++++++++ tests/NsqTest.php | 35 ++++++++++ 19 files changed, 827 insertions(+) create mode 100644 .github/workflows/ci.yaml create mode 100644 .gitignore create mode 100644 .php_cs.dist create mode 100644 LICENSE create mode 100644 README.md create mode 100644 composer.json create mode 100644 docker-compose.yml create mode 100644 logo.png create mode 100644 phpstan.neon create mode 100644 phpunit.xml.dist create mode 100644 psalm.xml create mode 100644 src/Config.php create mode 100644 src/Connection.php create mode 100644 src/Envelope.php create mode 100644 src/Message.php create mode 100644 src/Reader.php create mode 100644 src/Subscriber.php create mode 100644 src/Writer.php create mode 100644 tests/NsqTest.php diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..6d1f7e8 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,122 @@ +name: CI + +on: + - pull_request + - push + +jobs: + tests: + name: Tests + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + php: + - '7.4' + - '8.0' + dependencies: + - lowest + - highest + + services: + nsqd: + image: nsqio/nsq:v1.2.0 + options: --entrypoint /nsqd + ports: + - 4150:4150 + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: pcov + + - name: Setup Problem Matchers for PHPUnit + run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + + - name: Determine Composer cache directory + id: composer-cache + run: echo "::set-output name=directory::$(composer config cache-dir)" + + - name: Cache Composer dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.directory }} + key: ${{ runner.os }}-${{ matrix.php }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-${{ matrix.php }}-${{ matrix.dependencies }}-composer- + + - name: Install highest dependencies + run: composer update --no-progress --no-interaction --prefer-dist + if: ${{ matrix.dependencies == 'highest' }} + + - name: Install lowest dependencies + run: composer update --no-progress --no-interaction --prefer-dist --prefer-lowest + if: ${{ matrix.dependencies == 'lowest' }} + + - name: Run tests + run: vendor/bin/phpunit --coverage-clover=build/coverage-report.xml + + - name: Upload code coverage + uses: codecov/codecov-action@v1 + with: + file: build/coverage-report.xml + + php-cs-fixer: + name: PHP-CS-Fixer + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + + - name: Install dependencies + run: composer update --no-progress --no-interaction --prefer-dist + + - name: Run script + run: composer phpcs + + phpstan: + name: PHPStan + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + + - name: Install dependencies + run: composer update --no-progress --no-interaction --prefer-dist + + - name: Run script + run: composer phpstan + + psalm: + name: Psalm + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + + - name: Install dependencies + run: composer update --no-progress --no-interaction --prefer-dist + + - name: Run script + run: composer psalm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fbb073 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +/composer.lock diff --git a/.php_cs.dist b/.php_cs.dist new file mode 100644 index 0000000..53d9a56 --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,19 @@ +#!/usr/bin/env php +setRiskyAllowed(true) + ->setRules([ + '@PhpCsFixer' => true, + '@PhpCsFixer:risky' => true, + '@PSR12' => true, + '@PSR12:risky' => true, + 'declare_strict_types' => true, + 'php_unit_internal_class' => false, + 'php_unit_test_class_requires_covers' => false, + 'yoda_style' => true, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__) + ); diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a55468 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 nsqphp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3d9efcb --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# Nsq PHP + + + +A NSQ Client library for PHP. + +[![Latest Stable Version](https://poser.pugx.org/nsq/nsq/v)](//packagist.org/packages/nsq/nsq) [![Total Downloads](https://poser.pugx.org/nsq/nsq/downloads)](//packagist.org/packages/nsq/nsq) [![Latest Unstable Version](https://poser.pugx.org/nsq/nsq/v/unstable)](//packagist.org/packages/nsq/nsq) [![License](https://poser.pugx.org/nsq/nsq/license)](//packagist.org/packages/nsq/nsq) +[![codecov](https://codecov.io/gh/nsqphp/nsqphp/branch/main/graph/badge.svg?token=AYUMC3OO2B)](https://codecov.io/gh/nsqphp/nsqphp) + +Installation +------------ + +This library is installable via [Composer](https://getcomposer.org/): + +```bash +composer require nsq/nsq +``` + +Requirements +------------ + +This library requires PHP 7.4 or later. + +Although not required, it is recommended that you install the [phpinnacle/ext-buffer](https://github.com/phpinnacle/ext-buffer) to speed up [phpinnacle/buffer](https://github.com/phpinnacle/buffer) . + +Features +-------- + +- [x] SUB +- [x] PUB +- [ ] Feature Negotiation +- [ ] Discovery +- [ ] Backoff +- [ ] TLS +- [ ] Snappy +- [ ] Sampling +- [ ] AUTH + +License: +-------- + +The MIT License (MIT). Please see [`LICENSE`](./LICENSE) for more information. Maintained by [Spiral Scout](https://spiralscout.com). diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..e84810f --- /dev/null +++ b/composer.json @@ -0,0 +1,52 @@ +{ + "name": "nsq/nsq", + "type": "library", + "description": "NSQ Client for PHP", + "homepage": "https://github.com/nsqphp/nsqphp", + "license": "MIT", + "authors": [ + { + "name": "Konstantin Grachev", + "email": "me@grachevko.ru" + } + ], + "require": { + "php": ">=7.4", + "ext-json": "*", + "clue/socket-raw": "^1.5", + "phpinnacle/buffer": "^1.2" + }, + "require-dev": { + "ergebnis/composer-normalize": "9999999-dev", + "friendsofphp/php-cs-fixer": "^2.18", + "phpstan/phpstan": "^0.12.68", + "phpstan/phpstan-phpunit": "^0.12.17", + "phpstan/phpstan-strict-rules": "^0.12.9", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.4" + }, + "config": { + "sort-packages": true + }, + "autoload": { + "psr-4": { + "Nsq\\": "src/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": { + "phpcs": [ + "vendor/bin/php-cs-fixer fix --verbose --diff --dry-run" + ], + "phpstan": [ + "vendor/bin/phpstan analyse" + ], + "psalm": [ + "vendor/bin/psalm" + ], + "tests": [ + "vendor/bin/phpunit --verbose" + ] + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8bacd1c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.7' + +services: + nsqd: + image: nsqio/nsq:v1.2.0 + command: /nsqd + ports: + - 4150:4150 + + nsqadmin: + image: nsqio/nsq:v1.2.0 + command: /nsqadmin --nsqd-http-address=nsqd:4151 --http-address=0.0.0.0:4171 + ports: + - 4171:4171 diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..59e00208436b5b14ccdee4ce235f6b550f7657ce GIT binary patch literal 100568 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 puSDo5lxdKl8>{_pdw-&H$#DK}r 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

NGL|hm{wei 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≥6xV><&)p~!GV z@cqVCMSn5nH}P|-g4Jsp5)>6O4s9*3^JVfv^%+aP??~eMLCb4Do`|>z6MN-k0;TEd z=d373?0Kv3a^$45yyY!*qXOK6G#eZ{#nOr&>W03~&&Bp4}ls}f~;L>XE# z`TXXVLz1;8=ul8H_fp7;B~g)8mt>e*&0DT4D72*5Uag%vWRbg3mw33?Xlv>@{9UGWjYUsfpLre?F-N@*tkJx!{b5QOQiT#Tf#fk@ zW;`wf&$2DPCi0~h0CiHFBQ89fho6|}|6l}<{n2Z(0;VNvt5Wwgh4T20N5(11gF$e%KBLhGhC&{3I$!5Y0*dp$$ z!Khc9^iuuom458N-KS(&kEAk_0_cr^0X zDiN8>+nVPzP+g%UM2G4M(}ygB+#Qz2n#N3rb8RHv|9txkdCgGRNyT8>2#yrjCLe_wWO|`)lob=t?l%fbWiN>bFkuB92eQB)??j zAFu#w06_U_&y1i0yi;~3IdJ+zz)K!9>|nz7>FOeIYwBYL&a#E^j<;7C0do`(z%MeaLL{HHMiTHsy0DU*Ng8S%<{?OK zBG;*uJRPy`X?DMZw#PUd(NL=<9g{)LsriefM1Nlf*YFpWD5!pVrKJc-6}o0Ju7~mN zz#?U%I^phP^k^9<4+#hXD=cF;7rZDX0l*VMhBD;O8bWkX0t2MPk|@C%y-p$83+c!z z;^3L||24|1A7uclJMiD2vDgB!m1H1DO_R*g z#<=MyujNWbbQN&A9sON?eo7xO9nI4~(G~Tl?l7oVT4-Iz z6qK&3PcIhC{b1~I*kEI+_DVow-8X3q6Mh~3HF<|WN1pPdVu41^YtoS{qa@#tcMV?Lj6r6_ zyp-P5Rkj$P79)uDMyT6g>y+93%p-rhvhkZ#W}Nk>p|M*gR!w^gkIt#p+bY5OG_Pe) zG6LoB3+GOLpN(*pwX4w2{}~MpASeNf$bBVN1P}Qe^3_F=xV1FG-j5JsYf^s9re)cMNp@uOz_5K>=i5+KL^Y2Ej=qGslmQhI(v7}-PY2^9t- z>kAM|_$#s333-hd{1f0JH;vl^gk9p^Bahi~C<2EAaEb);w=9`$;P7-D_&+df>c2uA*e8w8xq_V?a|(g&vuD7v$X|jP ze`(3RpNTQ}+Fgi!z>jy+KytG_qgGc-D*T;)1P$0~=M!>c)&H9TJvIo|Xa?`9`BoGH z|HTWXBg`OM35v4mA z8RK9-9EM$G1(8HmVW5%D#^x#eskb9gusu3R!4$oluC^rG|C}9*q$T5}!rc1_{$@}E zg+>YIhyODZN9di+Kem9e&2#g}4EsX2eG2Q@okwVf(*|RM76=q#rJrzeD6~k1wM_LM z`*a>CwBC!D*uiXKN(r%z@N(hT5p+ga-;_u!E<{0_%+tI+ITc<=x)gor=n0Xv=kDz; z&SVuZB}BLa{Pbewj#%2m7H9H<(8MXJ$QlF_GPU_tYqSbAz>zK2eSOJ{kEF|^BTGG7 zi+|Zwe{b6ZZ^ucaQ2Qe;{N=jDVtY;CA@&L@+d{u!^?)ojbnb$p?9}~IlTlFv>wlvU z;?I6j05o`Bo#Zv`S|u_Xz;O8(44@=%0R+sJeT~+nvdp&UwE%VZ^A}3~uR>mU0?tZ5 zkEb*7hfSqI0|C9$%zs}($959+@;X2e!d}(p>q9YtkfLxZ_;@My-Bx>gc<(XhP{m*H#1g8W_R3Ea1pQD!8))Xg&MJzt zp(^`ZVzF<&bhoUQ9N~tVOJFa6JZUPB- z&z;V*Q_A4bSi7wr)$(cvb<=E{_3HG5#_V-J*qBl#4Zi~bqlTkwN^KM`l?nI{E=fRCy*KM^+lc5O- zZ$>>{uZ+`JRqDvd^B;4_?&M={4p~|``+9Yz4{A4N0fdUs*;Y1l-iKK*>>EQnL~4tu`89uKR9F>%x*c9tPvyU z6As#^XS%k|1mALwemi^~|KvZ-3naS=Ts8q@3C}`qeLIF|Lkpx9f)L1dKz|<8{^&mc z^uIbfL;jRRUKTJLKVa&6PTYAv13^PQpV#C=9$(wrr9STC79yY{|MDtF4jIL}>;2zA zsrd>I=;(LuqwbS_w!pm3T)GNI7JRSbq! z5T>eRe{vngbaJSLYY8wB(U-Sx3+|=@3@W_P2J8YaojVtzGhuQkR z`9R|&q|OjW^iHAGHR?Fewf+4Lp>!6l)4vUFLe2I4@sD|1NJ#Q8wtTA`uR8&W>q3$F z-Yedt#}=fihIUrrdG%^BRE!0(tDNoSyAvFYWY4gvC53E;Dxagd8ny(hAMStfR}1jt zk3l@8&_SWIOM>n0eO=;p@@jFCk{6br&t@mHbHBWie+BF3TMj1#%9`4-JiQcfhsAx9 zb&+i2+eSN>=cKdD8#vauI5|Wnj)Va`eyES>L0755qyIiO5n6TX zoA%d>|I<@e-rIce@4vEw25*Z;mzBP!E>Ea^wNszR9>kfS4m~eVR(#)=UORd`*myzg zNVi!n>2$`Irk%!mXX5v8|F^3?gSQgsC%HG`uY2F?8&F##)C1-JSW6uEb=UeSAQxVW zaQuG%sYlhtB}}boFT|cf{?yLv%skS?_1i+<$KLVv2ESt}6=YOs+)Pz+pVp7Ve+~~H zvk0W8LJjEk@r_#ch{6?p-~=$Zi5Q%qHHhnII)(v+vRqj&V_jKu64bdvEX6xmjko4c z9U#z=STU`tGZ)txm2FI?E7Ad-H@Y%yqfk>MH0zQc8|QF) zNo>e49)<~h%=G&=C_)tJX@5o;;B^oxnpjmRg=R4rtWA24w7w?~t`*rjB%n9AFj)M- zTfNQN#=-1{X&}6J!N+ri5O*Rn_Kk?^ebH>NW@#FD%X2eZkDCR%`NQovq-K!?Jf+NE z3@Y z;G+9IEV#?~W(;`CH5pr+pJ+GW3kA#C378&Z~K0Xd;Tv-{y&GDkx?Bt+Z{ zQsdq(oC?@jAk0W~4DfYdVwlCm=P=hSC;oOY=YFyo&lhs<2nd|jZjp3VHad?+?ngU8 z@xU00VS6Td4O^eFta_GWkaNGI|9V{FgOtg>8q@Q*U2ZzQF6+nQbG<|q!;U6VJMh3~2>{QiZ{6(< zY7a-_vRFO}3IaZ-^O^e;@t4FjmnleaJf$nbN0(!PGY(%j-A60I)2-x$IIf>lHb#Ej zJuKA6!{ffTRU0Em|DkFK3jR;!tN1frnQ|jP^=!&)5OGn9mpQ^A8eyOx(co%Hh-Z{U z8WdS)>w7VC-e+ZR)2`*QmuRjTk%?z7pK0?jhj#WjQ(qQ`tKEBDYE?*<#mONX5V$cx zduuo~*2$_V75c|C9BMSAQw1*_=D(D2dgw%vQAR%-<(7fDqlGw(DE)2c0G`annH8N~ zF1{!@JfTrianqFj1|}0NoZ=6Z7&1QXpOxeD-MtIcoKIG6p0~C?fd?cmb|o>`O+v-Qhl0Y`|P^2Yab80ql^~ zVM>#n55-^0&r?U;Js%qeeB8blCtM9LEVapDJgAESB#_{IkU9h}d;9TNb5f6!%Jx;+ z*jPqyu$We;0F!AorGsMBm={vbG2QF!$YLpZiAJlhcW%17$V5*ti{ZD`U1;-|jG%`e_Ey2n5aouDUlRAbfof-!J(qZLJ_|3 zCLF||`x_bZ4{VURir$+Q40sk!`|EFi=-}}-euiP2RtYs5HMWy$q|6!J{lMe5$5c4{ z-$L-i8Wx39sNQKa%>qy6{%?z1c^CX2IajGVNBW48=Uyt@#@mVkfi!xnk{5hh*X=;Z zc{~)o`tmj;o~JyJih=s^=lQ2XsSUR4pORSOc10mt*cS%1;ONzZ*dx5)<ve+2z!oVh_@8sj@J9{OkQ&7(UNj)LSSU^Jwd~K(qn+AjWC1>U-!(k7}6` zklZ&5;jLKa=(`^^?5sUJQ!s@kVzg=6;+oy6B?rxvsb*KEYP7WFF9cdU;5+PmgPhJNk5`+02GWsh3hCGD@e6<}T)wvZ90GE&fI#(vwUzbcwHZ_DMr7b9A z`$`=6*#Lc!}~bvz$&)d zu*Of&;*s=e&uGI=VM+KfAbreP0;HT79$;vjYJmt6vl?v*(@sq8b~OL~y6a&;#P|06 zr*XC(R}*?*R&NJ@I!v{$BLn;F$+{93Oq?ob*Jp>z5OHXTMry5KGCxHl5+dPF2C?2`hs|My08tnra^lr< z39(C1(zMSv4*ORLL0?Tz*UntnAC@O)oK#mA2)CB@00s`VK5FiMI zoRYl5?+4V$ntJw11)vnw?FR8@3YDY`E{x|)*W$>!6pX1(7SFRq zWSrweiHE8nsf(dabL*5`F)*CLYXa|4J2D_34U#l}HoNSzOxhhmq_m9(6}nFC6o&hq z(5BD6YK6m8TR087m}?s^F8AYdVqMYa!+Sv^&tLnYRX^D0l3-}&FX~$$LX_v9KmWs8 z9nRn&^FUYPdP0rq^~>Kp-3btPy!G#Q-x*xXSS73=a}(BWAM!cv)Mj%Jv(RJk)te{6 zu&Tri6SLjGVDP{KrON>qX=5BH5&)bjZfBl2vP_$zk_)4Nxj4XCg#?Tv@8HmtW!a1s zdY*FOYGVSdBjy2?rM?n9#Y&Hphf&#KNeaRQekB@!z1fUI?DZt$I7}UnA||( zforI3NSZqr4!?Cs8TwW)&O<-(?=E0%D?e({6}6QoeZg3{NPpA$A^BNTR(K9TG`HT0{y|$=$$T-fs`TO2iLMJPcIk2CmpLnvsuBt zD+~QAc57J%>(R|ylDW~dCr##>fR+7 zJ|Nk(*4JVxP@oo6tgt#=zueG6{FiS`PAwJzrR&Q!l=+j&ijrjEjcp(At=btBW7^HyK&V2=(~JIw)6PSI*J{uns&yD@;|<;AFt`!-o(( zx5Om)hU~m?90<2lr#Vu2$xVG*U`IfC3E-I}JZS{;kQl$QFw=cj?hvQbr?V4c+cuo* z$AI>b8TQh`_#cOx_3uWp4^a>W0f8pTcS1$lZ(0tmW{nH8(m{MlnSwzr%oi$d;@keb z3&)&foyr(nZqT}`KiiI^gn|b3HN^FfOY9@_3&H1d?PvCjiT~q>*V#Go&6)AXUyB83zsqkI z25&htSEZeM_#im*edfOm%p!O$2A2}>zv_A6ay^Khn@`E!5f zs1O$Q)|p0UFNMckj(@l01J} zDebk&ohkw2R)}TA(yQVgBWt~=+~@p|`Sjd)sJcjXkaw)$8=X#AQJX+9 zD}xHeP?KuWRvV7J!zmeYB5YEf0jz%+U7L!G^6%#2ReS0S`ycS6oqu3%x!9Dv9_%2u z^(A_aYujp=?~~UtUpWSKqQb-bzdCFoY>8Sh8(d*}DOWa_Xq0}J*H+Y=-U35dBmON~ zAP58cq2kD;Z{?BpN1FO*btOA~ujv7K^;Z&7;gXCT1U&!UXmIv?l*S_|3O*FCbzif| zj~taTv#VnFQ6K&({@Q4yygvt_T7RxjiimSQPl$aA;6MxO z@0V8vv%Wx2MrYqf1bDt)w-}EnsEN4U2vgp1Ky2UKSI{?`#2=@$&qGhX7(_1v%nShv zfPk%b!61kCUF@Co%V!#&qe^e)r%VU^yzQaE`Z(}BNPxUhC27i?d=}F7B-gfQ!PlNi zX&5u#BbZ(8$%B&6zDvq1vLC;|zI=8v=rolK*8DnxO`zJ)1$ zw<{+PC8}a}$+(8xGKx0~OH%D;!Dvb?=wN0&e){zJ1pHa!B3UDn=FETJ` zD4$+e?UaEF)F~=arIJ_?QQg93{L!*KonV_78EH7SF|n>ylvwqt6BZlj`CpVglF?%D zp$!^1Z4UZRy8*ZX{yw`ukywN4<)81+4lHSPwtg&_Q)!ve%jSzBAn)F)B=&bgbuHs` zLGic|w-CbK1Gw3vR(eII@rVHSLAS`+w^0pzR& zO;32_G%@IH_M+FXf2%MPi?ZkGp*ha_xLe<6_dF|o#&!kH4A*{4 z9|3PJ?r4AVXNLR@HF%}Y+y1d7+2aNG`Qm@0gaPJKnlhu%clDW$e1YrZw@a*-w|!`Z z>VtMD#15>6QkrD0aJp)~!JqN>xI2;jG=9sh6%+^QNK0Ots*=O-tVRRKu1_GGF>zsZ z9qu8LYo)lD+KA z_LbHyTWH6M8=$ZW^udRNkUba((z`{`8Gb-7`xdR>O2AkpN{8kh&j}&a7)M3{S*TV- zWX~T)MX<3O4c+wVt8dM9x4uVADDOLCt9{e`M)0?$WnQKzO>Np`)x>Ls>Mj&K-*UZC z);JU;?+Q@(eTZpDz*ZOhx~34o3A0q*{PEz_CY^})MD_E^SP}aU_Sl(vJH}g@z>|tZ zEXrzGN{8NV^?Xs8f{co{^#vx!;IwzM#kkKU@oO6$c0s&`ZzjBd3ECckTghV)rIma> zM(8PubiJ*OQC{~e4j(VPja<;!_MzcnZjaDEv{1TqoEW@cNT@c5Cv?PM zRY%9ZU7)9<6eX7*Dlgl5-rLvx@v!u5#`o-Ij=ogC?=w`n>z56DQHVb=w#-o3>PIj{LmgU zE1k%~bGZRI!WOY(`^N)HS}h-SqKGB{zy*P7?Q+;275pnzhn4s8a=jiwk_Qmb-TK?} zH*qJyO~V-|_jk(KYTt-j|hq6r*2v-{P`o__1?NlJ-8Z6o=nO-x#AZC`Uwc_EEwNQ!8rf#$I z77{_U@rzB3#C40c-+VNge8{C2?v^A?PwRR3!zZl1@#_jAMe7J9NWh{HRz*c(zFa0@ z;M3=E{+orDVy=(z^}R>8nr$w>{K5?`-7Vv+7mQG2>v~36R*m(JR>xDRU~{_9$Jegl zXMbRvOr+Pq*NxyyzkUN1@!J2rPh=lw2a{Jtzt7$~_@0Ls{we0pFZ7iokDnDa1$Y2B zaDfMirc>{+qt*1h?&rZC{#E~f*)u{{?{&&pi?ei60>GG}pAGX=HZZ6$m6^xD04KPr zI?7xywwviCy>`RRC_o^II18>^bl=d0GtU~7nu3sxjbpt-PgsqyRf!NTl@`C==JEKl z47e$o>R?P}4YvQ9v+PJnXCfT5+&ij&CZWAcq9O`qm~uIimT69JJhhfAH>aLuEBNH# zZ(7b)nEVVioeyK~9^QXke(bES!S#C;Z&|%bxE+sENQ4qqF@0?JBV1gA^`34&#G+@= z>-@BFPN+BMix=jq3#Io0$Tb&|H%U|@6Wve1(KPu5i?$=hYyJgK?RNIGi<_~Mqt};( ze26m`s~X;Cpt1^QE-oyOYd17(1yUp{q_@koz$4|kuMH|az_JCz|5AZ_j$KmeQsfjs zs#4cLNDd^Qh5=&=FyYE&Web(Tue4-5rh!J01Nga~A2>1SX`N1n&C7Up*>hb_hH(vh=%&Np`i*+<%yeALveZbpxMyBmPr7 zH+B!Yo9Bx@$)T%*B|an{oey%~2ZJ@j9v-}DeV>1%6D|CA7*j##8Dt<31&%yA9(?xY zf%24>y8Ao#wHDYMfs~?9sxOT>w$+BWiTmf$(c6sRYu9I^|EI0fRjg|8ja6A6Q0Ab*ekYUACF1JyrbZPi@a7o6Hs-90Y>O*1 zFn(ub$Zgs*IT!T#H=dH-1jzlTwqCyweCX52_>grg8e>C{+i_PQmVK$grUD68!j3#z z4&1VJ9}PnDe3$Mv9PsE94)!2^8aOc+rwrE{mcR|wVCfEImXLRnaB2A*O~L~^t`G_- z!yMJ6E!QpIeXPT=b4XI5k^&11s{6Le$Y>w`%LsKGA-O8C#@2S!y;WQV4w34-eD#|3 zct%DmU=E%gH}~5CpU#9E72q@PArnBaivX3CLEhGo7{NL_Fuij5uB}@IU#oB#$ zDYIf{v_%U^QRH_=JUgcs)DZcejHd)%w*B9pm|JsKzno6k=JUGPHh8*9=k=>rdmd9K zat)q){GR5`_^wxKXRa>G;RG-tuDPMq9!c|ZH3p_Memitse{6l*_H=!N21TlcLf(vd zQKxd+A_*b~OPC}sKne~%B^^z33=&%YQ)meso_Q-ke7HY@7-yIa0BD*A@qd>Wc2UNS zp^9VRQPRK7)|w-@$6Q$?To5(>5xkj39CD(h5^I4dycSsWHROKfviR| z-Z@R4tBp&!FSZKm;8;G8um^EnN55KBzB5Kq?NhBPbDHd(MjLWH15IL9)h^(6H3tyN z?@Y#pSzoA>76Ff4Z0hx*fPZnNaCm#A{lSBhuJwn!REjHx@n_f%e7HpV^F9sPI7LsT zcUoEqoNtG1J&@X&&*u^q{z@xG>OJVOGSU{lj8@g0Q~#m{xHNebU}TSz3Ysk^xf$DR zy@SSo6^gD+Ri|w>s^-RUspnGdV=$%UM)AOeO>xj2#LD9eVFV7R%6x9*faR_mxf(3_O*Ja9M#^S056Ypm$ z&(rA=y6C&M?2$pwdwcu!+QW;lH`?|ic!-GyU>2qVVze|rtoXNfD#+Fnpm(~|A>gNY zF_<$_SFeID9Rya50!iRyrot9Z9|-S9r#^n!osOXTlI0O*{IJCiqjv1Ph+lqUX&KAN zbf|4kJ-E{*&B7ql@Y~i^UA#yyoIRN$7Flsbt}v`|*^8ERh$%Vfz-IN>#X_P_Z%RS= zv(WnE2{7OGMz-G)9#l+C2W3dJ`vWqAJCb?@F=m5% z&RA!|siv{PVvAkW0I(;(2%xE?3&H{FRw4ZH_bZ4=VCIX5M;bQa8#p4ft&4HhOwLuj z1?{v?y*ojX!cLp^0LPnv%C>9xMNgS&oV2u%8e3!OdJ4iG+^5zqxwI$qN(M}DqJ=l( zsCPK3w%DJ@F}fFq;VK)kmlKXDtJ3<451sBZ(rVJBBoUDzS=St`$p|W5@h7t)pE8Xc z4O;WB1wy1*^x;Du7BXoOoq6b%{Q;%Tlq*2=rGz>)hrj*rC(E&!`44fs|qQQSml4nD7aw6ID_dN~uf z?WDT6jyn#a3?P9Uy_heZjU>uBfDfSaQULTh@j-*v&sDYW5RMcjq9v&OA$XFo7QhWu zx!aMk5>B*X9wR-12;ugV!=tCq;P?h+VXHjnedhzG#fz8mJX zICsh&kHH=BN0CSaXLRQ4+|wl_*;AhWldJXF#t3-%4K0N4^a|66=gY|j2NYTT!d1EV zn2Xaeg&4#iH`ApeCL`t*&?kBeDL1NqU@Rrn6rNavcrG(i+nw<_BhFsqn0 z!(<-HU+^UZC@EX>=l!$h$yCysv`q*Je!e_VBgtni9H6MC%(0hT%+3rO^t3n3|8~C~ zm+37?uQ~M*hqy?G7dy>dS=wreGT^<-N$8F)+=(FA$;z*`)jdm73y-%UGK7z`C9-ZG zREE%FuKf2I!h~Nk8e(H@yVIkE4SqPZYu9ZllB9lEOiN3tda}IJ)BU^WsSdNf;LXDb zbuHgl%Bh~ukOajajN|wE-)FsdUVn0HN?UoIXuwhS{scqkiA71J-`&;Ha^%HEOZ(4u zouNOq*!Ntu46n^$0yzRjzzYFD2uhL^Lz$&CQqlx|{9*vR7CIRGjvQXK5o*Rhtus=y z#gI?i>W{mz04W_=_u9Lb^r4JKxzcS~04u8WvYZAdXOecMdU52e<-=A2tE$*G_DF`_ z0lo#F@MmjvSg^SBe4Iq?qPmlI;c!SliC&ZkIs9+8Z`(R%k)gOKEjFc|b!=LR+ z23p~(6h-j8S87^Ce`64R)JH2)j?<~Xth$svu>751MUWp z7TsMa@&+n`%|c|cV-!b7r4~<=FT;%&&feX0est$`lCOWSkFw%Nl@97>oW$~^g~0; z(wIi**-6s$iblb=lF+fS83s_+!RC_2_?$C;+o0$j-9)XOz!X!*YYZ6kto1N{L|}j@ zw^Ex2$LuL|TGx^#6^k+QU5BmvGweKTv5p5Hu`1;CN&IZj2aOU4;lkZ!t(_ldZ4+Ul z;^8_YG(z^<%uame9gvi!ipL?iV__f&7C0MK26B)%jeW3Xry|bFNjqU>E^_hcdZk7c z4+2e~tLJ3a=;f<8R2U(%5Y-PtIdE)V3{g^rqi_BYb8RtDf86zU$;d9n0`RAlh?st{ zLx@zemnShh!wn_rz$qd~gnpd!fWPIh%g)1*0t<&i(rY^d2}a`_Dy-S@vw3pWqbe3! z;#F*`6B>p6aACLUS1fh08n9j%HGM!8E-IE`2NFGSfD}jz34L%hXKcNQ1elt zHxUsA#Og#3H|}^W2% zsl%Vi%?YjO2)EAL{0c1T=PfC6p$#e| zwMSOmq&JCRVF12xS3M(3%b(`%a|0URs1ntl(1;>;WdR%qcf2cdhS^P{CSPBVTkKLv z6ugrln@zIY3i8U=%Uqk<)f`BnDH)7QlLF$wqy*HC6jQ2?1Y1}VnX=&j&jk=6Gn9bq z0IMUjq6&N`jSM0|gCHSK({)^tD~wFYG)K0alKR{+tX=IR`o`Zla=yX8xuBuurlx*~ z8~(Ns598r~iK{gt=b`AK$k$jg83WTpzR=@2v+V*tF-T?k)p-OUP>}{KLSc;skOlav z(g?C3s%vJPAe(>7>7YO`5$n_0=eIox4P?&WzKGVJ3uI(VYVdmDX{yZpL@W(OV)F6v z^fD#<;fxDRA{#XqXI&#avE>9-yU;b~NI<;tJ_|s{07$?vV5L@vi$Mn3@zo}!*(q`2 z3JY3@8oe63@;I&%kQb_fB$~;{iuF~Z;+tc)R zpU2PPwfo-MXjAK}i0r{E%-NwJZnWpxZT8QN$%Dgly8Cg6nb0+s&&|K*0lnvW-JvPw zfZFe-b!hAj86tacEck4G6!mcZ>vczf-_L;fGuXg$U>~0NS+)mpWSS76M)7Oi+-JM( znwSd_N+6JpBqLB=ROyA&bm7d4&(qHRqu&E+M(|~DnCr8r_EO+!>B#WtRNsbkx`VEi z$h|;kTA_NA24v3l1 zz(30USiNHHI>t&U&>OiUwLSmB# zKK{m%n)BwkqsF^#92=V$zhVs22xCK3nlIFfY946{={JIrn;?>WYfsA;LCF93$zS>fbrezl$fG=Bb7{=V_b6eR-fD#nq_obpqwlX z{c52k#b^FD>~lfoppQF}QtM$>&-0fC_?I~&@b78I(Uq8(na{M(@1f~`6uu|C8l0c! z_0+Ao&wKj=M|oZifB(FK#fGQTDso9fkoez@x4=X&D*+#}$gVY7tX{qS$HD|T{1R*}%!XV(OT{a=H&{vzo5 zKYWuM|5_9!4mJ2%96@?$_C7oTg~zWpt#zQK^7Ldrun7tg?^YE(ak`l)Oq@p+RPK7958yX{S1KAil>jyKPR>8BTeSZ0_h%UZ;C{R$12Lwe-fl;!fgB z5&mR}B%q_TB~b5ihZP$d?dXnn1^d;I$T%oCr(LI7CSXS`DbxGn(8Vk}&TWm^IR8K> z{0SPT;%<9AL)MHjb-DOftEQm}0gKc$NTemA><82a`|iNMAO|PbO=^HRf{3fo@I*$F zhN(wMUR926usZd;rd^WZr6|$;qCjk0bC3SfPr`%CUjawHj@3r~;9X0ItSboa*pN@g z`GiN?(leh19t!|`P4)ECUk*u>g_+T6+{>MCARLtQR7WWs`ekeJ-AQ~gLbJMczm=uIWygF2cZYy{_h3B zHT<8MrGi}#bI83$yFYS$k0dp|p34=9|E=wLE9&RlE@!Mcw3s&DUB7cN^?Li?7l7A( zY}WeX`Q1?iYYd(z3vLA-W+it$x}D2zLa}>(0<-=fP2U(D=i{`!v8~2w(m0K6+cp~8 zwyg$DW7{^G#^%Oova#*F`};rVJ!j9^Z+qWoc4n^OHP=1(s&ILr*ZE`VP;z_zE!UhG zbzb6mH%F%Rj@}mDwSZ#RZHmJ+`Vk*i2N?v=xKcC#27(4!IVgXuW`qr3QpyBnqS%)& zQzZ&IHmihyFKkCqvBigHH%`_*jD4h}UJHxso2DLE;A^N_-mbtz%_wYzom_i1$9Nb)@f1ZhmGi!<5qe>k23{ zHI*NGT~hjULD77r2oNrIPqyqxR~6p4FrGK0s$mt6t9)O>Ve4V)p20w`q3(*~O={S5@tYwntW0G=D-Njm*}NRn{yNZbX<-g_e-*Xj2U>G3K&0ioZpr1Q1jiA<4Kmf1z5AEXp1v1nf(v$I z7y5m;z+R-jD=t*SPz1o$uYl)4WwXRT6H4cNy;oWR=L=U2N~Au1yJ!I*(*BEsl*r!R z#ZghnVYWWc38qD4GP_hSUaZ_$X~}YbdrFP0AH+ z-vd{7g)nFgz$iJ8nXn`jY1_Nx3z|p8s0#p{%nZqFBb3H4f<`Bp`@hfTVI7)^EzZve z0;(K$tH%Tr&wDesw+*OGxWFTU8n#Q`5?;9)dFe^?0^wbbwHkl%WsalYo^lD!4WHe) zcTtl-=%sMuN&`KspDVW9HCL9XYlBEE zqcaB+Mz*hsVu+`|(1}i^p`Pix@Zt++cCsL3p)bD{8BPv{y^elOHyQ?F=myPYGUwqO zFE5Gs?2V&vtP&?Lhl&2BDPk1A#{7HDDp{iumx2?Qvb5G$ycEfOECwzLRP{uhU$C6j z7I%Z#32Rq117rthRVSN${XI@hjXWAJ_ZJumMu;a%zz#59n2W6wS2d!3MF$`o)5 z`Ns5l3w)s1Qn&F*r_>?3f6vCygy9<2Ect1Y zPf69YA}v;YpN32+ouO_c*8Q5mihvI9LCn3+zP}->A@uh%=>6l!Xd<~`?Iyo zIT;}~ev9p<60{7aC9d+KB9cMRK@zRF#)dS<7Td59vo!B;KPh>}(P&bI zOIdP-6FGpZDSwpCtefXV5P+s9*ImSgb$T9YyNlHuv!Y6HxSP+gIp#MIIq1*Y(kXFR`M-knI+G^Z@j z#Xb$~4A)RG`7$+~j=u(EWLUU8>JKZgb4A}3XzkEg`9ZuVmGlszaidBfroe1Fh^3=Qm z9YyIyB|fX#kuYzaYY^y-CDnx`KSFz;1JS80ohePo1g&6be^`pAGwlkgg7lR+hLZAJ zo1unjObv}Bbj!vPx5b=pb~&EUXwoz4clB82@!L(PjkYpWRmX43uN#ke+gX+ad2!Eg zC*}h!@-0`O{FxToooJpQ@p=}50qgQ7AK|R9hLXH+D5+Bz$J&ZfM^qBLdw95OUe}WV zd#-$k)5}_&6$4k0R*&UKdYxi*9j7Lc0wAt@Zk19N+mXTj$asRdM^1dkR_A=m})@)87p$!PBq*+0VIbG{abaiGr2ta4xbKlF|N#G+KDMy|oo);!yAH{Er;CHBE&^lsn-p60dor%wr zI?|T4`0lSPeG*inn7{z4ph6^3Mv>IJh9#b_zm_lMmS_0eZxRA8rFbn#d;5I1eP@1r z?l)pKOcuhkVJAU}CIBkuLo&Z}K>)s?|AkHhh*Z0Lx7cHt50|WwNuv5DQGRSCw77I8 z6(ud2kBLbuTWsV0Pk)#^1=CfS2EB*uX}7LEv{@D}R9;MsS!e=Qe*C?4lfPHUZQ7Z= zj2Bj(Up`GMe(lZ#gF#x28vjn2YVEKfJnuZ=FWMIhQW^kZ#;k)=EJXL@*_`6mVXS^))F> z{QEam?C8R!Xc`A8Z)}rbc>a)3>%6Li5W@V@@4No-59K#xjSvc+x%(B^~t|;bdbKo%Vug9-n_wJj}7=*4q z9v?0OKgDuf(eesPT54nTSj8Y{$@jJY7(#%=%d2F>MR~rC0MM-^e#&BL;X7qj3CX90 ztQOs1J_Zn;RoMK)fxN9m^)7*6MXKdL(g)a&B5Bv#7v>Gi$2r6b!GDD_-uio9Wo4Js zZkmwQ-wVAUsVn&wT8D%N13EQ%EbKN9iCxjUzqrw2;Mk8-*}8YFlCHc_&pt_AUNh z@ONVMPb#rKp9d7QpZ%dPatdToXQ<*bxmd_;WzY9OxIMgFANQwmPoqqIzujj)-@U?I zR4!TtPic_YtPNyl=}z}DPSEEqWB_oJ#YM}v#aER5%iB!f+bzI&_tr!9tts$)4s~E} zVcUA=Rv|Wcn)I_Ov6s>)%aMKd85co|8p6pHLj^xT1`j4lQKX6%XO(%P6pDkyZq}<_ z?aaY$!R<16y5li7Rx5#N>_QcDOx!FeDVU}uPuZt8%g9p0x(N}#pm=_xC2wzPBkpL* zLorlTU2&M8oUV?&E(<>xDr2g(RZ5o3X`pQ^&r3(Z?vBXG%CvkmOqDgo&7Tn8D#Jyg zOPg5UPF5?AfVG_NU&t~afD+1h|EAX3D=kLqM%-y_!^ermo$l*QNi+KN4XgiP&Ky}g zwET`s7wjCVW9E9O0FgGJX^HZ&oUWkDMlB7x$EDyT5H1H*-vD@RFYGT_{bS&VhAp`= zJb+9XD>$Yy=VZ*W6-_%J0C#n+FR6dy6u$BVwkr;L!ynVF+COM_b2y!P{pE^pAinQZ zj%i)F+w`Cpv~qT_nOR_JUv^@vlCZZyY&96EL4l)Ojqjt97Ok#pps%lpqLQ03sY*HQ zd%VANX++#}cUI*q^t9a6WQ%9W0Lx`q#6TQ09$CD&V#A%2o&t49jFJO*D3@ma^?TLF+C)F^27R5fR%qxC3bH_-S~;>%<$Bo=)Z?_xSPj0>kS9rs0H1d zC0p@s7mRLz-U!EPI8fX})j3hNHge(XdD$zq)poZ-ae21&`0?s=|M#aXuQL_Jq>3;j z-4sREx4}PND7d#Kn~ZcH{P4&@38!IwUr?4%((WCZ|jsnV~A5dxNuaU9^XMB3Jw|DVY8*3sc-*Q@uVAE@idslS= zX00R*Vw>r#%!lFBv=oZj54hhs)zu+|9eQ4u3*pM`=C#-h!wevDF7R#Cnf-kx?$o60063b%zzOQb5Zl&!-*n#idVSFUT^Dz?Jm|&sXs>#m zeK1Heb)O`{0dRWMLznHwxmAEtSJii&m?vuW+gSoYU3i{(uLqu%zl^+DwtGJ+a}`?2 zW;|qYiV(Tg$VT(yx(I4P-FpRCJ0$RB>J&|@T7sWrZ=lNuKGHX(fHx03MpD21=Jv~7 zG#n+rT_u3AN7qDO)sW~R)22r}2LSN)QTImTxBDmrIn};N`;UeAwaP=N5HiYTmKR1t zo>pnZrjbh;4#?FsaBm<>t&1M5Sp`fN%@-FBj)Ls>`AFZ|ROBlvU?Sn%j9FGAJ!A6va#;F~9agN%ZPs{YGiUmL1Yc#Q=#4W$i8# zqy_2nzGl9K)%_<5iIL-%_u+F_exA+F-2Q+Msk|^1Q(FgWbzNLV7mTqQgC-B5bS-;T z$pU(#b~ebUaC2Jh+AA9m$ap3naCMHfz8&y(JmA^;F?C#m*QQ3`fk-e#a457iCY|6h3pSV(HJ{Fjw7tjO=1nx$U*L6Ig@*IV?WRKp4@umkq z?|>gj?N9GYTMvzdJeAN_2NR-NI+t}2w!c8hft zTD7fFr@nR6ztum{!9o3Ky>~yo+dww*ev42?F|Jaftkr1r4!>>E=r9cNKMARoulsJ& z3Q_J2JxzB;W(vW*%uy`69~?s*+`mX#dbktLP?uRR(tSDTH+gPZ+}$?kfV@KzxAAUt z!DqW>wDo!MYI5UDW^-Gs)48*DMrSn~)Xxp~eU`g0R3c?-!1k%6!upA*Q1e|2bn02Z zU1!K^sDHn0lc?iOX_pR!CnwY(qiS0+SKY@}lI&RX^7njuQ^WJj{g?;Was$pQ#^|?w zskXb{3Q5ilBJ4V4Bv=47kpT9Z)tj3Hq!c&p4$A>7Kv3hI=u6s6pv%k948NE!*V-7I z;8Sl=ah~4`sh`7JSKo{0P;}E}3K|KD;ZSH|b~=h5iQ*Qro8WW!?G@VRtx@Ql2VuaG zWdeKe)#uyb%mC@flu;<#Ge+8P0aN6KAvICpiBoIuNUFvdi#Jww#TKdc%T($hoVF)O63auo{K1= zau*0>Py*U-JmT!*f@xq{R`h2M*fx6Wcw&0HEAs1}boq65YV`Kg=e^|C=kO(O)jc5U zeQW!9ZzLs8AZEmmcIemV_U*#D$99y=O5EENM*-UJU1Pn7ROEqG;X{>ptb*?(=d?=Ttv?FDg8{ z>wGVEJ(+~A1~2XM{2#5gbdhqjzSv2hk_80_&gf)>ILhmeA&LfNEm-#zlvV**W1YC-WK@lb$64N7b`{Q zhR|@&tGqeJc>R*v20mR{WaUYuWAV312jCm0v5}m)X>lN&_-i6D>zd=9><1c#28RI# z$Gb`k(3Wu;JP8z8CV90iGvPEpNCq8 zo0*0_*K1edw=+tHz8}x4%b;IlVN!H47)hByrT9-(M$gAgUzx1bf+RD&dqx0&K5M&GKk^^wa! zt;^oX?FF9K+*dx!ZCB0eT>VlHCR#HFaL9(#r!GR%PIh+z>?4P{(44ff*j=o0o|>uo zd*74Iz34{yG9dg{2`qrru>ao1~Yi9NK31SiS4$R9|!-5 z8M=jwQH^8*Zz3ZrXQg4eC+anvb8T3%aBSKIrfPdzIXd2MT6V!!l4RKDMZ4bZBa-;Y zNt5LumV243Nipk#D6E4{5}mbp=>u-Ok0_jT=~z4id#|W(J|czO%$i=I60>n1`wqp1 zumaaIHsix)y|JzHo03)AD~Gx>g;1bj05~Pj1||77_~ysj3K71?#-{Xyb{EIT%p?37 z4RM9q@ECHm-!R~z8FC=$n2hPl1fY$l(K#%%G#gw5t4m8e@g3%hN2EuM5~Cih?3Gql zodm_y9LY6LJI9u7lY~INVXZ>X!3*U)(oJ<~9^;xk05Wz7!Xx3n&6e5bdXny1tIv7@ z@unN&UK#h)gS)s zgUCUw8Hr;$aJil}L?>PA@K}EXF8eMh7PYWd zwJ%PWC^}TWti}!dfJ)WK@t9o< zHAB9YB z3afT#F@Dk#ERZ$B!alG7{RtgG?$>^Vf!8iwg80KZP`s@mICf><`piYEXlpuH5Iv0C z&M0jPo|Zf@&!yWi8j96;qMXM+`XTAfIe%=X74O-$WM!#-W)Ie9nou`YX#mEUw5)Jy z5RFQHjvcy)CYIH4j}5zVaAcLh!Im%G7e#B=y2*mkfPZ5Rob;~|aitNb1Ss3QmIP>waHCL%d}~`!hBkkj`pb=MjZ(wEH0PB%x4dNH@tjsO=eq4>ed((d z;CT0@c34)|_qO@t^<~1R(G$jE;rnlVE3=YY0?v5YSJ&aztFg1HQ2Zy;W+%{toHH|P3sam8txZ`F{C`bhE_hn=ka3eIL{96(m2kj!-hr}ciGg(k z2*J1Z3SQ_IW~dt>SW;xOb2tKi6wh*J!xvQ8N11WDovSe(=(J~o+^Pjmf-9-?NVJYv z^;(X!-F5S|hSKMN`;*HpObU5+Gz|AE+e)1M-NZhq+4>cppm1aL@8zAii(68yG${yN z)vxasWR8Ijb-rZGgJ&-ueGOL*2%3bqB&+TqBbcluTXE<@8X79ddGh3)v_@dPPy92kUC~llL5tLy{w>JOy%iV zSiDEb)ZPMGt1gZAlNGMId{-iam5W5fKF+AoUl#*%`x!`Iw=cA&D^1un(`%5iBbI*T zo3X-+46wu`LUX1jA9L*)*soy&jP3KTh=M?aN0qf$@~sSLK(|`=D*8G>QdW1Vt8{_I zvbxOSLh6jC29nC~`#NvdhW_!H)%BqJ-2nFn9&d%)vCWCW8Z?h0El|jrz!_6_?1sR> zg>?|PJ^F6(lDF9edk{{XG#-sU0k{J3PS0DHFS?|ka>K7FnQAue;3EnI{FS4iD_Dl1er1W zyGvPS?O60d-zzGIF@b+bpqwgw{t9cBKO5vb?45xCTZOMgNA0G9VLCZnovv}_JvVsP zAEHt8{T3Hhjii;Y=zs?VL7Ug@bJ@S7rrLxDYd!Ggt6pnu z?p((Hp9oHS_W#<+f3z&1>#Q&+oOFWG5Jg+Rz6tJ)KTx#)F<7Wk8nyszF!0} zUa#7Op1I%56h@0f`)|i)xMo*Jr_w_Ki`5YBfS5uxNUOzA?h3%&(|ZlLmffr*=oEN( z$2U!NdYCYDYWXs2;2>6omy%kD-arE_YG^H@pzPCxnmPi-p{rcaSgXU4sYY?ORax+3 z`|qVq!!~*t(U~Oq)f3wKU&pe_TE*8XIgk5lw&hz(43UEghd)IPPg&4p(xK(-*`j#5 z#T9>6zcIDeq1{eR@EtE{)y;4+I?6Nl-N}0FoltTR=$Ea!!QHqerV@l|Em!I zZr_5P!xZ-aoI{W=`hSAl4rp}wR{3mr4wnmd4lcGJbO0hIdOSievZN6N&2WuI)OuCn zra^2vP^l#`r>oEPX5jT-3)=`U^#vbBU9LVxPk>fSSHsT+8Zp*}&7`DAGgg4^1>8*A zHha=PsCfvXRU~!ut%vkiAD1BdIO{`(sDAx|DjXlehP;Le(k@UV9pawXswyBC@;rZP0yt>#xL}IR3n8mbm-3GrM}y{M8E7 zQ%|u^O1JH|rPEzUX&sqjsXP#R05s&I+@pOvD>kS@G|bCjViQIH<0-Z(D952CD~;BG zHm00x)CHzV#_(+G%OM}|@#gebYw0heUjD9tYnM)Ukh=hZ-SMg!-ux;fXqBYG4_=pW zXR-h}wt3X#$Q~_QlHjU)Rdt|@t&0?u9|5q~1DQv}3$Y`;vnp&!(WZ1V8vXg38|+-g zDT87>tRoUT!Shmadh~@$$FUFdy3LD1TLSm9d_HB{&%%!zgNKD56&l(Xo^DlHR==Y} zCAEdELx54r#t2y(v}0a>30H2;U91KMxw9tyoA@zZp4567oklA{Ns5fadF<*PAEhKc zSYSJx>VpB|Jb4<-10q%Ypqs4FlFkQcdj#a3*Pz^m^3_xPIB&jfXn!ouZ5u>{pvY?- zY@k~K82~f({G@VE%a;*tL8@e&SAXwR0Q;9b`aU=lI^cAqP`nW2+SW$;!d;9v; zPEonk8dLOHKt$M9uq_{<#6t};NF7F|27aNre~ftoj!SYio<8*Yl*usHu*b>UH|uv+5;MOD`*wLV8?F{>@aIm5d}dri(Xxq;2T|@U;W4*c7Z}VeH3#d z|Fd_`^hK6r9?deCcv<+NmCU`8Gm}(xlItFhRRf+aT|R$Ca4c2mdUjS}c7Es69pE9L zE6{+v3F3552X8>pU?9aaGFk;w`q9A_a7qh2Pm@fGAo#^J91cuv#O{o`!vFi#@dgQF zsBk$o7?-#G5vD>XS>;1ELQI+uI7t0@dtSl1pS$7uH`=)E53<_2{;UY*Q^k9F<_lS0 zrJ^1(hrb=;VLajl-OTxEYI7nv!77Kz?0qL(%uDjV;twQSRW)x{Y8BzFEd!1`cH0UJC!A*E;kp&Y?WX_18>0v{k^LdL_e{)-p_j~%|hZg!FtNN0% zJ>qc-F|hEgIABUF#CgrvrVzPl*-Nx?Fz4rgM+is* z-t*G7PTh^#-v1ZlU)WV-eLlS^V~v}J@J1HX==>>fftK;r@kn3(SJHxYj)lfQ%j5j{ z+w1+T!R&l7Q=ex!rDv%&K@anvHtv@KNN7r!8{(hp9142&<>5`^V3xpBiMVeE{QH|_ z0Bygsn|p_VPTe8XDVBsL4tf3&^IpM8>(3;EGZQCeDmY0YDZ`91!)gd1YaptX-FA-8 zv;lPALzGfZi_F1aer$CfXuf-HMHG$!B?|)M3m7=hU({J(N=n6jV0E?lkW^3s67e1>AwrBOP9&mW*dhM2 zb4#-$1IWL0dupD2-jzBeFgL^S3V3(@55C)^pY-q{X+o84W9r!RwSWIJCoDe8kMsS~ zmfo;*9{ZpwbW&5>mXIU3F7Q0-zX_hf!>h~IPNpA8&)<~G-;8fb6&=&Y)*goW-m@!r z>2-*2WRu6<;hx`_*(2Z{x1|1jhS$sc6i+&RP-d+r` zTJ(u-vYVnoXvd1$)oru%u1v{(;Gh;-A6R37-Cs+}VLCRT1E5D8a7Bis86-|Ks#h(t z4();pX21>}Zy99^UvMs^9%Ntd?q*x>_A~XlPoqz%s_RWhYvo+@^3+qJhLSCVqHDw` z{~@b8lfP(Zk!H~ZAmxnLOo5`ltgU|~;0Xge&934QC0h@nZ(fia1K=Ai)ZpavHX4?f zu!G)Q2*6RdyPQqMXr-FDCsBeD&x<}J5SK!k?Dkr?WDwm+f9g`vx2!AVTk3if%yyoF zmMyL8B>dcT97hW5(M2P0yrsc;oM&CrDuCA+6*<4T{J~A)esS_W zU%YOa6!49j&hUzs*hMzwuJ#KOu|?8pvlCoLOT9bY-IE*)wtnk--^+GBzqI((cj&~y z^7*iC%q`5JnjhEC+bK#{&{}B>uQNOEQU zc+X31dC6R*le6g~D$Bto!Kaw&3U&&Yv7)Hl@zkBlG2=6tG&9ZWvV(4^71tNd?auy8 zJ6i~ zU!LBqNz6Wsuf73hJrVyy8`IC~;p8Lq|Dnxe>0+?elcoGMtSDt_<}96LIfTk8-5{F= z)pKzdxi9^Q-n*J*VVdcP?y05HF#U+;-bb{?+^Of@mJQyz+;@3imZ9Wtv?`(E8sT>H z+K{E!89*zdRHCG{K4w9h3$|C6x)-s#D3n7eV+~*TaoOC8IY{0!wr6z?-K4|?)|+wH zIv1n$j#>J34tJx&Z_A^ZaZm2@UHHP8TE{&0mf>5PP<~gnQo9g+d1Gqv7ezbz87+hI ztyyYUWM5ZUs$)0~T%oc+DLNIKsk+IF&>>)Krk!Lhp&nFMk^*0JCOPiOac*_>Pugtv zpy+aTr`YUt>G*=udS}-yr^6XRPN;SqPm(zYrmY9L97{Gmr%OZSI);-y==Et_o(Cu& zm9!BFqPTtRN7@oagIh3Q^Y!+X&OuFtq6z9FQU9~ykwXp<{GEgXdvBR_xQ3*)b3(=O zUc1rfM&0&&KYDs?HRasYGC^YERL;e^CidJRM21?^nOsD=K)DbXG8G*s>g80-9i}+Q zoJi#d^T=L=O{>R3HWEh?Bfs*Lk8&c-9Ausp-zZ{p|G_cbz`=CzLig_TY6^E*@-22q zEP(sV_={HxoUKAAm9IbNuM{oD1(I8W{JD*Yf}B5)gShqC{6QApa9Wu+xYh#adH8Hl z8Okspk%-K5Xs%%gEs!b|*k5V>@M~q1fhhvwBtxxP2;>{5=+{?`O_?{_-8eRTJp|S_ z*Jc;48A}$vg7KuuFvXf99zg(&Jzwpc4tG>@;YXK5H%JsIqb3A6BFBBI|1`6N`H3IV3o|uyW*spPmzVz1y)Fca&Su{> z&mP>jYO7*+i66?;y2Y~*d+wZ7CDgshP6doZmw>MqevkW^YvryfQPqWcuL(4_H0Llp zc`QmZwFNs!AFzN0banM)H4~Y{x_${)-DNN-+yc~x&?$`@MCWP{S}eSgyN@BNi_nZ> zD}tR#Cr>ZiE&b!C8#)((nh~2LVi4Zd2&ijs^9sDTdPDqO0#o!~G|hd7D1^)l#tqer zT-+w0yizv8AwIqDcg}ZgHRdwM-hD)-Mwo4L{{l*8E^xA4!d;V=VH<0@$CG8%I#{Z* zzSCjAE7Ob4hsh=@%f|8peK^M#tsFBGJ%*nz4h#he;u;Bo4*P=xhAeBV8bt%b@g8kU zUY8NmrM{_$Sjt1lZYs5Ni@X%`zfq19l>y4A0N$vkj!~?h;Hfrkf-AqOk`N_R520~J zsTXibQ|t59K1d0TR|f?ZDp$$xg8%Jf+YT&INz~;K66k_qH9@-I#XnXErJ~=+%qDCk zirPb+tElxh0~YlJaG7d|V}0J2+5`Q-LNtC7oeg6 zl$8@^k>i-cUm>v@mZA_>|F{s&ph~I`nr#fU zFX7}E_O>zht+aww<1$YfVozEI|k2 ztaH7b?R~stXlGyR9589xXtxzI=TNz;C=qXN)3NC}F5u5jyRGGuy4seo!&J3S$^IApefkh zkcI}QmpV19Y{o_xgWU{XdnwD;K-4wQch}9FnZixOWuNGq4>N4@RW=pv1K*FC;gg_y z!WQy>I_H>j_OIGm5I)SNnEU#_q=kSdhT-MAVX+^gF}56;yRHhZ&|-)czL@$r?s$2q z%6urz@sCtDGQ~A=*|o-{LsJpP+v8Q{2e^-;Xsk`EHsd?1-mR?dYnFtZ`E>*u!0@9R zo4)L$;@Ls5-jiVP0)WSR2GIsREO~=Fm+(uC0 z!u1+qzg?Ae@K4z%_EKjubXkmaUjqnQgNM{*f)=X97-{pE8-1K6XW1s1bft&V=dA~3 zQU|oAocQw}^&L6q`rEU6yS2ITk*Q^BG>sLEH~6$^8fz0o(s=nAhCW%Rak6!{n4H1w zxNM77BvczJMXTLNC15pF_~J(b!w<1@FklIvV_0w|M(h<(0}iYSI-*_B!r4XVD}5_RM6ca?Dqc@6CO!B|Nk=CAt>k*Cqs3FWmPo#($nM zdP;z29&-%!nt7wos@=@yVv9K?PSiI5pPTs^! z9U=l1}pR@Eu1(OmJSwVB6}{GanCkgqnbCF;7rqe7npE|5Qj-4kVm0PRYAz~i_Ax4 z4W^sjCzwKK9b7G)v)dZ_PXlRi{9>S5fye_XV7g5PKi#9Z(IUf&NQfC~L0^&&8F0A6 z?hw|y>VB_Gu zBvKpQ94ebjV1;GWbDthEYvWHM(}4HkE<(IjtW;nrjAR4nlL$I$00_& zGE&w(TmrtALP8=S*c1W)aGx^bBI<~f2L;Fcew%1igtOgp|LLLzw;u@vcs1mRK2M;xOHq%PV+d7FnfB9ak2Fg%v zrbp>DShZlqttCtUgf}CnO`t@i6_)-+3o|MmgkG*fh7cW8X!i?z6&79C_(%m!wNQ_G z+;=2nrURmvyfem10iHs%R}a0dql=vD!O=OE$vu=1Bvgn!w#rO=9Jb-j+#fvO{L$Q123Aah zOB8ip{7N_8ZwCAM?hv|Fs$vy5)&|U29dkb_PwL3#d922R&T550KJrMvgh9Nax@ynl zO*{-wek-o=8Bv-{2tVF2YqYIcUu<2i1-DnS$+nLOov+@iR)8 z9o4*6yz?RIX>I`c?F+PZtoprv_e~P7$-rP?^$0`#*5u(@ChrKoJ54Ta{!F z-YoHG%8@G14HGayV9Vb6SFpsd*g{8PV!-4lfk$bgzDT4Bt3%R_wuiIEu*6`cs)T^Q z9a@ydF~n8EM5VDC-(vr1|CJ&C=OIURjw>m{P@MW@2xFXE6ki5g6&_#amINIG0;3pw zR<}wb!!;v12)=N!_NQiM-6dGAsKEzKVe&Px-9hB^()2YN1yMo5hcPz{z*Y98V}>R0 zVT5D5(pZKf@);R=m|_m=8fkh7iCnQ{OZAVE;+r`2!qY*>Wg263raaam5Y$PB#U5(>CCyF!m02L6_&O_fC`p3n-NAp=jH!ARQGY7XUX1 zh7c1;4#)GzI*!>@X$sE@qJy@;WsiKglydGl3i3Ds-3 z`6xM8xLYT4)t+i+zOP!6)14nw(nwc;_aDg(Y;ams^JB78A;!oTI!A?13)wvhzcd3X zf}35o{&gaXsoQ)Xt8QQ@m>bAnog4A`IRj@{7c?)MQ$Z9m<8I4>h7^yY-y0A1M_m$N zY((HMVDC~R_FESD-+vFFAnGBsmGAwyqpxKk|4QL#h^35lLo>foFEyFY%I^$rtmnX#U!V)@ksq&wmi4}z@u*GuJ8?p-rh^x#SpzuKLw zM~>pP75`)Bwk&S-J!uD_WR(~I2v`HBBoO~+t&$JFxLC`Gia9pX9X*j0%)MW-f)3`5Pk>$z*YO|P4_=UpC8Ri z&w?m*geG%*)Nd1Z?Nok%njF;M7B;8wj0dMiTu48R-iFIa@X{V`(t{7N^7zm`+y9HG ztoPGLr?Mk2QhCnHcXX(^2$8{VWC@+w$Lar-AG!GEcg z?oSy#D{o z`47&v0PD@$prmSY$pc6f1p~cQ?VcxBV+P8c5YanKz|?bZl91hb+dqmGi$DC_3NaMu z+9eaCLB>@ZEmps;fTG6 + + + + ./src/ + + + + + + + + tests + + + diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..54abdfa --- /dev/null +++ b/psalm.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/src/Config.php b/src/Config.php new file mode 100644 index 0000000..d15130c --- /dev/null +++ b/src/Config.php @@ -0,0 +1,19 @@ +address = $address; + } +} diff --git a/src/Connection.php b/src/Connection.php new file mode 100644 index 0000000..a2f48e8 --- /dev/null +++ b/src/Connection.php @@ -0,0 +1,136 @@ +socket = $socket; + } + + /** + * @psalm-suppress UnsafeInstantiation + * + * @return static + */ + public static function connect(Config $config): self + { + $socket = (new Factory())->createClient($config->address); + $socket->write(self::MAGIC_V2); + + // @phpstan-ignore-next-line + return new self($socket); + } + + /** + * @psalm-param array $arr + * + * @psalm-suppress PossiblyFalseOperand + */ + public function identify(array $arr): string + { + $body = json_encode($arr, JSON_THROW_ON_ERROR | JSON_FORCE_OBJECT); + $size = pack('N', \strlen($body)); + + return 'IDENTIFY '.PHP_EOL.$size.$body; + } + + /** + * @psalm-suppress PossiblyFalseOperand + */ + public function auth(string $secret): string + { + $size = pack('N', \strlen($secret)); + + return 'AUTH'.PHP_EOL.$size.$secret; + } + + public function write(string $buffer): void + { + if ($this->closed) { + throw new LogicException('This connection is closed, create new one.'); + } + + try { + $this->socket->write($buffer); + } catch (Throwable $e) { + $this->closed = true; + + throw $e; + } + } + + public function read(): ?Message + { + $socket = $this->socket; + + $buffer = new ByteBuffer($socket->read(self::BYTES_SIZE + self::BYTES_TYPE)); + $size = $buffer->consumeUint32(); + $type = $buffer->consumeUint32(); + + $buffer->append($socket->read($size - self::BYTES_TYPE)); + + if (self::TYPE_RESPONSE === $type) { + $response = $buffer->consume($size - self::BYTES_TYPE); + + if (self::OK === $response || self::CLOSE_WAIT === $response) { + return null; + } + + if (self::HEARTBEAT === $response) { + $socket->write('NOP'.PHP_EOL); + + return null; + } + + throw new LogicException(sprintf('Unexpected response from nsq: "%s"', $response)); + } + + if (self::TYPE_ERROR === $type) { + throw new LogicException(sprintf('NSQ return error: "%s"', $socket->read($size))); + } + + if (self::TYPE_MESSAGE !== $type) { + throw new LogicException(sprintf('Expecting "%s" type, but NSQ return: "%s"', self::TYPE_MESSAGE, $type)); + } + + $timestamp = $buffer->consumeInt64(); + $attempts = $buffer->consumeUint16(); + $id = $buffer->consume(self::BYTES_ID); + $body = $buffer->consume($size - self::BYTES_TYPE - self::BYTES_TIMESTAMP - self::BYTES_ATTEMPTS - self::BYTES_ID); + + return new Message($timestamp, $attempts, $id, $body); + } +} diff --git a/src/Envelope.php b/src/Envelope.php new file mode 100644 index 0000000..85cbc90 --- /dev/null +++ b/src/Envelope.php @@ -0,0 +1,51 @@ +message = $message; + $this->acknowledge = $ack; + $this->requeue = $req; + $this->touching = $touch; + } + + public function ack(): void + { + \call_user_func($this->acknowledge); + } + + public function retry(int $timeout): void + { + \call_user_func($this->requeue, $timeout); + } + + public function touch(): void + { + \call_user_func($this->touching); + } +} diff --git a/src/Message.php b/src/Message.php new file mode 100644 index 0000000..7b6fe1a --- /dev/null +++ b/src/Message.php @@ -0,0 +1,27 @@ +timestamp = $timestamp; + $this->attempts = $attempts; + $this->id = $id; + $this->body = $body; + } +} diff --git a/src/Reader.php b/src/Reader.php new file mode 100644 index 0000000..fcbe16f --- /dev/null +++ b/src/Reader.php @@ -0,0 +1,99 @@ +connection = $connection; + } + + public function __destruct() + { + $this->close(); + } + + /** + * Subscribe to a topic/channel. + */ + public function sub(string $topic, string $channel): void + { + $buffer = sprintf('SUB %s %s', $topic, $channel).PHP_EOL; + + $this->connection->write($buffer); + $this->connection->read(); + } + + /** + * Update RDY state (indicate you are ready to receive N messages). + */ + public function rdy(int $count): void + { + $this->connection->write('RDY '.$count.PHP_EOL); + } + + /** + * Finish a message (indicate successful processing). + */ + public function fin(string $id): void + { + $this->connection->write('FIN '.$id.PHP_EOL); + } + + /** + * Re-queue a message (indicate failure to process) + * The re-queued message is placed at the tail of the queue, equivalent to having just published it, + * but for various implementation specific reasons that behavior should not be explicitly relied upon and may change in the future. + * Similarly, a message that is in-flight and times out behaves identically to an explicit REQ. + */ + public function req(string $id, int $timeout): void + { + $this->connection->write(sprintf('REQ %s %s', $id, $timeout).PHP_EOL); + } + + /** + * Reset the timeout for an in-flight message. + */ + public function touch(string $id): void + { + $this->connection->write('TOUCH '.$id.PHP_EOL); + } + + public function consume(?float $timeout = null): ?Message + { + if (false === $this->connection->socket->selectRead($timeout)) { + return null; + } + + return $this->connection->read() ?? $this->consume(0); + } + + /** + * Cleanly close your connection (no more messages are sent). + */ + public function close(): void + { + if ($this->connection->closed) { + return; + } + + $this->connection->closed = true; + + $this->connection->socket->write('CLS'.PHP_EOL); + $this->connection->read(); + + try { + $this->connection->socket->close(); + } catch (Throwable $e) { + } + } +} diff --git a/src/Subscriber.php b/src/Subscriber.php new file mode 100644 index 0000000..1aeef57 --- /dev/null +++ b/src/Subscriber.php @@ -0,0 +1,74 @@ +reader = $reader; + } + + /** + * @psalm-return Generator + */ + public function subscribe(string $topic, string $channel, ?float $timeout = 0): Generator + { + $reader = $this->reader; + $reader->sub($topic, $channel); + $reader->rdy(1); + + while (true) { + $message = $reader->consume($timeout); + + if (null === $message) { + if (true === yield null) { + break; + } + + continue; + } + + $finished = false; + $envelop = new Envelope( + $message, + static function () use ($reader, $message, &$finished): void { + if ($finished) { + throw new LogicException('Can\'t ack, message already finished.'); + } + + $finished = true; + + $reader->fin($message->id); + }, + static function (int $timeout) use ($reader, $message, &$finished): void { + if ($finished) { + throw new LogicException('Can\'t retry, message already finished.'); + } + + $finished = true; + + $reader->req($message->id, $timeout); + }, + static function () use ($reader, $message): void { + $reader->touch($message->id); + }, + ); + + if (true === yield $envelop) { + break; + } + + $reader->rdy(1); + } + + $reader->close(); + } +} diff --git a/src/Writer.php b/src/Writer.php new file mode 100644 index 0000000..2c9a182 --- /dev/null +++ b/src/Writer.php @@ -0,0 +1,68 @@ +connection = $connection; + } + + /** + * @psalm-suppress PossiblyFalseOperand + */ + public function pub(string $topic, string $body): void + { + $size = pack('N', \strlen($body)); + + $buffer = 'PUB '.$topic.PHP_EOL.$size.$body; + + $this->connection->write($buffer); + $this->connection->read(); + } + + /** + * @psalm-param array $bodies + * + * @psalm-suppress PossiblyFalseOperand + */ + public function mpub(string $topic, array $bodies): void + { + $num = pack('N', \count($bodies)); + + $mb = implode('', array_map(static function ($body): string { + return pack('N', \strlen($body)).$body; + }, $bodies)); + + $size = pack('N', \strlen($num.$mb)); + + $buffer = 'MPUB '.$topic.PHP_EOL.$size.$num.$mb; + + $this->connection->write($buffer); + $this->connection->read(); + } + + /** + * @psalm-suppress PossiblyFalseOperand + */ + public function dpub(string $topic, int $deferTime, string $body): void + { + $size = pack('N', \strlen($body)); + + $buffer = sprintf('DPUB %s %s', $topic, $deferTime).PHP_EOL.$size.$body; + + $this->connection->write($buffer); + $this->connection->read(); + } +} diff --git a/tests/NsqTest.php b/tests/NsqTest.php new file mode 100644 index 0000000..7bde73b --- /dev/null +++ b/tests/NsqTest.php @@ -0,0 +1,35 @@ +pub(__FUNCTION__, __FUNCTION__); + + $subscriber = new Subscriber(new Reader(Connection::connect($config))); + $generator = $subscriber->subscribe(__FUNCTION__, __FUNCTION__, 1); + + $envelope = $generator->current(); + + static::assertInstanceOf(Envelope::class, $envelope); + /** @var Envelope $envelope */ + static::assertSame(__FUNCTION__, $envelope->message->body); + $envelope->ack(); + + $generator->next(); + static::assertNull($generator->current()); + } +}