Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/paulstatezny/elm-phoenix-websocket-ports
Generic Elm ports for interacting with the Phoenix framework via websocket
https://github.com/paulstatezny/elm-phoenix-websocket-ports
Last synced: about 1 month ago
JSON representation
Generic Elm ports for interacting with the Phoenix framework via websocket
- Host: GitHub
- URL: https://github.com/paulstatezny/elm-phoenix-websocket-ports
- Owner: paulstatezny
- License: mit
- Created: 2017-02-09T18:26:05.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2018-05-25T05:23:15.000Z (over 6 years ago)
- Last Synced: 2024-10-01T19:46:52.429Z (about 1 month ago)
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/elm-phoenix-websocket-ports
- Size: 36.1 KB
- Stars: 9
- Watchers: 4
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Elm Phoenix Websocket Ports [![Build Status](https://travis-ci.org/paulstatezny/elm-phoenix-websocket-ports.svg?branch=master)](https://travis-ci.org/paulstatezny/elm-phoenix-websocket-ports)
Communicate with a [Phoenix Framework](http://www.phoenixframework.org/) application via Websocket.
## Quick Start
### 1. Install via NPM
```
$ npm install --save elm-phoenix-websocket-ports
```### 2. In `elm-package.json`, import [`Ports/Websocket.elm`](lib/elm/Ports/Websocket.elm)
Add `node_modules/elm-phoenix-websocket-ports/lib/elm` to your `source-directories`:
```js
// elm-package.json{
// ..."source-directories": [
"../../node_modules/elm-phoenix-websocket-ports/lib/elm", // Exact path to node_modules may be different for you
"./"
],// ...
}
```### 3. Use it in your Elm code
```elm
type Msg
= WebsocketReceive (String, String, Json.Decode.Value)init =
( someModel
, Ports.Websocket.websocketListen ("search", "receive_results")
)subscriptions model =
Ports.Websocket.websocketReceive WebsocketReceiveupdate msg model =
case msg of
WebsocketReceive ("search", "receive_results", payload) ->
case Json.Decode.decodeValue searchResultsDecoder payload of
Ok searchResults ->
-- Do something with searchResults
```### 4. Register your Elm app in JavaScript
### Using [Elm Router](https://github.com/paulstatezny/elm-router)
```javascript
var phoenix = require('phoenix');
var socketAddress = '/socket';var websocketPorts = require('elm-phoenix-websocket-ports')(phoenix, socketAddress);
elmRouter.start(Elm, [websocketPorts]);
```### Without Elm Router
```javascript
var phoenix = require('phoenix');
var socketAddress = 'ws://website.com/ws';
var websocketPorts = require('elm-phoenix-websocket-ports')(phoenix, socketAddress);var myElmApp = Elm.MyElmApp.embed(document.getElementById('my-elm-app-container'));
websocketPorts.register(myElmApp.ports);
```### Factory Function API
Notice that the module itself is a factory function with this signature:
```
function websocketPorts(phoenix, socketAddress, [opts, [topicProvider]])
```The last two parameters are optional:
- `opts` is an object containing the options passed into the `phoenix.Socket` constructor, as documented [in the JSDoc of the code](https://github.com/phoenixframework/phoenix/blob/master/assets/js/phoenix.js).
- `topicProvider` is a function that transforms topic strings.In practice, `topicProvider` would be used to do something like appending a user ID to a topic:
```js
function websocketTopicProvider(topic) {
if (user.id) {
return topic + ":" + user.id;
}return topic;
}
```Although it'd probably be a better pattern to pass in an access token to the socket and derive the user from the token. `opts` can be used to achieve this:
```js
var websocketPorts = require('elm-phoenix-websocket-ports')(
phoenix,
socketAddress,
{params: {token: ACCESS_TOKEN}}
);
```#### `phoenix`
This is the [Phoenix Framework JavaScript client](https://www.npmjs.com/package/phoenix). Instead of making Phoenix a dependency of this NPM module, we require it to be injected.
We do this to avoid bloating your bundle by double-importing the Phoenix client, since `mix phoenix.new` sets up `package.json` to import the Phoenix JavaScript client from a relative path in the code repository.
#### `socketAddress`
This is the path to your socket endpoint. It can be a relative or absolute path. For example:
```
/ws
ws://example.com/socket
wss://www.mysite.com/socket_endpoint
```## API Reference
[View the full API reference here.](./API.md)
## Questions or Problems?
Feel free to create an issue in the [GitHub issue tracker](https://github.com/paulstatezny/elm-phoenix-websocket-ports/issues).