Skip to content

Commit

Permalink
WIP realtime relationships (FirebaseExtended#594)
Browse files Browse the repository at this point in the history
* First pass on realtime relationships
* Getting everything working decently
* Unused variables
* Cleanup and PerformanceRouteMixin
* Performance monitoring docs
  • Loading branch information
jamesdaniels authored Oct 12, 2019
1 parent db079a6 commit 3f23274
Show file tree
Hide file tree
Showing 19 changed files with 282 additions and 194 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ export default DS.Model.extend({
// app/routes/articles.js
import Route from '@ember/routing/route';
import RealtimeRouteMixin from 'emberfire/mixins/realtime-route';
import PerformanceRouteMixin from 'emberfire/mixins/performance-route';

export default Route.extend(RealtimeRouteMixin, {
export default Route.extend(RealtimeRouteMixin, PerformanceRouteMixin, {
model() {
return this.store.query('article', { orderBy: 'publishedAt' });
}
Expand Down
42 changes: 42 additions & 0 deletions addon/mixins/performance-route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { inject as service } from '@ember/service';
import Mixin from '@ember/object/mixin';
import { performance } from 'firebase';
import { Promise, reject } from 'rsvp';

export default Mixin.create({
firebaseApp: service('firebase-app'),
store: service('store') as any,
router: service('router'),
trace: reject() as Promise<performance.Trace>,
init() {
this._super(...arguments);
this.get('firebaseApp').performance();
// TODO see if I can fix this
if (this.toString().indexOf("@route:application::") > 0) { throw "PerformanceRouteMixin does not work correctly in the application route" }
},
beforeModel() {
// TODO promise proxy
this.set('trace', this.get('firebaseApp').performance().then(perf => {
const trace = perf.trace(`${this.toString()}:didTransition`);
trace.start();
return trace;
}));
},
afterModel() {
const tracePromise = this.get('trace')!;
const router = this.get('router');
tracePromise.then((trace:performance.Trace|undefined) => {
// TODO figure out how to disconnect the routeDidChange listener
router.on('routeDidChange', () => {
if (trace) {
const screen_name = router.currentRouteName;
trace.putAttribute('url', router.currentURL);
(trace as any).name = `${screen_name}:didTransition`;
trace.stop();
this.set('trace', reject());
trace = undefined;
}
});
})
}
});
4 changes: 1 addition & 3 deletions addon/services/firebase-app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ import { get, set } from '@ember/object';
import { inject as service } from '@ember/service';
import Ember from 'ember';
import FirebaseService from './firebase';

import RSVP from 'rsvp';
const { resolve } = RSVP;
import { resolve } from 'rsvp';

const getApp = (service: FirebaseAppService) => {
const firebase = get(service, 'firebase');
Expand Down
282 changes: 140 additions & 142 deletions addon/services/realtime-listener.ts

Large diffs are not rendered by default.

7 changes: 1 addition & 6 deletions addon/session-stores/firebase.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import Evented from '@ember/object/evented';
import EmberObject from '@ember/object';

import { get, set } from '@ember/object';
import RSVP from 'rsvp';

import { Promise, resolve } from 'rsvp';
import Ember from 'ember';
import FirebaseAppService from '../services/firebase-app';

const { Promise, resolve } = RSVP;
import { run } from '@ember/runloop';

import { inject as service } from '@ember/service';

export default class FirebaseSessionStore extends EmberObject.extend(Evented, {
Expand Down
7 changes: 1 addition & 6 deletions addon/torii-adapters/firebase.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import EmberObject from '@ember/object';
import { inject as service } from '@ember/service';

import { get } from '@ember/object';
import RSVP from 'rsvp';

import { Promise, reject, resolve } from 'rsvp';
import Ember from 'ember';
import FirebaseAppService from '../services/firebase-app';

const { Promise, reject } = RSVP;
import { run } from '@ember/runloop';
import { resolve } from 'path';

export default class FirebaseToriiAdapter extends EmberObject.extend({
firebaseApp: service('firebase-app')
Expand Down
4 changes: 1 addition & 3 deletions addon/torii-providers/firebase.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import EmberObject from '@ember/object';

import RSVP from 'rsvp';
const { reject } = RSVP;
import { reject } from 'rsvp';

export default class FirebaseToriiProvider extends EmberObject.extend({

Expand Down
30 changes: 29 additions & 1 deletion docs/guide/analytics.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Authentication
# Collect Analytics

## Collect Analytics data automatically with the `AnalyticsRouteMixin`

Expand Down Expand Up @@ -28,6 +28,34 @@ const analytics = await firebase.analytics();
analytics.logEvent("some_event", { ... });
```

## Collect traces on route transistions automatically with `PerformanceRouteMixin`

```js
import PerformanceRouteMixin from 'emberfire/mixins/performance-route';
import Route from '@ember/routing/route';

export default Route.extend(PerformanceRouteMixin);
```

## Log traces with the `FirebaseApp` Service


```js
import { inject as service } from '@ember/service';

...

firebaseApp: service('firebase-app'),

...

const perf = await firebase.performance();
const trace = perf.trace("some_event");
trace.start();
...
trace.stop()
```

### Continue reading

1. [Installation](installation.md)
Expand Down
7 changes: 7 additions & 0 deletions mixins/performance-route.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Mixin from '@ember/object/mixin';
declare const _default: Mixin<{
firebaseApp: import("@ember/object/computed").default<import("../services/firebase-app").default, import("../services/firebase-app").default>;
router: import("@ember/object/computed").default<import("@ember/routing/router-service").default, import("@ember/routing/router-service").default>;
init(): void;
}, import("@ember/object").default>;
export default _default;
45 changes: 33 additions & 12 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
},
"scripts": {
"build": "npm run ts:precompile && ember build",
"serve": "npm run build && node ./express.js",
"serve": "ember serve",
"package": "npm run build && npm pack .",
"test": "npm run ts:precompile && ember test",
"ts:precompile": "ember ts:precompile",
Expand Down
2 changes: 1 addition & 1 deletion tests/dummy/app/models/comment.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ const { attr, belongsTo } = DS;
export default DS.Model.extend({
body: attr('string'),
something: belongsTo('something'),
user: belongsTo('user')
user: belongsTo('user', { })
});
3 changes: 2 additions & 1 deletion tests/dummy/app/routes/comment.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Route from '@ember/routing/route';
import RealtimeRouteMixin from 'emberfire/mixins/realtime-route';
import PerformanceRouteMixin from 'emberfire/mixins/performance-route';

export default Route.extend(RealtimeRouteMixin, {
export default Route.extend(RealtimeRouteMixin, PerformanceRouteMixin, {
model(params) {
return this.store.findRecord('comment', params.id, { include: 'user' });
}
Expand Down
7 changes: 4 additions & 3 deletions tests/dummy/app/routes/comments.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import Route from '@ember/routing/route';
import RealtimeRouteMixin from 'emberfire/mixins/realtime-route';
import { inject as service } from '@ember/service';
import PerformanceRouteMixin from 'emberfire/mixins/performance-route';

export default Route.extend(RealtimeRouteMixin, {
export default Route.extend(RealtimeRouteMixin, PerformanceRouteMixin, {
firebaseApp: service(),
model() {
return this.firebaseApp.auth().then(({currentUser}) =>
currentUser &&
this.store.query('comment', { filter: { user: currentUser.uid }, include: 'user' }) ||
this.store.query('comment', { include: 'user'} )
this.store.query('comment', { filter: { user: currentUser.uid } }) ||
this.store.query('comment', { } )
);
}
})
Loading

0 comments on commit 3f23274

Please sign in to comment.