• Stars
    star
    10
  • Rank 1,748,375 (Top 36 %)
  • Language
    Crystal
  • License
    MIT License
  • Created over 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

[WIP] CableReady Crystal port

cable_ready.cr

This is a Crystal port of the CableReady Ruby library.

Disclaimer: This library is still WIP and is not meant to be used in production yet!

Installation

  1. Add the dependency to your shard.yml:
dependencies:
 cable_ready:
   github: marcoroth/cable_ready
  1. Run shards install

Usage

require "cable_ready"

This port supports all DOM operations of the original library. Have a look at the CableReady docs.

Client-side

Install the cable_ready npm package with yarn add cable_ready and establish a websocket connection to the backend.

Here is an example for Amber:

// src/assets/javascripts/main.js

import Amber from 'amber';
import CableReady from 'cable_ready';

let socket = new Amber.Socket('/cable');

socket.connect().then(() => {
  let channel = socket.channel('cable_ready:xyz');
  channel.join();

  channel.on('message', (message) => {
    if (message.message.cableReady) {
      CableReady.perform(message.message.operations);
    }
  })
});

Server-side

The Ruby library uses snake_case for the operation names. Currently this port just supports the camelCase variants of the operation names.

You can include the CableReady::Broadcaster module in whatever class you want to send a broadcast from. Here is an example:

include CableReady::Broadcaster

# use "innerHtml" here instead of "inner_html"
cable_ready["CableReady"].innerHtml({
  :selector => "#clock",
  :html => "#{Time.local}"
})

cable_ready.broadcast

Setup in Amber

In Amber you can create a Socket class and setup a Channel class to send the CableReady operations down to the client. You can generate them with:

amber g socket cable_ready
amber g channel cable_ready

With channel "cable_ready:*", CableReadyChannel you can delegate the connection to a specific channel:

# src/sockets/cable_ready_socket.cr

struct CableReadySocket < Amber::WebSockets::ClientSocket
  channel "cable_ready:*", CableReadyChannel

  def on_connect
    # do some authentication here
    # return true or false, if false the socket will be closed

    true
  end
end

This is how the CableReadyChannel looks like:

# src/sockets/cable_ready_socket.cr
class CableReadyChannel < Amber::WebSockets::Channel
  def handle_joined(client_socket, message)
  end

  def handle_message(client_socket, message)
  end

  def handle_leave(client_socket)
  end
end

Now you can setup some DOM operations where ever in the app you want to send down an update to the client. For example in a controller:

# src/controllers/home_controller.cr

class HomeController < ApplicationController
  include CableReady::Broadcaster

  def index
    cable_ready["CableReady"].innerHtml({
      :selector => "#clock",
      :html => "#{Time.local}"
    })

    cable_ready.broadcast

    render("index.ecr")
  end
end

Make sure you also setup a route for the Socket in config/routes.cr

# config/routes.cr

Amber::Server.configure do
  # ...

  routes :web do
    # ...
    websocket "/cable", CableReadySocket
  end

  # ...
end

Development

TODO: Write development instructions here

