var racer = require('racer') , tracks = require('tracks') , derbyModel = require('./derby.Model') , Dom = require('./Dom') , View = require('./View') , autoRefresh = require('./refresh').autoRefresh; module.exports = derbyBrowser; function derbyBrowser(derby) { derby.createApp = createApp; } derbyBrowser.decorate = 'derby'; derbyBrowser.useWith = {server: false, browser: true}; function createApp(appModule) { var appExports = appModule.exports , view, model; appModule.exports = function(modelBundle, appHash, debug, ns, ctx) { tracks.set('debug', debug); // The init event is fired after the model data is initialized but // before the socket object is set racer.on('init', function(_model) { model = view.model = _model; var dom = view.dom = new Dom(model); derbyModel.init(model, dom, view); // Ignore errors thrown when rendering; these will also be thrown // on the server, and throwing here causes the app not to connect try { // Render immediately upon initialization so that the page is in // the same state it was when rendered on the server view.render(model, ns, ctx, true); } catch (err) { console.error(err); } }); // The ready event is fired after the model data is initialized and // the socket object is set if (debug) { racer.on('ready', function(model) { autoRefresh(view, model, appHash); }); } racer.init(modelBundle); return appExports; }; // Expose methods on the application module. Note that view must added // to both appModule.exports and appExports, since it is used before // the initialization function to make templates appModule.exports.view = appExports.view = view = new View(this._libraries, appExports); function createPage() { return { render: function(ns, ctx) { view.render(model, ns, ctx); } }; } function onRoute(callback, page, params, next, isTransitional) { if (isTransitional) { callback(model, params, next); } else { callback(page, model, params, next); } } tracks.setup(appExports, createPage, onRoute); view.history = appExports.history; appExports.ready = function(fn) { racer.on('ready', fn); }; return appExports; }