UNPKG

5.4 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _regenerator = require('babel-runtime/regenerator');
8
9var _regenerator2 = _interopRequireDefault(_regenerator);
10
11var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
12
13var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
14
15exports.default = function (racer) {
16 racer.Model.prototype.subDoc = generateMethodOfType(_subscriptionTypeFns.subDoc);
17 racer.Model.prototype.subQuery = generateMethodOfType(_subscriptionTypeFns.subQuery);
18 racer.Model.prototype.subLocal = generateMethodOfType(_subscriptionTypeFns.subLocal);
19 racer.Model.prototype.subValue = generateMethodOfType(_subscriptionTypeFns.subValue);
20 racer.Model.prototype.subApi = generateMethodOfType(_subscriptionTypeFns.subApi);
21};
22
23exports.getCollectionName = getCollectionName;
24exports.getItemFromParams = getItemFromParams;
25
26var _Doc = require('./types/Doc');
27
28var _Doc2 = _interopRequireDefault(_Doc);
29
30var _Query = require('./types/Query');
31
32var _Query2 = _interopRequireDefault(_Query);
33
34var _QueryExtra = require('./types/QueryExtra');
35
36var _QueryExtra2 = _interopRequireDefault(_QueryExtra);
37
38var _Local = require('./types/Local');
39
40var _Local2 = _interopRequireDefault(_Local);
41
42var _Value = require('./types/Value');
43
44var _Value2 = _interopRequireDefault(_Value);
45
46var _Api = require('./types/Api');
47
48var _Api2 = _interopRequireDefault(_Api);
49
50var _subscriptionTypeFns = require('./subscriptionTypeFns');
51
52function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
53
54var SUBS_COLLECTION = '$subs';
55
56function generateMethodOfType(typeFn) {
57 var _this = this;
58
59 var isQuery = typeFn === _subscriptionTypeFns.subQuery;
60 var isSync = typeFn === _subscriptionTypeFns.subLocal || typeFn === _subscriptionTypeFns.subValue;
61
62 // IMPORTANT: subLocal, subValue can actually be made to be synchronous,
63 // but for consistency of the sub* functions api, the decision was made
64 // to always return a promise
65 return function () {
66 var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
67 var $subs,
68 subId,
69 params,
70 item,
71 unsubscribe,
72 collectionName,
73 $queryCollection,
74 $model,
75 data,
76 _args = arguments;
77 return _regenerator2.default.wrap(function _callee$(_context) {
78 while (1) {
79 switch (_context.prev = _context.next) {
80 case 0:
81 $subs = _this.scope(SUBS_COLLECTION);
82 subId = _this.id();
83 params = typeFn.apply(undefined, _args);
84 item = getItemFromParams(params, $subs, subId);
85
86 unsubscribe = function unsubscribe() {
87 item.unrefModel();
88 item.destroy();
89 $subs.destroy(subId);
90 };
91
92 if (isSync) {
93 _context.next = 8;
94 break;
95 }
96
97 _context.next = 8;
98 return item.init(true, { optional: true });
99
100 case 8:
101 item.refModel();
102
103 // For Query and QueryExtra return the scoped model targeting the actual collection path.
104 // This is much more useful since you can use that use this returned model
105 // to update items with: $queryCollection.at(itemId).set('title', 'FooBar')
106 collectionName = isQuery ? getCollectionName(params) : undefined;
107 $queryCollection = isQuery ? _this.scope(collectionName) : undefined;
108
109 // For Doc, Local, Value return the model scoped to the hook path
110 // But only after the initialization actually finished, otherwise
111 // the ORM won't be able to properly resolve the path which was not referenced yet
112
113 $model = !isQuery ? $subs.at(subId) : undefined;
114
115 // In any situation force access data through the object key to let observer know that the data was accessed
116
117 data = $subs.get()[subId];
118 return _context.abrupt('return', [unsubscribe, data,
119
120 // Query, QueryExtra: return scoped model to collection path.
121 // Everything else: return the 'hooks.<randomHookId>' scoped model.
122 $queryCollection || $model]);
123
124 case 14:
125 case 'end':
126 return _context.stop();
127 }
128 }
129 }, _callee, _this);
130 }));
131
132 return function () {
133 return _ref.apply(this, arguments);
134 };
135 }();
136}
137
138function getCollectionName(params) {
139 return params && params.params && params.params[0];
140}
141
142function getItemFromParams(params, model, key) {
143 var explicitType = params && params.__subscriptionType;
144 var subscriptionParams = params.params;
145 var constructor = getItemConstructor(explicitType);
146 return new constructor(model, key, subscriptionParams);
147}
148
149function getItemConstructor(type) {
150 switch (type) {
151 case 'Local':
152 return _Local2.default;
153 case 'Doc':
154 return _Doc2.default;
155 case 'Query':
156 return _Query2.default;
157 case 'QueryExtra':
158 return _QueryExtra2.default;
159 case 'Value':
160 return _Value2.default;
161 case 'Api':
162 return _Api2.default;
163 default:
164 throw new Error('Unsupported subscription type: ' + type);
165 }
166}
\No newline at end of file