Augmenting Meteor

Plugging gaps with external services

Meteor is still in it’s infancy. There’s a good chance you’ll want to do something it is not mature enough to achieve right now. What’s a poor developer to do? When you can’t roll your own solution, you could consider using an external service that talks to your meteor server to get things done. In this article I’ll describe a couple of ways we did this to augment League, our sport-management application.

Sending emails

As a seasoned Rails developer, I’m used to the nicer things when it comes to emails. ActionMailer is pretty good these days, and the premailer gem allows you to use (most) of your styles freely within your emails.

Things are a little more raw and exciting in the meteor world; Node modules exist for sending emails, but integrating node modules into a meteor deployment can be a challenge, and it doesn’t seem like a premailer replacement is out there.

So, we took the “easy” road, and set up a simple rails project with a single controller + action: to fire off emails:

class MailsController > ApplicationController
  def create
    mail = params[:mail].to_sym
    data = ActiveSupport::JSON.decode(params[:data]).with_indifferent_access

    Notifications.send(mail, data).deliver
    head :ok

Calling out to the mailer from meteor easy enough: 'POST', LeagueMailerConfig.url, options

Serving calendars via .ics

We wanted to make keeping track of a League team easier by integrating with calendaring apps via the .ics format. It isn’t possible using pure Meteor right now because there is no server side routing at the moment (it serves up the same html|js|css mix whatever URL you hit).

We decided to re-purpose the league-mailer rails server mentioned above and create an end-point that communicates to the league app via DDP – meteor’s distributed data protocol. DDP is a pretty simple protocol and it wasn’t difficult to create a ruby DDP client. Here’s the gem if you want to use it yourself.

Then we just needed to use event-machine to subscribe to our games publication to fill out a games collection and get our results:

module LeagueServer
  # pretty simplistic, but it seems to work
  def self.get_games(team_ids)
    games = nil do
      league_client = if ::Rails.env.production?'', 80)
      else'localhost', 3000)

      league_client.onconnect = lambda do |event|
        league_client.subscribe('games', [team_ids]) do |result|
          games = league_client.collections['games']


From there, it’s standard rails routing and some harnessing of the excellent iCalendar gem to get the right data published at a URL of your choice!

In the future I hope to pull both of these services inside the League meteor app.

Get the Newsletter


Previous Post

Page Transitions in Meteor

Case study on page-to-page transitions

Next Post

Introducing Ground Control

A realtime blogging platform for Meteor