From 5a1ba8745966a393ccab9b1ac338cfc196b76f98 Mon Sep 17 00:00:00 2001 From: AMPHP Bot Date: Tue, 15 Aug 2023 21:55:38 +0200 Subject: [PATCH] Sync _data/releases.json --- _data/releases.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/releases.json b/_data/releases.json index 2caafdf..962bc4a 100644 --- a/_data/releases.json +++ b/_data/releases.json @@ -1 +1 @@ -[{"name":"amphp\/hpack 3.1.2","package":"amphp\/hpack","tag_name":"v3.1.2","html_url":"https:\/\/github.com\/amphp\/hpack\/releases\/tag\/v3.1.2","date":"2023-08-11T14:05:22Z","body":"- Fixed decoding header values when empty.\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/hpack\/compare\/v3.1.1...v3.1.2","revolt":true},{"name":"amphp\/http-server-router 2.0.0","package":"amphp\/http-server-router","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/http-server-router\/releases\/tag\/v2.0.0","date":"2023-08-05T19:33:16Z","body":"This release is compatible with `amphp\/http-server@^3`.\r\n\r\n - A PSR-3 logger is now required in the `Router` constructor\r\n - Starting the server with an empty `Router` is now allowed and only logs a notice instead of throwing an exception\r\n - Middleware can be added via `addMiddleware()` instead of `stack()`\r\n - Removed support for adding middleware directly via `addRoute()`, use `stackMiddleware()` instead if you need this\r\n - Removed `Router::onStart()`, as it's now internally registered\r\n - Removed support for `ServerObserver`, as it's been removed from `amphp\/http-server`","revolt":true},{"name":"amphp\/log 2.0.0","package":"amphp\/log","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/log\/releases\/tag\/v2.0.0","date":"2023-08-05T19:05:50Z","body":"- Increased minimum PHP version to 8.1\r\n- Make use of fibers with Amp v3 and Revolt\r\n- Added support for Monolog v3.x\r\n\r\nThis release does not contain any changes in comparison to `v2.0.0-beta.2`.","revolt":true},{"name":"amphp\/process 2.0.1","package":"amphp\/process","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/process\/releases\/tag\/v2.0.1","date":"2023-07-31T17:56:29Z","body":"- Fixed error handling if the started process fails immediately.\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/process\/compare\/v2.0.0...v2.0.1","revolt":true},{"name":"amphp\/http-server 3.0.0","package":"amphp\/http-server","tag_name":"v3.0.0","html_url":"https:\/\/github.com\/amphp\/http-server\/releases\/tag\/v3.0.0","date":"2023-07-31T16:06:03Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\nThe `RequestHandler` and `Middleware` interfaces along with the `Request` and `Response` objects are largely unchanged with the exception of replacing `Promise` objects with the resolution type.\r\n\r\n- The return type of `RequestHandler::handleRequest()` and `Middleware::handleRequest()` has changed from `Promise` to `Response`.\r\n- Request and response bodies must be an instance of `ReadableStream` or a string (note the interface name change in `amphp\/byte-stream`). `null` will no longer be cast to an empty body.\r\n\r\n### Creating an HTTP Server\r\n\r\nInitializing a server has changed significantly.\r\n\r\nThe `Options` object has been removed, replaced by constructor parameters on various components. PHP 8.0's named parameters allows only defining the parameters you wish to override without the need to define those you do not wish to change.\r\n\r\n`HttpServer` is now an interface. `ServerObserver` has been removed and replaced with `onStart()` and `onStop()` methods on the `HttpServer` interface. `SocketHttpServer` is the provided default implementation of `HttpServer`. The methods `getLogger()`, `getRequestHandler()`, and `getErrorHandler()` are no longer part of `HttpServer` to avoid the interface being used as a service-locator.\r\n\r\nIn addition to the constructor, `SocketHttpServer` provides two convenience static constructors for common use-cases.\r\n - `createForDirectAccess()` \u2014\u00a0Creates an instance appropriate for direct access by the public \r\n - `createForBehindProxy()` \u2014 Creates an instance appropriate for use when behind a proxy service such as nginx'\r\n\r\nListening interfaces are provided to `SocketHttpServer` using the `expose()` method. The `RequestHandler` and `ErrorHandler` instances are not provided to the constructor, instead being provided to the `SocketHttpServer::start()` method. As these objects are provided after constructing the `HttpServer` instance, `RequestHandlers` may now require an instance of `HttpServer` in their constructors to attach start and stop handlers.\r\n\r\n`SocketServer` instances are then created by `SocketHttpServer` using an instance of `SocketServerFactory` passed to the constructor. This allows server bind contexts to be initialized based on the provided (or default) `HttpDriverFactory`.\r\n\r\nBelow is the *\"Hello, World!\"* example from [examples\/hello-world.php](https:\/\/github.com\/amphp\/http-server\/blob\/beceef626b49115a7b47ee27740137571fef329f\/examples\/hello-world.php) as an example of initializing a `SocketHttpServer` instance.\r\n\r\n```php\r\nwithTlsContext((new Socket\\ServerTlsContext)\r\n ->withDefaultCertificate($cert));\r\n\r\n$logHandler = new StreamHandler(ByteStream\\getStdout());\r\n$logHandler->pushProcessor(new PsrLogMessageProcessor());\r\n$logHandler->setFormatter(new ConsoleFormatter());\r\n$logger = new Logger('server');\r\n$logger->pushHandler($logHandler);\r\n$logger->useLoggingLoopDetection(false);\r\n\r\n$server = new SocketHttpServer(\r\n $logger,\r\n new Socket\\ResourceServerSocketFactory(),\r\n new SocketClientFactory($logger),\r\n);\r\n\r\n$server->expose(\"0.0.0.0:1337\");\r\n$server->expose(\"[::]:1337\");\r\n$server->expose(\"0.0.0.0:1338\", $context);\r\n$server->expose(\"[::]:1338\", $context);\r\n\r\n$server->start(new class implements RequestHandler {\r\n public function handleRequest(Request $request): Response\r\n {\r\n return new Response(\r\n status: HttpStatus::OK,\r\n headers: [\"content-type\" => \"text\/plain; charset=utf-8\"],\r\n body: \"Hello, World!\",\r\n );\r\n }\r\n}, new DefaultErrorHandler());\r\n\r\n\/\/ Await a termination signal to be received.\r\n$signal = trapSignal([SIGHUP, SIGINT, SIGQUIT, SIGTERM]);\r\n\r\n$logger->info(sprintf(\"Received signal %d, stopping HTTP server\", $signal));\r\n\r\n$server->stop();\r\n```\r\n\r\n### New Middlewares\r\n\r\n- Added `ConcurrencyLimitingMiddleware` to limit the number of requests which may be concurrently handled by the server.\r\n- Added `ForwardedMiddleware` and associated `Forwarded` class and `ForwardedHeaderType` enum. This middleware parses either `Forwarded` or `X-Forwarded-For` headers to determine the original client address when used behind a proxy supporting these headers.\r\n- Added `AllowedMethodsMiddleware` which limits the allowed HTTP verbs used by requests. This middleware is used automatically by `SocketHttpServer`. The allowed methods can be specified through a constructor parameter, using null to disable the middleware.\r\n\r\n### HTTP Drivers\r\n\r\nGenerally consumers of this library need not worry about these changes unless they implemented their own HTTP driver or interacted with the `Client` interface beyond grabbing client metadata.\r\n\r\n- `Client` is a significantly thinner interface, consisting of only metadata about the client connection.\r\n- - `HttpDriver` instances now handle responding to requests instead of the `Client` object.\r\n- `HttpDriver::setup()` has been replaced with `HttpDriver::handleClient`. Rather than returning a Generator parser which is fed data read from the client, this method is instead expected to read\/write data from the provided streams itself.\r\n- `HttpDriver::write()` has been removed, as writing to the client should be handled internally within the driver.","revolt":true},{"name":"amphp\/file 3.0.1","package":"amphp\/file","tag_name":"v3.0.1","html_url":"https:\/\/github.com\/amphp\/file\/releases\/tag\/v3.0.1","date":"2023-07-23T19:04:03Z","body":"## What's Changed\r\n\r\n* Fix `touch()` on non-existent files in ext-uv and ext-eio by @kelunik (#73)\r\n* Fix `write()` truncation with ext-uv and ext-eio by @danog in (#76)\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/file\/compare\/v3.0.0...v3.0.1","revolt":true},{"name":"amphp\/parallel 2.2.1","package":"amphp\/parallel","tag_name":"v2.2.1","html_url":"https:\/\/github.com\/amphp\/parallel\/releases\/tag\/v2.2.1","date":"2023-05-22T04:16:45Z","body":"- Fixed simultaneous creation of workers in `ContextWorkerPool`.\r\n- Fixed the IPC pipe in `ProcessContext` closing immediately after the process exited which potentially prevented reading the last sent data.","revolt":true},{"name":"amphp\/http 2.0.0","package":"amphp\/http","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/http\/releases\/tag\/v2.0.0","date":"2023-04-12T19:28:59Z","body":"- PHP 8.1 is now required\r\n- Renamed `Status` and `Message` to `HttpStatus` and `HttpMessage` respectively\r\n- Added a message parameter to `Http2Processor::handleShutdown()`\r\n- `Http2Parser` constructor now requires an `HPack` instance to be injected, as well as providing parameters for upgrade settings, header size limit, and frame size limits\r\n- `Http2Parser::parse()` was removed; `Http2Parser` now has a `push()` and `cancel()` methods to push received data and end parsing\r\n- Added `HttpRequest` and `HttpResponse` as abstract base classes for requests and responses\r\n- `HttpRequest` now includes methods for getting and setting query parameters\r\n- Moved `Rfc7230` to `Http1` sub-namespace.\r\n- Renamed header methods using the term \"raw\" to use \"pairs\" instead, e.g., `getRawHeaders()` \u2192 `getHeaderPairs()`, `parseRawHeaders()` \u2192 `parseHeaderPairs()`\r\n- Added `mapHeaderPairs()` function to convert header pairs returned from functions such as `Rfc7230::parseHeaderPairs()` into a map similar to that returned by `Rfc7230::parseHeaders()`\r\n- Passing an `int`, `float`, or `Stringable` as an array value to `HttpMessage::setHeaders()` will cast the value to a string instead of throwing a `TypeError`\r\n- Removed `parseFieldValueComponents()` and `createFieldValueComponentMap()`, replacing them with four new functions:\r\n - `splitHeaders()` \u2014 Splits comma-separated fields into individual components. Returns null if a syntax error is encountered.\r\n - `parseMultipleHeaderFields()` \u2014 Parses a list of key-value pairs from each comma-separated and semi-colon delineated header value. Returns null if a syntax error is encountered.\r\n - `parseSingleHeaderFields()` \u2014 Parses a single semi-colon delineated header into key-value pairs.\r\n - `parseHeaderTokens()` \u2014 Parses a list of tokens from comma-separated header values.","revolt":true},{"name":"amphp\/socket 2.1.0","package":"amphp\/socket","tag_name":"v2.1.0","html_url":"https:\/\/github.com\/amphp\/socket\/releases\/tag\/v2.1.0","date":"2023-04-08T09:17:09Z","body":"## What's Changed\r\n\r\n* Added `InternetAddress::tryFromString()` by @trowski in https:\/\/github.com\/amphp\/socket\/pull\/105\r\n* Added `CidrMatcher` by @kelunik\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/socket\/compare\/v2.0.0...v2.1.0","revolt":true},{"name":"amphp\/redis 1.1.1","package":"amphp\/redis","tag_name":"v1.1.1","html_url":"https:\/\/github.com\/amphp\/redis\/releases\/tag\/v1.1.1","date":"2023-03-25T15:07:52Z","body":"- Fix deprecated string interpolation style","revolt":false},{"name":"amphp\/http-server-session 2.0.1","package":"amphp\/http-server-session","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/http-server-session\/releases\/tag\/v2.0.1","date":"2023-03-25T15:01:24Z","body":"- Fix deprecated string interpolation style","revolt":false},{"name":"amphp\/byte-stream 2.0.1","package":"amphp\/byte-stream","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/byte-stream\/releases\/tag\/v2.0.1","date":"2023-02-03T04:11:49Z","body":"- Fixed `ReadableResourceStream` calling `Suspension::resume()` when destroyed, which could throw an exception when suspending from `{main}` and an uncaught exception was thrown from the event loop.","revolt":true},{"name":"amphp\/dns 2.0.1","package":"amphp\/dns","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/dns\/releases\/tag\/v2.0.1","date":"2023-01-21T16:08:27Z","body":"## What's Changed\r\n\r\n* Fix fallback to blocking resolver by @danog and @kelunik in https:\/\/github.com\/amphp\/dns\/pull\/108 and https:\/\/github.com\/amphp\/dns\/pull\/109\r\n* Try entire search list when resolve type is restricted by @trowski: [`9d988e31`](https:\/\/github.com\/amphp\/dns\/commit\/9d988e3127dc233210a5336baf329d58a294bcb9)\r\n* Improve static analysis with more specific DnsResolver return types by @trowski: [`7344cceb`](https:\/\/github.com\/amphp\/dns\/commit\/7344cceb95d6e66bf8c867e0b50417ced4b055d8)\r\n\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/dns\/compare\/v2.0.0...v2.0.1","revolt":true},{"name":"amphp\/windows-registry 1.0.0","package":"amphp\/windows-registry","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/windows-registry\/releases\/tag\/v1.0.0","date":"2023-01-10T20:34:04Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\n- `WindowsRegistry` offers the methods as static methods now instead of instance methods.","revolt":true},{"name":"amphp\/cache 2.0.0","package":"amphp\/cache","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/cache\/releases\/tag\/v2.0.0","date":"2023-01-09T21:07:48Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\n - Renamed `ArrayCache` to `LocalCache`, swapping the constructor argument order\r\n - Modified `LocalCache` to implement `IteratorAggregate` and `Countable`, acting as an LRU cache now (#20)\r\n - Support arbitrary values in `LocalCache`, `NullCache`, and `PrefixCache`\r\n - Changed `Cache` to support arbitrary values\r\n - Introduced separate `StringCache` interface for caching only strings\r\n - Added `StringCacheAdapter` to use any `Cache` in place of a `StringCache`\r\n - Removed `FileCache` (will be available in `amphp\/file` instead)","revolt":true},{"name":"amphp\/postgres 1.4.5","package":"amphp\/postgres","tag_name":"v1.4.5","html_url":"https:\/\/github.com\/amphp\/postgres\/releases\/tag\/v1.4.5","date":"2023-01-07T18:54:57Z","body":"- Fixed cancelling an active query if a connection is closed when using `ext-pgsql` (#54)","revolt":false},{"name":"amphp\/sql-common 1.1.4","package":"amphp\/sql-common","tag_name":"v1.1.4","html_url":"https:\/\/github.com\/amphp\/sql-common\/releases\/tag\/v1.1.4","date":"2023-01-06T04:33:14Z","body":"- Fixed potential double deferred resolve when a connection pool is full.","revolt":false},{"name":"amphp\/sync 2.0.0","package":"amphp\/sync","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/sync\/releases\/tag\/v2.0.0","date":"2022-12-30T23:05:19Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\n#### Changes from 1.x\r\n - `ConcurrentIterator` functions have been removed are now available as methods on `Pipeline` in `amphp\/pipeline`\r\n - `FileMutex` has been removed, as a better implementation ships as part of `amphp\/file`\r\n - Removed `ThreadedMutex` and `ThreadedSemaphore`\r\n - Removed `Lock::getId()`\r\n - `Barrier::await` supports cancellation now\r\n - `synchronized` accepts any `Semaphore` now instead of a `Mutex` only\r\n - Added `Channel` from `amphp\/parallel`, which allows two way communicate between execution contexts, such as two coroutines or two processes. `Channel` has been modified to extend `Closable`\r\n- Also added `Parcel` from `amphp\/parallel`, which allows sharing a value across execution contexts with mutually-exclusive access to modifying that value using `Parcel::synchronized()`.\r\n- Added `createChannelPair()` function which returns a pair of connected `Channel` objects.\r\n- Added `RateLimitingSemaphore` which releases locks after a given time elapses.\r\n- Added `StaticKeySemaphore`, analogous to `StaticKeyMutex`\r\n\r\n#### Changes from 2.0.0 Beta 6\r\n- Added `RateLimitingSemaphore` which releases locks after a given time elapses.\r\n- Added `StaticKeySemaphore`, analogous to `StaticKeyMutex`","revolt":true},{"name":"amphp\/parser 1.1.0","package":"amphp\/parser","tag_name":"v1.1.0","html_url":"https:\/\/github.com\/amphp\/parser\/releases\/tag\/v1.1.0","date":"2022-12-30T19:26:39Z","body":"- PHP 7.4 now required\r\n- Improved performance of the parser when requesting small chunks of data and when yielding an integer length delimiter","revolt":true},{"name":"amphp\/pipeline 1.0.0","package":"amphp\/pipeline","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/pipeline\/releases\/tag\/v1.0.0","date":"2022-12-23T16:56:59Z","body":"Initial stable release 🎉\r\n\r\n#### Changes from 1.0.0 Beta 7\r\n- Marked `ConcurrentArrayIterator`, `ConcurrentChainedIterator`, and `ConcurrentIterableIterator` as `@internal`. Instead of these classes, use `Pipeline::fromIterable()` or `Pipeline::concat()`\r\n- `Pipeline::concat()` now accepts an array of any `iterable`, not only other `Pipeline` objects","revolt":true},{"name":"amphp\/sql 1.0.2","package":"amphp\/sql","tag_name":"v1.0.2","html_url":"https:\/\/github.com\/amphp\/sql\/releases\/tag\/v1.0.2","date":"2022-12-18T23:03:07Z","body":"- Fix a deprecation notice on PHP 8.1 if a configuration key does not have a value.","revolt":false},{"name":"amphp\/phpunit-util 3.0.0","package":"amphp\/phpunit-util","tag_name":"v3.0.0","html_url":"https:\/\/github.com\/amphp\/phpunit-util\/releases\/tag\/v3.0.0","date":"2022-12-18T17:53:05Z","body":"This package has been redesigned for compatibility with AMPHP v3 and fibers. `AsyncTestCase` serves a similar purpose as before, providing helper methods for unit testing within an async context. Each test case is run within a unique fiber to allow suspending during the test run.\r\n\r\n- `AsyncTestCase::setUpAsync()` and `tearDownAsync()` have been removed. Use `AsyncTestCase::setUp()` and `tearDown()` instead, as both of these methods are now able to execute async using fibers.\r\n- `AsyncTestCase::createCallback()` now returns a `Closure`. Additionally, an optional parameter for expected arguments upon invocation have been added (uses `InvocationMocker::with(...)` to set expected arguments).","revolt":true},{"name":"amphp\/amp 3.0.0","package":"amphp\/amp","tag_name":"v3.0.0","html_url":"https:\/\/github.com\/amphp\/amp\/releases\/tag\/v3.0.0","date":"2022-12-18T17:13:34Z","body":"\r\n#### Event Loop\r\n\r\nAmp no longer ships its own event loop. It's now based on [Revolt](https:\/\/revolt.run). `Revolt\\EventLoop` is quite similar to Amp's previous `Amp\\Loop`. A very important difference is using `float $seconds` instead of `int $milliseconds` for timers though!\r\n\r\n#### Promises\r\n\r\n`Future` is a replacement for the previous `Promise`.\r\nThere's no need for callbacks or `yield` anymore!\r\nIts `await()` method is based on fibers and replaces generator based coroutines \/ `Amp\\Promise\\wait()`.\r\n\r\n- Renamed `Amp\\Deferred` to `Amp\\DeferredFuture`.\r\n- Removed `Amp\\Promise\\wait()`: Use `Amp\\Future::await()` instead, which can be called in any (nested) context unlike before.\r\n- Removed `Amp\\call()`: Remove the passed closure boilerplate and all `yield` keywords, interruption is handled via fibers now instead of generator coroutines.\r\n- Removed `Amp\\asyncCall()`: Replace invocations with `Amp\\async()`, which starts a new fiber instead of using generators.\r\n- Removed `Amp\\coroutine()`: There's no direct replacement.\r\n- Removed `Amp\\asyncCoroutine()`: There's no direct replacement.\r\n- Removed `Amp\\Promise\\timeout()`: `Future::await()` accepts an optional `Cancellation`, which can be used as a replacement.\r\n- Removed `Amp\\Promise\\rethrow()`: Unhandled errors are now automatically thrown into the event loop, so there's no need for that function anymore.\r\n- Unhandled errors can be ignored using `Future::ignore()` if needed, but should usually be handled in some way.\r\n- Removed `Amp\\Promise\\wrap()`: Use `Future::finally()` instead.\r\n- Renamed `Amp\\getCurrentTime()` to `Amp\\now()` returning the time in seconds instead of milliseconds.\r\n- Changed `Amp\\delay()` to accept the delay in seconds now instead of milliseconds.\r\n- Added `Amp\\weakClosure()` to allow a class to hold a self-referencing Closure without creating a circular reference that prevents automatic garbage collection.\r\n- Added `Amp\\trapSignal()` to await one or multiple signals.\r\n\r\n#### Promise Combinators\r\n\r\nPromise combinators have been renamed:\r\n\r\n- `Amp\\Promise\\race()` has been renamed to `Amp\\Future\\awaitFirst()`\r\n- `Amp\\Promise\\first()` has been renamed to `Amp\\Future\\awaitAny()`\r\n- `Amp\\Promise\\some()` has been renamed to `Amp\\Future\\awaitAnyN()`\r\n- `Amp\\Promise\\any()` has been renamed to `Amp\\Future\\awaitAll()`\r\n- `Amp\\Promise\\all()` has been renamed to `Amp\\Future\\await()`\r\n\r\n#### CancellationToken\r\n\r\n- `CancellationToken` has been renamed to `Cancellation`.\r\n- `CancellationTokenSource` has been renamed to `DeferredCancellation`.\r\n- `NullCancellationToken` has been renamed to `NullCancellation`.\r\n- `TimeoutCancellationToken` has been renamed to `TimeoutCancellation`.\r\n- `CombinedCancellationToken` has been renamed to `CompositeCancellation`.\r\n- `SignalCancellation` has been added.\r\n\r\n#### Iterators\r\n\r\nIterators have been removed from `amphp\/amp` as normal PHP iterators can be used with fibers now and there's no need for a separate API.\r\nHowever, there's still some need for _concurrent_ iterators, which is covered by the new [`amphp\/pipeline`](https:\/\/github.com\/amphp\/pipeline) library now.\r\n\r\n#### Closable\r\n\r\n`Amp\\Closable` has been added as a new basic interface for closable resources such as streams or sockets.\r\n\r\n#### Strict Types\r\n\r\nStrict types now declared in all library files.\r\nThis will affect callbacks invoked within this library's code which use scalar types as parameters.\r\nFunctions used with `Amp\\async()` are the most likely to be affected by this change \u2014 these functions will now be invoked within a strict-types context.","revolt":true},{"name":"amphp\/php-cs-fixer-config 2.0.0","package":"amphp\/php-cs-fixer-config","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/php-cs-fixer-config\/releases\/tag\/v2.0.0","date":"2022-12-18T15:51:30Z","body":" - Common code style for all packages based on Amp v3.\r\n - Now includes `strict_types` and several other minor updates.","revolt":true},{"name":"amphp\/http-server-form-parser 1.1.5","package":"amphp\/http-server-form-parser","tag_name":"v1.1.5","html_url":"https:\/\/github.com\/amphp\/http-server-form-parser\/releases\/tag\/v1.1.5","date":"2022-04-30T15:16:52Z","body":"- Added methods `parseBody`, `parseUrlEncodedBody`, and `parseMultipartBody` to `BufferingParser` to parse request bodies that have already been buffered (#10)\r\n- Added `parseContentBoundary` function that returns the content boundary from a multipart header.","revolt":false},{"name":"amphp\/websocket 1.0.3","package":"amphp\/websocket","tag_name":"v1.0.3","html_url":"https:\/\/github.com\/amphp\/websocket\/releases\/tag\/v1.0.3","date":"2022-04-11T23:50:33Z","body":"- Added `GOING_AWAY` to the list of normal close codes, which will cause `Client::receive()` to return null instead of throwing an exception if a browser sends this code when navigating away from a page\r\n- Fixed undefined array access in rare case where the event loop is exited after receiving a message on the websocket and then re-entered at a later time (amphp\/websocket-client#39)","revolt":false},{"name":"amphp\/http-server-static-content 1.0.7","package":"amphp\/http-server-static-content","tag_name":"v1.0.7","html_url":"https:\/\/github.com\/amphp\/http-server-static-content\/releases\/tag\/v1.0.7","date":"2022-04-10T14:49:03Z","body":"- Compatibility with `amphp\/file` @ `2.x`","revolt":false},{"name":"amphp\/websocket-client 1.0.1","package":"amphp\/websocket-client","tag_name":"v1.0.1","html_url":"https:\/\/github.com\/amphp\/websocket-client\/releases\/tag\/v1.0.1","date":"2022-03-10T20:11:00Z","body":" - Ignore `\/docs` in `.gitattributes` to avoid broken symlink (#38)\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/websocket-client\/compare\/v1.0.0...v1.0.1","revolt":false},{"name":"amphp\/parallel-functions 1.1.0","package":"amphp\/parallel-functions","tag_name":"v1.1.0","html_url":"https:\/\/github.com\/amphp\/parallel-functions\/releases\/tag\/v1.1.0","date":"2022-02-03T19:56:18Z","body":"## What's Changed\r\n - Update to `laravel\/serializable-closure` instead of `opis\/closure` by @owenvoke\r\n - Increase minimum PHP version to PHP 7.4 by @owenvoke\r\n\r\n## New Contributors\r\n* @sci3ma made their first contribution in https:\/\/github.com\/amphp\/parallel-functions\/pull\/24\r\n* @owenvoke made their first contribution in https:\/\/github.com\/amphp\/parallel-functions\/pull\/31\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/parallel-functions\/compare\/v1.0.0...v1.1.0","revolt":false},{"name":"amphp\/rpc 1.0.0","package":"amphp\/rpc","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/rpc\/releases\/tag\/v1.0.0","date":"2022-02-02T22:13:33Z","body":"Initial release.","revolt":false},{"name":"amphp\/cluster 1.0.1","package":"amphp\/cluster","tag_name":"v1.0.1","html_url":"https:\/\/github.com\/amphp\/cluster\/releases\/tag\/v1.0.1","date":"2021-12-14T00:48:53Z","body":"Update to use [`amphp\/file`](https:\/\/github.com\/amphp\/file) `v2.x`.","revolt":false},{"name":"amphp\/mysql 2.1.2","package":"amphp\/mysql","tag_name":"v2.1.2","html_url":"https:\/\/github.com\/amphp\/mysql\/releases\/tag\/v2.1.2","date":"2021-12-05T16:42:20Z","body":"- Fixed a bug when decoding a JSON field (#113)","revolt":false},{"name":"amphp\/http-client-cookies 1.2.0","package":"amphp\/http-client-cookies","tag_name":"v1.2.0","html_url":"https:\/\/github.com\/amphp\/http-client-cookies\/releases\/tag\/v1.2.0","date":"2021-10-21T20:59:11Z","body":" - Added compatibility with `amphp\/file` v2\r\n - Updated public suffix list","revolt":false},{"name":"amphp\/http-client 4.6.2","package":"amphp\/http-client","tag_name":"v4.6.2","html_url":"https:\/\/github.com\/amphp\/http-client\/releases\/tag\/v4.6.2","date":"2021-10-09T14:13:49Z","body":"- Fixed `setBodySizeLimit(0)` with HTTP\/2 protocol (#297)","revolt":false},{"name":"amphp\/beanstalk 0.3.2","package":"amphp\/beanstalk","tag_name":"v0.3.2","html_url":"https:\/\/github.com\/amphp\/beanstalk\/releases\/tag\/v0.3.2","date":"2020-11-18T18:43:53Z","body":" - Added support for Symfony YAML library v4 and v5. (#34)\r\n","revolt":false},{"name":"amphp\/websocket-server 2.0.0","package":"amphp\/websocket-server","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/websocket-server\/releases\/tag\/v2.0.0","date":"2020-07-05T17:52:19Z","body":"### Changes since RC3\r\n\r\n- Renamed `Endpoint` to `Gateway`. An alias to `Endpoint` is provided for compatibility.\r\n- Renamed `WebsocketObserver` to `WebsocketServerObserver`.\r\n\r\n### Upgrading from v1.x to v2.0\r\n\r\nThis library has been refactored to use the new [`amphp\/websocket`](https:\/\/github.com\/amphp\/websocket) library containing components that can be shared between server and clients.\r\n\r\n`Websocket` is now a final class that requires an instance of `ClientHandler`, which has two methods to handle client handshakes and the client connection.\r\n- `handleHandshake()`: This method is invoked when a WebSocket connection attempt is made. The application may alter the given Response to deny the connection attempt or set application-specific headers.\r\n- `handleClient()`: This method is invoked upon a successful WebSocket connection. This method should use a loop to receive messages from the WebSocket connection.\r\n\r\n```php\r\nuse Amp\\Http\\Server\\Request;\r\nuse Amp\\Http\\Server\\Response;\r\nuse Amp\\Http\\Status;\r\nuse Amp\\Success;\r\nuse Amp\\Websocket\\Client;\r\nuse Amp\\Websocket\\Server\\ClientHandler;\r\nuse Amp\\Websocket\\Server\\Gateway;\r\nuse Amp\\Websocket\\Server\\Websocket;\r\n\r\n$websocket = new Websocket(new class implements ClientHandler {\r\n public function handleHandshake(Gateway $gateway, Request $request, Response $response): Promise\r\n {\r\n if (!\\in_array($request->getHeader('origin'), ['http:\/\/localhost:1337', 'http:\/\/127.0.0.1:1337', 'http:\/\/[::1]:1337'], true)) {\r\n return $gateway->getErrorHandler()->handleError(Status::FORBIDDEN, 'Origin forbidden', $request);\r\n }\r\n\r\n return new Success($response);\r\n }\r\n\r\n public function handleClient(Gateway $gateway, Client $client, Request $request, Response $response): Promise\r\n {\r\n return Amp\\call(function () use ($gateway, $client) {\r\n while ($message = yield $client->receive()) {\r\n \\assert($message instanceof Message);\r\n $gateway->broadcast(\\sprintf('%d: %s', $client->getId(), yield $message->buffer()));\r\n }\r\n });\r\n }\r\n});\r\n```\r\n\r\nWebSocket clients are now represented by a [`Client`](https:\/\/github.com\/amphp\/websocket\/blob\/v1.0.0\/src\/Client.php) object. This object contains several methods for getting information about the client and for sending messages to a single client.\r\n\r\nServers can send to multiple clients using `Gateway::broadcast()` and `Gateway::multicast()` (plus binary versions, `Gateway::broadcastBinary()` and `Gateway::multicastBinary()`). A `Gateway` instance is provided to `ClientHandler::handleHandshake()` and `ClientHandler::handleClient()`.\r\n","revolt":false},{"name":"amphp\/serialization 1.0.0","package":"amphp\/serialization","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/serialization\/releases\/tag\/v1.0.0","date":"2020-03-28T14:03:14Z","body":"Initial release.","revolt":true},{"name":"amphp\/http-tunnel 1.0.0","package":"amphp\/http-tunnel","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/http-tunnel\/releases\/tag\/v1.0.0","date":"2019-12-31T17:10:50Z","body":"Initial release.","revolt":false},{"name":"amphp\/http-client-cache 1.0.0","package":"amphp\/http-client-cache","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/http-client-cache\/releases\/tag\/v1.0.0","date":"2019-12-21T19:52:55Z","body":"Initial release.","revolt":false},{"name":"amphp\/react-adapter 2.1.0","package":"amphp\/react-adapter","tag_name":"v2.1.0","html_url":"https:\/\/github.com\/amphp\/react-adapter\/releases\/tag\/v2.1.0","date":"2019-11-04T22:20:56Z","body":" - `React\\EventLoop\\Factory` is now automatically replaced with another implementation that throws on each usage to prevent two loops existing concurrently by accident.\r\n Set `AMP_REACT_ADAPTER_DISABLE_FACTORY_OVERRIDE=1` as environment variable or constant to disable this protection.","revolt":false},{"name":"amphp\/react-stream-adapter 0.1.0","package":"amphp\/react-stream-adapter","tag_name":"v0.1.0","html_url":"https:\/\/github.com\/amphp\/react-stream-adapter\/releases\/tag\/v0.1.0","date":"2018-03-07T10:13:55Z","body":"Initial release.","revolt":false}] \ No newline at end of file +[{"name":"amphp\/hpack 3.1.5","package":"amphp\/hpack","tag_name":"v3.1.5","html_url":"https:\/\/github.com\/amphp\/hpack\/releases\/tag\/v3.1.5","date":"2023-08-15T19:32:48Z","body":" - Fixed decoding headers if FFI is enabled\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/hpack\/compare\/v3.1.4...v3.1.5","revolt":true},{"name":"amphp\/http-server-router 2.0.0","package":"amphp\/http-server-router","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/http-server-router\/releases\/tag\/v2.0.0","date":"2023-08-05T19:33:16Z","body":"This release is compatible with `amphp\/http-server@^3`.\r\n\r\n - A PSR-3 logger is now required in the `Router` constructor\r\n - Starting the server with an empty `Router` is now allowed and only logs a notice instead of throwing an exception\r\n - Middleware can be added via `addMiddleware()` instead of `stack()`\r\n - Removed support for adding middleware directly via `addRoute()`, use `stackMiddleware()` instead if you need this\r\n - Removed `Router::onStart()`, as it's now internally registered\r\n - Removed support for `ServerObserver`, as it's been removed from `amphp\/http-server`","revolt":true},{"name":"amphp\/log 2.0.0","package":"amphp\/log","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/log\/releases\/tag\/v2.0.0","date":"2023-08-05T19:05:50Z","body":"- Increased minimum PHP version to 8.1\r\n- Make use of fibers with Amp v3 and Revolt\r\n- Added support for Monolog v3.x\r\n\r\nThis release does not contain any changes in comparison to `v2.0.0-beta.2`.","revolt":true},{"name":"amphp\/process 2.0.1","package":"amphp\/process","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/process\/releases\/tag\/v2.0.1","date":"2023-07-31T17:56:29Z","body":"- Fixed error handling if the started process fails immediately.\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/process\/compare\/v2.0.0...v2.0.1","revolt":true},{"name":"amphp\/http-server 3.0.0","package":"amphp\/http-server","tag_name":"v3.0.0","html_url":"https:\/\/github.com\/amphp\/http-server\/releases\/tag\/v3.0.0","date":"2023-07-31T16:06:03Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\nThe `RequestHandler` and `Middleware` interfaces along with the `Request` and `Response` objects are largely unchanged with the exception of replacing `Promise` objects with the resolution type.\r\n\r\n- The return type of `RequestHandler::handleRequest()` and `Middleware::handleRequest()` has changed from `Promise` to `Response`.\r\n- Request and response bodies must be an instance of `ReadableStream` or a string (note the interface name change in `amphp\/byte-stream`). `null` will no longer be cast to an empty body.\r\n\r\n### Creating an HTTP Server\r\n\r\nInitializing a server has changed significantly.\r\n\r\nThe `Options` object has been removed, replaced by constructor parameters on various components. PHP 8.0's named parameters allows only defining the parameters you wish to override without the need to define those you do not wish to change.\r\n\r\n`HttpServer` is now an interface. `ServerObserver` has been removed and replaced with `onStart()` and `onStop()` methods on the `HttpServer` interface. `SocketHttpServer` is the provided default implementation of `HttpServer`. The methods `getLogger()`, `getRequestHandler()`, and `getErrorHandler()` are no longer part of `HttpServer` to avoid the interface being used as a service-locator.\r\n\r\nIn addition to the constructor, `SocketHttpServer` provides two convenience static constructors for common use-cases.\r\n - `createForDirectAccess()` \u2014\u00a0Creates an instance appropriate for direct access by the public \r\n - `createForBehindProxy()` \u2014 Creates an instance appropriate for use when behind a proxy service such as nginx'\r\n\r\nListening interfaces are provided to `SocketHttpServer` using the `expose()` method. The `RequestHandler` and `ErrorHandler` instances are not provided to the constructor, instead being provided to the `SocketHttpServer::start()` method. As these objects are provided after constructing the `HttpServer` instance, `RequestHandlers` may now require an instance of `HttpServer` in their constructors to attach start and stop handlers.\r\n\r\n`SocketServer` instances are then created by `SocketHttpServer` using an instance of `SocketServerFactory` passed to the constructor. This allows server bind contexts to be initialized based on the provided (or default) `HttpDriverFactory`.\r\n\r\nBelow is the *\"Hello, World!\"* example from [examples\/hello-world.php](https:\/\/github.com\/amphp\/http-server\/blob\/beceef626b49115a7b47ee27740137571fef329f\/examples\/hello-world.php) as an example of initializing a `SocketHttpServer` instance.\r\n\r\n```php\r\nwithTlsContext((new Socket\\ServerTlsContext)\r\n ->withDefaultCertificate($cert));\r\n\r\n$logHandler = new StreamHandler(ByteStream\\getStdout());\r\n$logHandler->pushProcessor(new PsrLogMessageProcessor());\r\n$logHandler->setFormatter(new ConsoleFormatter());\r\n$logger = new Logger('server');\r\n$logger->pushHandler($logHandler);\r\n$logger->useLoggingLoopDetection(false);\r\n\r\n$server = new SocketHttpServer(\r\n $logger,\r\n new Socket\\ResourceServerSocketFactory(),\r\n new SocketClientFactory($logger),\r\n);\r\n\r\n$server->expose(\"0.0.0.0:1337\");\r\n$server->expose(\"[::]:1337\");\r\n$server->expose(\"0.0.0.0:1338\", $context);\r\n$server->expose(\"[::]:1338\", $context);\r\n\r\n$server->start(new class implements RequestHandler {\r\n public function handleRequest(Request $request): Response\r\n {\r\n return new Response(\r\n status: HttpStatus::OK,\r\n headers: [\"content-type\" => \"text\/plain; charset=utf-8\"],\r\n body: \"Hello, World!\",\r\n );\r\n }\r\n}, new DefaultErrorHandler());\r\n\r\n\/\/ Await a termination signal to be received.\r\n$signal = trapSignal([SIGHUP, SIGINT, SIGQUIT, SIGTERM]);\r\n\r\n$logger->info(sprintf(\"Received signal %d, stopping HTTP server\", $signal));\r\n\r\n$server->stop();\r\n```\r\n\r\n### New Middlewares\r\n\r\n- Added `ConcurrencyLimitingMiddleware` to limit the number of requests which may be concurrently handled by the server.\r\n- Added `ForwardedMiddleware` and associated `Forwarded` class and `ForwardedHeaderType` enum. This middleware parses either `Forwarded` or `X-Forwarded-For` headers to determine the original client address when used behind a proxy supporting these headers.\r\n- Added `AllowedMethodsMiddleware` which limits the allowed HTTP verbs used by requests. This middleware is used automatically by `SocketHttpServer`. The allowed methods can be specified through a constructor parameter, using null to disable the middleware.\r\n\r\n### HTTP Drivers\r\n\r\nGenerally consumers of this library need not worry about these changes unless they implemented their own HTTP driver or interacted with the `Client` interface beyond grabbing client metadata.\r\n\r\n- `Client` is a significantly thinner interface, consisting of only metadata about the client connection.\r\n- - `HttpDriver` instances now handle responding to requests instead of the `Client` object.\r\n- `HttpDriver::setup()` has been replaced with `HttpDriver::handleClient`. Rather than returning a Generator parser which is fed data read from the client, this method is instead expected to read\/write data from the provided streams itself.\r\n- `HttpDriver::write()` has been removed, as writing to the client should be handled internally within the driver.","revolt":true},{"name":"amphp\/file 3.0.1","package":"amphp\/file","tag_name":"v3.0.1","html_url":"https:\/\/github.com\/amphp\/file\/releases\/tag\/v3.0.1","date":"2023-07-23T19:04:03Z","body":"## What's Changed\r\n\r\n* Fix `touch()` on non-existent files in ext-uv and ext-eio by @kelunik (#73)\r\n* Fix `write()` truncation with ext-uv and ext-eio by @danog in (#76)\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/file\/compare\/v3.0.0...v3.0.1","revolt":true},{"name":"amphp\/parallel 2.2.1","package":"amphp\/parallel","tag_name":"v2.2.1","html_url":"https:\/\/github.com\/amphp\/parallel\/releases\/tag\/v2.2.1","date":"2023-05-22T04:16:45Z","body":"- Fixed simultaneous creation of workers in `ContextWorkerPool`.\r\n- Fixed the IPC pipe in `ProcessContext` closing immediately after the process exited which potentially prevented reading the last sent data.","revolt":true},{"name":"amphp\/http 2.0.0","package":"amphp\/http","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/http\/releases\/tag\/v2.0.0","date":"2023-04-12T19:28:59Z","body":"- PHP 8.1 is now required\r\n- Renamed `Status` and `Message` to `HttpStatus` and `HttpMessage` respectively\r\n- Added a message parameter to `Http2Processor::handleShutdown()`\r\n- `Http2Parser` constructor now requires an `HPack` instance to be injected, as well as providing parameters for upgrade settings, header size limit, and frame size limits\r\n- `Http2Parser::parse()` was removed; `Http2Parser` now has a `push()` and `cancel()` methods to push received data and end parsing\r\n- Added `HttpRequest` and `HttpResponse` as abstract base classes for requests and responses\r\n- `HttpRequest` now includes methods for getting and setting query parameters\r\n- Moved `Rfc7230` to `Http1` sub-namespace.\r\n- Renamed header methods using the term \"raw\" to use \"pairs\" instead, e.g., `getRawHeaders()` \u2192 `getHeaderPairs()`, `parseRawHeaders()` \u2192 `parseHeaderPairs()`\r\n- Added `mapHeaderPairs()` function to convert header pairs returned from functions such as `Rfc7230::parseHeaderPairs()` into a map similar to that returned by `Rfc7230::parseHeaders()`\r\n- Passing an `int`, `float`, or `Stringable` as an array value to `HttpMessage::setHeaders()` will cast the value to a string instead of throwing a `TypeError`\r\n- Removed `parseFieldValueComponents()` and `createFieldValueComponentMap()`, replacing them with four new functions:\r\n - `splitHeaders()` \u2014 Splits comma-separated fields into individual components. Returns null if a syntax error is encountered.\r\n - `parseMultipleHeaderFields()` \u2014 Parses a list of key-value pairs from each comma-separated and semi-colon delineated header value. Returns null if a syntax error is encountered.\r\n - `parseSingleHeaderFields()` \u2014 Parses a single semi-colon delineated header into key-value pairs.\r\n - `parseHeaderTokens()` \u2014 Parses a list of tokens from comma-separated header values.","revolt":true},{"name":"amphp\/socket 2.1.0","package":"amphp\/socket","tag_name":"v2.1.0","html_url":"https:\/\/github.com\/amphp\/socket\/releases\/tag\/v2.1.0","date":"2023-04-08T09:17:09Z","body":"## What's Changed\r\n\r\n* Added `InternetAddress::tryFromString()` by @trowski in https:\/\/github.com\/amphp\/socket\/pull\/105\r\n* Added `CidrMatcher` by @kelunik\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/socket\/compare\/v2.0.0...v2.1.0","revolt":true},{"name":"amphp\/redis 1.1.1","package":"amphp\/redis","tag_name":"v1.1.1","html_url":"https:\/\/github.com\/amphp\/redis\/releases\/tag\/v1.1.1","date":"2023-03-25T15:07:52Z","body":"- Fix deprecated string interpolation style","revolt":false},{"name":"amphp\/http-server-session 2.0.1","package":"amphp\/http-server-session","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/http-server-session\/releases\/tag\/v2.0.1","date":"2023-03-25T15:01:24Z","body":"- Fix deprecated string interpolation style","revolt":false},{"name":"amphp\/byte-stream 2.0.1","package":"amphp\/byte-stream","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/byte-stream\/releases\/tag\/v2.0.1","date":"2023-02-03T04:11:49Z","body":"- Fixed `ReadableResourceStream` calling `Suspension::resume()` when destroyed, which could throw an exception when suspending from `{main}` and an uncaught exception was thrown from the event loop.","revolt":true},{"name":"amphp\/dns 2.0.1","package":"amphp\/dns","tag_name":"v2.0.1","html_url":"https:\/\/github.com\/amphp\/dns\/releases\/tag\/v2.0.1","date":"2023-01-21T16:08:27Z","body":"## What's Changed\r\n\r\n* Fix fallback to blocking resolver by @danog and @kelunik in https:\/\/github.com\/amphp\/dns\/pull\/108 and https:\/\/github.com\/amphp\/dns\/pull\/109\r\n* Try entire search list when resolve type is restricted by @trowski: [`9d988e31`](https:\/\/github.com\/amphp\/dns\/commit\/9d988e3127dc233210a5336baf329d58a294bcb9)\r\n* Improve static analysis with more specific DnsResolver return types by @trowski: [`7344cceb`](https:\/\/github.com\/amphp\/dns\/commit\/7344cceb95d6e66bf8c867e0b50417ced4b055d8)\r\n\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/dns\/compare\/v2.0.0...v2.0.1","revolt":true},{"name":"amphp\/windows-registry 1.0.0","package":"amphp\/windows-registry","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/windows-registry\/releases\/tag\/v1.0.0","date":"2023-01-10T20:34:04Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\n- `WindowsRegistry` offers the methods as static methods now instead of instance methods.","revolt":true},{"name":"amphp\/cache 2.0.0","package":"amphp\/cache","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/cache\/releases\/tag\/v2.0.0","date":"2023-01-09T21:07:48Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\n - Renamed `ArrayCache` to `LocalCache`, swapping the constructor argument order\r\n - Modified `LocalCache` to implement `IteratorAggregate` and `Countable`, acting as an LRU cache now (#20)\r\n - Support arbitrary values in `LocalCache`, `NullCache`, and `PrefixCache`\r\n - Changed `Cache` to support arbitrary values\r\n - Introduced separate `StringCache` interface for caching only strings\r\n - Added `StringCacheAdapter` to use any `Cache` in place of a `StringCache`\r\n - Removed `FileCache` (will be available in `amphp\/file` instead)","revolt":true},{"name":"amphp\/postgres 1.4.5","package":"amphp\/postgres","tag_name":"v1.4.5","html_url":"https:\/\/github.com\/amphp\/postgres\/releases\/tag\/v1.4.5","date":"2023-01-07T18:54:57Z","body":"- Fixed cancelling an active query if a connection is closed when using `ext-pgsql` (#54)","revolt":false},{"name":"amphp\/sql-common 1.1.4","package":"amphp\/sql-common","tag_name":"v1.1.4","html_url":"https:\/\/github.com\/amphp\/sql-common\/releases\/tag\/v1.1.4","date":"2023-01-06T04:33:14Z","body":"- Fixed potential double deferred resolve when a connection pool is full.","revolt":false},{"name":"amphp\/sync 2.0.0","package":"amphp\/sync","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/sync\/releases\/tag\/v2.0.0","date":"2022-12-30T23:05:19Z","body":"Stable release compatible with AMPHP v3 and fibers! 🎉\r\n\r\nAs with other libraries compatible with AMPHP v3, most cases of parameters or returns of `Promise` have been replaced with `ResolutionType`.\r\n\r\n#### Changes from 1.x\r\n - `ConcurrentIterator` functions have been removed are now available as methods on `Pipeline` in `amphp\/pipeline`\r\n - `FileMutex` has been removed, as a better implementation ships as part of `amphp\/file`\r\n - Removed `ThreadedMutex` and `ThreadedSemaphore`\r\n - Removed `Lock::getId()`\r\n - `Barrier::await` supports cancellation now\r\n - `synchronized` accepts any `Semaphore` now instead of a `Mutex` only\r\n - Added `Channel` from `amphp\/parallel`, which allows two way communicate between execution contexts, such as two coroutines or two processes. `Channel` has been modified to extend `Closable`\r\n- Also added `Parcel` from `amphp\/parallel`, which allows sharing a value across execution contexts with mutually-exclusive access to modifying that value using `Parcel::synchronized()`.\r\n- Added `createChannelPair()` function which returns a pair of connected `Channel` objects.\r\n- Added `RateLimitingSemaphore` which releases locks after a given time elapses.\r\n- Added `StaticKeySemaphore`, analogous to `StaticKeyMutex`\r\n\r\n#### Changes from 2.0.0 Beta 6\r\n- Added `RateLimitingSemaphore` which releases locks after a given time elapses.\r\n- Added `StaticKeySemaphore`, analogous to `StaticKeyMutex`","revolt":true},{"name":"amphp\/parser 1.1.0","package":"amphp\/parser","tag_name":"v1.1.0","html_url":"https:\/\/github.com\/amphp\/parser\/releases\/tag\/v1.1.0","date":"2022-12-30T19:26:39Z","body":"- PHP 7.4 now required\r\n- Improved performance of the parser when requesting small chunks of data and when yielding an integer length delimiter","revolt":true},{"name":"amphp\/pipeline 1.0.0","package":"amphp\/pipeline","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/pipeline\/releases\/tag\/v1.0.0","date":"2022-12-23T16:56:59Z","body":"Initial stable release 🎉\r\n\r\n#### Changes from 1.0.0 Beta 7\r\n- Marked `ConcurrentArrayIterator`, `ConcurrentChainedIterator`, and `ConcurrentIterableIterator` as `@internal`. Instead of these classes, use `Pipeline::fromIterable()` or `Pipeline::concat()`\r\n- `Pipeline::concat()` now accepts an array of any `iterable`, not only other `Pipeline` objects","revolt":true},{"name":"amphp\/sql 1.0.2","package":"amphp\/sql","tag_name":"v1.0.2","html_url":"https:\/\/github.com\/amphp\/sql\/releases\/tag\/v1.0.2","date":"2022-12-18T23:03:07Z","body":"- Fix a deprecation notice on PHP 8.1 if a configuration key does not have a value.","revolt":false},{"name":"amphp\/phpunit-util 3.0.0","package":"amphp\/phpunit-util","tag_name":"v3.0.0","html_url":"https:\/\/github.com\/amphp\/phpunit-util\/releases\/tag\/v3.0.0","date":"2022-12-18T17:53:05Z","body":"This package has been redesigned for compatibility with AMPHP v3 and fibers. `AsyncTestCase` serves a similar purpose as before, providing helper methods for unit testing within an async context. Each test case is run within a unique fiber to allow suspending during the test run.\r\n\r\n- `AsyncTestCase::setUpAsync()` and `tearDownAsync()` have been removed. Use `AsyncTestCase::setUp()` and `tearDown()` instead, as both of these methods are now able to execute async using fibers.\r\n- `AsyncTestCase::createCallback()` now returns a `Closure`. Additionally, an optional parameter for expected arguments upon invocation have been added (uses `InvocationMocker::with(...)` to set expected arguments).","revolt":true},{"name":"amphp\/amp 3.0.0","package":"amphp\/amp","tag_name":"v3.0.0","html_url":"https:\/\/github.com\/amphp\/amp\/releases\/tag\/v3.0.0","date":"2022-12-18T17:13:34Z","body":"\r\n#### Event Loop\r\n\r\nAmp no longer ships its own event loop. It's now based on [Revolt](https:\/\/revolt.run). `Revolt\\EventLoop` is quite similar to Amp's previous `Amp\\Loop`. A very important difference is using `float $seconds` instead of `int $milliseconds` for timers though!\r\n\r\n#### Promises\r\n\r\n`Future` is a replacement for the previous `Promise`.\r\nThere's no need for callbacks or `yield` anymore!\r\nIts `await()` method is based on fibers and replaces generator based coroutines \/ `Amp\\Promise\\wait()`.\r\n\r\n- Renamed `Amp\\Deferred` to `Amp\\DeferredFuture`.\r\n- Removed `Amp\\Promise\\wait()`: Use `Amp\\Future::await()` instead, which can be called in any (nested) context unlike before.\r\n- Removed `Amp\\call()`: Remove the passed closure boilerplate and all `yield` keywords, interruption is handled via fibers now instead of generator coroutines.\r\n- Removed `Amp\\asyncCall()`: Replace invocations with `Amp\\async()`, which starts a new fiber instead of using generators.\r\n- Removed `Amp\\coroutine()`: There's no direct replacement.\r\n- Removed `Amp\\asyncCoroutine()`: There's no direct replacement.\r\n- Removed `Amp\\Promise\\timeout()`: `Future::await()` accepts an optional `Cancellation`, which can be used as a replacement.\r\n- Removed `Amp\\Promise\\rethrow()`: Unhandled errors are now automatically thrown into the event loop, so there's no need for that function anymore.\r\n- Unhandled errors can be ignored using `Future::ignore()` if needed, but should usually be handled in some way.\r\n- Removed `Amp\\Promise\\wrap()`: Use `Future::finally()` instead.\r\n- Renamed `Amp\\getCurrentTime()` to `Amp\\now()` returning the time in seconds instead of milliseconds.\r\n- Changed `Amp\\delay()` to accept the delay in seconds now instead of milliseconds.\r\n- Added `Amp\\weakClosure()` to allow a class to hold a self-referencing Closure without creating a circular reference that prevents automatic garbage collection.\r\n- Added `Amp\\trapSignal()` to await one or multiple signals.\r\n\r\n#### Promise Combinators\r\n\r\nPromise combinators have been renamed:\r\n\r\n- `Amp\\Promise\\race()` has been renamed to `Amp\\Future\\awaitFirst()`\r\n- `Amp\\Promise\\first()` has been renamed to `Amp\\Future\\awaitAny()`\r\n- `Amp\\Promise\\some()` has been renamed to `Amp\\Future\\awaitAnyN()`\r\n- `Amp\\Promise\\any()` has been renamed to `Amp\\Future\\awaitAll()`\r\n- `Amp\\Promise\\all()` has been renamed to `Amp\\Future\\await()`\r\n\r\n#### CancellationToken\r\n\r\n- `CancellationToken` has been renamed to `Cancellation`.\r\n- `CancellationTokenSource` has been renamed to `DeferredCancellation`.\r\n- `NullCancellationToken` has been renamed to `NullCancellation`.\r\n- `TimeoutCancellationToken` has been renamed to `TimeoutCancellation`.\r\n- `CombinedCancellationToken` has been renamed to `CompositeCancellation`.\r\n- `SignalCancellation` has been added.\r\n\r\n#### Iterators\r\n\r\nIterators have been removed from `amphp\/amp` as normal PHP iterators can be used with fibers now and there's no need for a separate API.\r\nHowever, there's still some need for _concurrent_ iterators, which is covered by the new [`amphp\/pipeline`](https:\/\/github.com\/amphp\/pipeline) library now.\r\n\r\n#### Closable\r\n\r\n`Amp\\Closable` has been added as a new basic interface for closable resources such as streams or sockets.\r\n\r\n#### Strict Types\r\n\r\nStrict types now declared in all library files.\r\nThis will affect callbacks invoked within this library's code which use scalar types as parameters.\r\nFunctions used with `Amp\\async()` are the most likely to be affected by this change \u2014 these functions will now be invoked within a strict-types context.","revolt":true},{"name":"amphp\/php-cs-fixer-config 2.0.0","package":"amphp\/php-cs-fixer-config","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/php-cs-fixer-config\/releases\/tag\/v2.0.0","date":"2022-12-18T15:51:30Z","body":" - Common code style for all packages based on Amp v3.\r\n - Now includes `strict_types` and several other minor updates.","revolt":true},{"name":"amphp\/http-server-form-parser 1.1.5","package":"amphp\/http-server-form-parser","tag_name":"v1.1.5","html_url":"https:\/\/github.com\/amphp\/http-server-form-parser\/releases\/tag\/v1.1.5","date":"2022-04-30T15:16:52Z","body":"- Added methods `parseBody`, `parseUrlEncodedBody`, and `parseMultipartBody` to `BufferingParser` to parse request bodies that have already been buffered (#10)\r\n- Added `parseContentBoundary` function that returns the content boundary from a multipart header.","revolt":false},{"name":"amphp\/websocket 1.0.3","package":"amphp\/websocket","tag_name":"v1.0.3","html_url":"https:\/\/github.com\/amphp\/websocket\/releases\/tag\/v1.0.3","date":"2022-04-11T23:50:33Z","body":"- Added `GOING_AWAY` to the list of normal close codes, which will cause `Client::receive()` to return null instead of throwing an exception if a browser sends this code when navigating away from a page\r\n- Fixed undefined array access in rare case where the event loop is exited after receiving a message on the websocket and then re-entered at a later time (amphp\/websocket-client#39)","revolt":false},{"name":"amphp\/http-server-static-content 1.0.7","package":"amphp\/http-server-static-content","tag_name":"v1.0.7","html_url":"https:\/\/github.com\/amphp\/http-server-static-content\/releases\/tag\/v1.0.7","date":"2022-04-10T14:49:03Z","body":"- Compatibility with `amphp\/file` @ `2.x`","revolt":false},{"name":"amphp\/websocket-client 1.0.1","package":"amphp\/websocket-client","tag_name":"v1.0.1","html_url":"https:\/\/github.com\/amphp\/websocket-client\/releases\/tag\/v1.0.1","date":"2022-03-10T20:11:00Z","body":" - Ignore `\/docs` in `.gitattributes` to avoid broken symlink (#38)\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/websocket-client\/compare\/v1.0.0...v1.0.1","revolt":false},{"name":"amphp\/parallel-functions 1.1.0","package":"amphp\/parallel-functions","tag_name":"v1.1.0","html_url":"https:\/\/github.com\/amphp\/parallel-functions\/releases\/tag\/v1.1.0","date":"2022-02-03T19:56:18Z","body":"## What's Changed\r\n - Update to `laravel\/serializable-closure` instead of `opis\/closure` by @owenvoke\r\n - Increase minimum PHP version to PHP 7.4 by @owenvoke\r\n\r\n## New Contributors\r\n* @sci3ma made their first contribution in https:\/\/github.com\/amphp\/parallel-functions\/pull\/24\r\n* @owenvoke made their first contribution in https:\/\/github.com\/amphp\/parallel-functions\/pull\/31\r\n\r\n**Full Changelog**: https:\/\/github.com\/amphp\/parallel-functions\/compare\/v1.0.0...v1.1.0","revolt":false},{"name":"amphp\/rpc 1.0.0","package":"amphp\/rpc","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/rpc\/releases\/tag\/v1.0.0","date":"2022-02-02T22:13:33Z","body":"Initial release.","revolt":false},{"name":"amphp\/cluster 1.0.1","package":"amphp\/cluster","tag_name":"v1.0.1","html_url":"https:\/\/github.com\/amphp\/cluster\/releases\/tag\/v1.0.1","date":"2021-12-14T00:48:53Z","body":"Update to use [`amphp\/file`](https:\/\/github.com\/amphp\/file) `v2.x`.","revolt":false},{"name":"amphp\/mysql 2.1.2","package":"amphp\/mysql","tag_name":"v2.1.2","html_url":"https:\/\/github.com\/amphp\/mysql\/releases\/tag\/v2.1.2","date":"2021-12-05T16:42:20Z","body":"- Fixed a bug when decoding a JSON field (#113)","revolt":false},{"name":"amphp\/http-client-cookies 1.2.0","package":"amphp\/http-client-cookies","tag_name":"v1.2.0","html_url":"https:\/\/github.com\/amphp\/http-client-cookies\/releases\/tag\/v1.2.0","date":"2021-10-21T20:59:11Z","body":" - Added compatibility with `amphp\/file` v2\r\n - Updated public suffix list","revolt":false},{"name":"amphp\/http-client 4.6.2","package":"amphp\/http-client","tag_name":"v4.6.2","html_url":"https:\/\/github.com\/amphp\/http-client\/releases\/tag\/v4.6.2","date":"2021-10-09T14:13:49Z","body":"- Fixed `setBodySizeLimit(0)` with HTTP\/2 protocol (#297)","revolt":false},{"name":"amphp\/beanstalk 0.3.2","package":"amphp\/beanstalk","tag_name":"v0.3.2","html_url":"https:\/\/github.com\/amphp\/beanstalk\/releases\/tag\/v0.3.2","date":"2020-11-18T18:43:53Z","body":" - Added support for Symfony YAML library v4 and v5. (#34)\r\n","revolt":false},{"name":"amphp\/websocket-server 2.0.0","package":"amphp\/websocket-server","tag_name":"v2.0.0","html_url":"https:\/\/github.com\/amphp\/websocket-server\/releases\/tag\/v2.0.0","date":"2020-07-05T17:52:19Z","body":"### Changes since RC3\r\n\r\n- Renamed `Endpoint` to `Gateway`. An alias to `Endpoint` is provided for compatibility.\r\n- Renamed `WebsocketObserver` to `WebsocketServerObserver`.\r\n\r\n### Upgrading from v1.x to v2.0\r\n\r\nThis library has been refactored to use the new [`amphp\/websocket`](https:\/\/github.com\/amphp\/websocket) library containing components that can be shared between server and clients.\r\n\r\n`Websocket` is now a final class that requires an instance of `ClientHandler`, which has two methods to handle client handshakes and the client connection.\r\n- `handleHandshake()`: This method is invoked when a WebSocket connection attempt is made. The application may alter the given Response to deny the connection attempt or set application-specific headers.\r\n- `handleClient()`: This method is invoked upon a successful WebSocket connection. This method should use a loop to receive messages from the WebSocket connection.\r\n\r\n```php\r\nuse Amp\\Http\\Server\\Request;\r\nuse Amp\\Http\\Server\\Response;\r\nuse Amp\\Http\\Status;\r\nuse Amp\\Success;\r\nuse Amp\\Websocket\\Client;\r\nuse Amp\\Websocket\\Server\\ClientHandler;\r\nuse Amp\\Websocket\\Server\\Gateway;\r\nuse Amp\\Websocket\\Server\\Websocket;\r\n\r\n$websocket = new Websocket(new class implements ClientHandler {\r\n public function handleHandshake(Gateway $gateway, Request $request, Response $response): Promise\r\n {\r\n if (!\\in_array($request->getHeader('origin'), ['http:\/\/localhost:1337', 'http:\/\/127.0.0.1:1337', 'http:\/\/[::1]:1337'], true)) {\r\n return $gateway->getErrorHandler()->handleError(Status::FORBIDDEN, 'Origin forbidden', $request);\r\n }\r\n\r\n return new Success($response);\r\n }\r\n\r\n public function handleClient(Gateway $gateway, Client $client, Request $request, Response $response): Promise\r\n {\r\n return Amp\\call(function () use ($gateway, $client) {\r\n while ($message = yield $client->receive()) {\r\n \\assert($message instanceof Message);\r\n $gateway->broadcast(\\sprintf('%d: %s', $client->getId(), yield $message->buffer()));\r\n }\r\n });\r\n }\r\n});\r\n```\r\n\r\nWebSocket clients are now represented by a [`Client`](https:\/\/github.com\/amphp\/websocket\/blob\/v1.0.0\/src\/Client.php) object. This object contains several methods for getting information about the client and for sending messages to a single client.\r\n\r\nServers can send to multiple clients using `Gateway::broadcast()` and `Gateway::multicast()` (plus binary versions, `Gateway::broadcastBinary()` and `Gateway::multicastBinary()`). A `Gateway` instance is provided to `ClientHandler::handleHandshake()` and `ClientHandler::handleClient()`.\r\n","revolt":false},{"name":"amphp\/serialization 1.0.0","package":"amphp\/serialization","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/serialization\/releases\/tag\/v1.0.0","date":"2020-03-28T14:03:14Z","body":"Initial release.","revolt":true},{"name":"amphp\/http-tunnel 1.0.0","package":"amphp\/http-tunnel","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/http-tunnel\/releases\/tag\/v1.0.0","date":"2019-12-31T17:10:50Z","body":"Initial release.","revolt":false},{"name":"amphp\/http-client-cache 1.0.0","package":"amphp\/http-client-cache","tag_name":"v1.0.0","html_url":"https:\/\/github.com\/amphp\/http-client-cache\/releases\/tag\/v1.0.0","date":"2019-12-21T19:52:55Z","body":"Initial release.","revolt":false},{"name":"amphp\/react-adapter 2.1.0","package":"amphp\/react-adapter","tag_name":"v2.1.0","html_url":"https:\/\/github.com\/amphp\/react-adapter\/releases\/tag\/v2.1.0","date":"2019-11-04T22:20:56Z","body":" - `React\\EventLoop\\Factory` is now automatically replaced with another implementation that throws on each usage to prevent two loops existing concurrently by accident.\r\n Set `AMP_REACT_ADAPTER_DISABLE_FACTORY_OVERRIDE=1` as environment variable or constant to disable this protection.","revolt":false},{"name":"amphp\/react-stream-adapter 0.1.0","package":"amphp\/react-stream-adapter","tag_name":"v0.1.0","html_url":"https:\/\/github.com\/amphp\/react-stream-adapter\/releases\/tag\/v0.1.0","date":"2018-03-07T10:13:55Z","body":"Initial release.","revolt":false}] \ No newline at end of file