See the upgrade guides to bring your Phoenix 1.3.x apps up to speed, including instructions on upgrading to Cowboy 2 for HTTP support.
We have used the opportunity of writing the new Cowboy 2 adapter to do an overhaul in how Phoenix.Socket interacts with transports. The result is a new API that makes it very easy to implement new transports and also allows developers to provide custom socket implementations without ceremony. For example, if you would like to have direct control of the socket and bypass the channel implementation completely, it is now very straight-forward to do so. See the Phoenix.Socket.Transport behaviour for more information.
This overhaul means that the transport/3 macro in Phoenix.Socket is deprecated. Instead of defining transports in your socket.ex file:
transport :websocket, Phoenix.Transport.Websocket,
key1: value1, key2: value2, key3: value3
transport :longpoll, Phoenix.Transport.LongPoll,
key1: value1, key2: value2, key3: value3Configurations must be applied directly in your endpoint file via the Phoenix.Endpoint.socket/3 macro:
socket "/socket", MyApp.UserSocket,
websocket: [key1: value1, key2: value2, key3: value3],
longpoll: [key1: value1, key2: value2, key3: value3]Note the :websocket/:longpoll configuration given to socket/3 will only apply after you remove all transport/3 calls from your socket definition. If you have explicitly upgraded to Cowboy 2, any transport defined with the transport/3 macro will be ignored.
The old APIs for building transports are also deprecated. The good news is: adapting an existing transport to the new API is a less error prone process where you should mostly remove code.
- Fix security vulnerability in wildcard
check_originconfigurations
- [Endpoint] Ignore the root layout on error pages unless explicity opted into
- [Router] Accept a split path on
route_info, in addition to string path
- [Router] Allow aliases and helpers to be disabled via
scope - [Controller] Add root layout support with
put_root_layout/2
- [Router] Fix bug causing Dialyzer warning
- [Router] Add
:trailing_slashoption toscopeandmatchmacros for trailing slash generation on router helpers - [View] Add
:trim_on_html_eex_engineconfiguration to enable/disable trim mode on the HTML EEx engine
- [Controller] Fix plug guard escaping causing module attributes to be expanded too late
- [Token] The
encrypt/5anddecrypt/5API added in 1.4.11 accepted more parameters than necessary. The extra parameter has been deprecated
- [Router] Support metadata on
route_info - [Router] Emit telemetry events on router dispatch failure, using
[:phoenix, :router_dispatch, :failure]
- [Generator] Add
--no-gettextflag tophx.newtask - [Generator] Allow a custom migration module to be given to the migration generator
- [Controller] Allow filename encoding to be disabled in
send_download/3 - [Channel] Allow using a keyword list/map for socket assigns
- [Endpoint] Support WebSocket subprotocols
- [Endpoint] Allow cache manifest to be loaded from specified application
- [Endpoint] Allow disabling logger via application configuration
- [ConnTest] Allow passing a custom set of headers to copy when recycling a connection
- [Channel] Fix error handling when joining a channel using
LongPoll - [Controller] Fix blame in
Phoenix.ActionClauseError - [Router] Escape plug options in router helpers
- Teardown connection on
unloadinstead ofbeforeunloadto support cancellable unloads by userland scripts
- [Token] - Add
encryptanddecrypt
- Add
socket.offfor removingonOpen,onError,onClose, andonMessageregistrations
- Fix channel memory leaks caused by state remaining in socket
onError, andonOpenregistrations
- [Socket] Support assigning multiple key/value pairs with keyword list or map with
assign/2.
- [Endpoint] Fix match error in failed WebSocket handshake
- Support
vsnoption for customizing serializer protocol version
- [local.phx] Use Hex for fetching the latest
phx_newpackage - [phx.new] Use Ecto v3.1 and MyXQL for new apps
- [Endpoint] Fix bug causing headers to be dropped for Cowboy adapters on WebSocket upgrade
- [ConnTest] Fix issue causing loss of connection information when using
bypass_through
- Fix npm package build
- [Router] Add
route_infofor compile and runtime metadata for a given request verb, path, and host - [Endpoint|Router|Controller|Channel] Add
:telemetryintegration with dispatched telemetry events
- [Router] Fix compile error for scope's with named parameters when using
forwardroute definitions
- [phx.new] Fix
errors_onlookup in generatedDataCasemodule usingMap.getinstead ofKeyword.get
- [Controller] Fix
current_urlerror caused by bad function dispatch - [phx.new] Use proper path for watcher in umbrella
- [Digester] Fix invalid SRI hash generation
- [phx.new] Generate new
errors_onfunction inDataCasemodule capable of handling array types
- [Channel] Support
handle_callandhandle_castproxying for channel servers - [Router] Raise error when route name uses
staticin the prefix - [Router] Add
Routes.static_integrity/1for subresource integrity validation
- [phx.gen.*] prohibit context creation with the same name as the application
- Fix bug causing error on window unload when no connection is established
- Fix reconnect retry after explicit disconnect
- Fix
globalWindowconflict with React Native applications
- Add
binaryTypeoption to socket constructor, witharraybufferdefault for binary messages - Use more aggressive socket reconnect for faster connection recovery
- Rejoin channels as soon as socket reconnects for faster rejoins
- Decouple channel rejoin backoffs with new
rejoinAfterMsoption - Optimize reconnects when browser restores from back/forward cache
by listening for window
beforeunload - Expose default
Serializerfor public use
- Fix bug causing socket to never reconnect when heartbeats timeouts are encountered on the client, often experienced with backgrounded browser tabs
- [Router] Add
scoped_aliasto return the full alias with the current scope's aliased prefix - [Router] Add
alias: falseoption to router definitions to to disable scope prefix on case by case basis - [Router] Support any struct with
:endpointkey in path/url helpers - [Channel] Optimize channel join through non-blocking callback init
- [Endpoint] Log web access URLs for HTTP and HTTPS configurations
- [phx.routes] Show socket paths for
:websocketand:longpolltransports - [phx.new] Add
--verboseflag for verbose installer output - [phx.gen.schema] Allow the app configuration to specify a custom migration module for the generated migration code
- [phx.gen.json] Fix invalid map fields for generated JSON tests
- [phx.gen.html|json|context|schema] Prohibit context or schema creation with the same name as the application causing incorrect aliases to be generated
- Optimize router helper generation for faster compilation
- Drop special convention for context locations
- Add missing
:jasonto generated umbrella application
- Fix reconnect regression experienced with spotty connections
- [phx.new] Update Ecto deps with the release of Ecto 3.0 including
phoenix_ecto4.0 - [phx.new] Import Ecto's
.formatter.exsin new projects - [phx.new] Use Ecto 3.0RC, with
ecto_sqlin new project deps - [phx.new] Use Plug 1.7 with new
:plug_cowboydependency for cowboy adapter - [phx.gen.html|json|schema|context] Support new Ecto 3.0 usec datetime types
- [Phoenix] Add
Phoenix.json_library/0and replacePoisonwithJasonfor JSON encoding in new projects - [Endpoint] Add
Cowboy2Adapterfor HTTP2 support with cowboy2 - [Endpoint] The
socket/3macro now accepts direct configuration about websockets and longpoll - [Endpoint] Support MFA function in
:check_originconfig for custom origin checking - [Endpoint] Add new
:phoenix_error_renderinstrumentation callback - [Endpoint] Log the configured url instead of raw IP when booting endpoint webserver
- [Endpoint] Allow custom keyword pairs to be passed to the socket
:connect_infooptions. - [Router] Display list of available routes on debugger 404 error page
- [Router] Raise on duplicate plugs in
pipe_throughscopes - [Controller] Support partial file downloads with
:offsetand:lengthoptions tosend_download/3 - [Controller] Add additional security headers to
put_secure_browser_headers(x-content-type-options,x-download-options, andx-permitted-cross-domain-policies) - [Controller] Add
put_router_url/2to override the default URL generation pulled from endpoint configuration - [Logger] Add whitelist support to
filter_parameterslogger configuration, via new:keeptuple format - [Socket] Add new
phoenix_socket_connectinstrumentation - [Socket] Improve error message when missing socket mount in endpoint
- [Logger] Log calls to user socket connect
- [Presence] Add
Presence.get_by_keyto fetch presences for specific user - [CodeReloader] Add
:reloadable_appsendpoint configuration option to allow recompiling local dependencies - [ChannelTest] Respect user's configured ExUnit
:assert_receive_timeoutfor macro assertions
- Add missing
.formatter.exsto Hex package for proper elixir formatter integration - [phx.gen.cert] Fix usage inside umbrella applications
- [phx.new] Revert
Routes.static_urlin app layout in favor of originalRoutes.static_path - [phx.new] Use
phoenix_live_reload1.2 to fix Hex version errors - [phx.gen.json|html] Fix generator tests incorrectly encoding datetimes
- [phx.gen.cert] Fix generation of cert inside umbrella projects
- [Channel] Fix issue with WebSocket transport sending wrong ContentLength header with 403 response
- [Router] Fix forward aliases failing to expand within scope block
- [Router] Fix regression in router compilation failing to escape plug options
- Generate new Elixir 1.5+ child spec (therefore new apps require Elixir v1.5)
- Use webpack for asset bundling
- Elixir 1.3 is no longer supported, Elixir 1.4+ is required
- [Controller] Passing a view in
render/3andrender/4is deprecated in favor ofput_view/2 - [Endpoint] The
:handleroption in the endpoint is deprecated in favor of:adapter - [Socket]
transport/3is deprecated. The transport is now specified in the endpoint. - [Transport] The transport system has seen an overhaul and been drastically simplified. The previous mechanism for building transports is still supported but it is deprecated. Please see
Phoenix.Socket.Transportfor more information.
- Add new instance-based Presence API with simplified synchronization callbacks
- Accept a function for socket and channel
paramsfor dynamic parameter generation when connecting and joining - Fix race condition when presence diff arrives before state
- Immediately rejoin channels on socket reconnect for faster recovery after reconnection
- Fix reconnect caused by pending heartbeat
The CHANGELOG for v1.3 releases can be found in the v1.3 branch.