meteor-space / messaging

Messaging infrastructure for Space applications.
12 stars 2 forks source link

Event versioning feature #2

Closed rhyslbw closed 9 years ago

rhyslbw commented 9 years ago
class MyEvent extends Space.messaging.Event
  eventVersion: 3
  @fields: name: String, …
  migrateFromVersion1: (data) -> …
  migrateFromVersion2: (data) -> …

The prototype of Space.messaging.Event could have eventVersion property set to 1 to maintain existing API for non-versioned events

DominikGuzei commented 9 years ago

I am happy to announce that this feature is included in the latest space:messaging@1.7.0 release. Here are the unit tests for it, so that you get a feeling how it works:

describe 'versioning', ->

  class TestEvent extends Event
    @type 'Space.messaging.TestEvent'
    @fields: { first: String, second: String }
    eventVersion: 3
    migrateFromVersion1: (data) -> data.first = 'first'
    migrateFromVersion2: (data) -> data.second = 'second'

  it 'has version 1 by default', ->
    event = new Event()
    expect(event.eventVersion).to.equal(1)

  it 'can be migrated from older versions', ->
    originalData = { eventVersion: 1 }
    event = new TestEvent originalData
    expect(event.first).to.equal 'first'
    expect(event.second).to.equal 'second'

  it 'supports EJSON', ->
    event = new TestEvent { eventVersion: 1 }
    copy = EJSON.parse EJSON.stringify(event)
    expect(copy.eventVersion).to.equal(TestEvent::eventVersion)