Contributing

  1. Fork it (https://github.com/marcoroth/cable_ready.cr/fork)
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors

More Repositories

1

turbo_power

Power-pack for Turbo Streams
TypeScript
323
star
2

turbo_power-rails

Power-pack for Turbo Streams
Ruby
219
star
3

current.js

A tiny 🤏 library (only 410 B) that allows you to access current `<meta>` elements
TypeScript
159
star
4

stimulus-lsp

Intelligent Stimulus tooling for Visual Studio Code and Neovim
TypeScript
127
star
5

gem.sh

Beautiful documentation for any Ruby gem.
Ruby
95
star
6

hotwire.io

Community-driven documentation and resource Hub for Hotwire.
HTML
94
star
7

turbo-morph

Morph action for Turbo Streams
JavaScript
90
star
8

boxdrop

Dropbox Clone built with StimulusReflex
Ruby
76
star
9

formulus

Client-side HTML form validations based on the browser HTML Form Validation API
TypeScript
72
star
10

phlexing

Simple ERB to Phlex converter
Ruby
71
star
11

turbo-ruby

Turbo helpers without the requirement for Rails
Ruby
41
star
12

cable-streams

Extend Turbo Streams with Custom Turbo Stream Actions and CableReady operations
TypeScript
26
star
13

stimulus-parser

Statically analyze Stimulus controllers in your project.
TypeScript
25
star
14

rails7-stimulus-reflex-esbuild

Example StimulusReflex installation using Rails 7 and esbuild
Ruby
24
star
15

stimulus-render

[PoC] HTML rendering mechanism for Stimulus Controllers
TypeScript
18
star
16

type_fusion

Collaborative Ruby type sampling
Ruby
16
star
17

local-time

Modern fork of Basecamp's `local-time`
TypeScript
12
star
18

easy_enum

Turn any Ruby class in an easy to use enum.
Ruby
12
star
19

dependabot-bump-together-action

GitHub Action to bump multiple dependencies with dependabot in a single pull request
Ruby
8
star
20

rubocop-stimulus_reflex

Code style checking for StimulusReflex
Ruby
8
star
21

netatmo-ruby

Ruby gem to interact with the Netatmo REST API
Ruby
7
star
22

railsbytes-cli

CLI to apply Railsbytes.com templates to your Rails application
Ruby
7
star
23

cable-streams-rails

Rails companion gem for the `cable-streams` NPM package
Ruby
6
star
24

ShortLook-WhatsApp

Show WhatsApp users' profile pictures in ShortLook when you receive a WhatsApp notification
Objective-C
5
star
25

rubocop-cable_ready

Code style checking for CableReady
Ruby
4
star
26

ShortLook-Bandsintown

Show Bandsintown artists' profile pictures in ShortLook when you receive a Bandsintown notification
Objective-C
4
star
27

shortlook-cli

ShortLook CLI for scaffoling a ShortLook Provider
Ruby
3
star
28

stimulus-blurhash

Stimulus Controller for BlurHash
JavaScript
2
star
29

ShortLook-RocketChat

Show RocketChat users' profile pictures in ShortLook when you receive a RocketChat notification
Objective-C
2
star
30

ShortLook-VK

Show VK users' profile pictures in ShortLook when you receive a VK notification
Objective-C
2
star
31

ShortLook-GitHub

Show GitHub users' profile pictures in ShortLook when you receive a GitHub notification
Objective-C
2
star
32

ShortLook-Line

Show Line users' profile pictures in ShortLook when you receive a Line notification
Objective-C
2
star
33

ShortLook-KakaoTalk

Show KakaoTalk Contact Photos in ShortLook when you receive a KakaoTalk notification
Objective-C
2
star
34

usersnap-stimulus-repro

HTML
1
star
35

rcrdshp-market-extension

Small extension for the RCRDSHP Marketplace
JavaScript
1
star
36

POC2u

Ruby
1
star
37

cable_ready-dsl

[PoC] An opinionated DSL for CableReady.
Ruby
1
star
38

spritpreisrechner-ruby

Ruby Wrapper for the e-control.at Spritpreisrechner HTTP API
Ruby
1
star
39

tankerkoenig-ruby

Ruby Wrapper for the Tankerkoenig API
Ruby
1
star
40

async-websocket-with-inactive-tab

HTML
1
star
41

ShortLook-Mixcloud

Show Mixcloud covers in ShortLook when you receive a Mixcloud notification
Objective-C
1
star
42

stimulus_reflex-form-serialize-app

Ruby
1
star
43

mirrOS_spotify

Modul zum Anzeigen des zurzeit spielenden Track auf Spotify.
PHP
1
star
44

openmensa-parsers

OpenMensa.org parsers
Ruby
1
star
45

ShortLook-LinkedIn

Show LinkedIn users' profile pictures in ShortLook when you receive a LinkedIn notification
Objective-C
1
star
46

ShortLook-Slack

Show Slack users' profile pictures in ShortLook when you receive a Slack notification
Objective-C
1
star
47

ShortLook-SteamChat

Show SteamChat Profile Pictures in ShortLook when you receive a SteamChat notification!
Objective-C
1
star
48

ShortLook-Xing

Show Xing users' profile pictures in ShortLook when you receive a Xing notification
Objective-C
1
star
49

ShortLook-Viber

Show Viber users' profile pictures in ShortLook when you receive a Viber notification
Objective-C
1
star
50

mirrOS_todoist

Dieses mirrOS Modul zeigt deine Aufgaben aus einer Todoist-Liste an.
PHP
1
star