UNPKG

5.56 kBJavaScriptView Raw
1'use strict';
2
3var _from = require('rxjs/observable/from');
4
5var _catch2 = require('rxjs/operator/catch');
6
7var _concatMap = require('rxjs/operator/concatMap');
8
9var _filter = require('rxjs/operator/filter');
10
11var _require = require('rxjs/Observable');
12
13var Observable = _require.Observable;
14
15var _require2 = require('./ast.js');
16
17var Collection = _require2.Collection;
18
19var HorizonSocket = require('./socket.js');
20
21var _require3 = require('./logging.js');
22
23var log = _require3.log;
24var logError = _require3.logError;
25var enableLogging = _require3.enableLogging;
26
27var _require4 = require('./auth');
28
29var authEndpoint = _require4.authEndpoint;
30var TokenStorage = _require4.TokenStorage;
31var clearAuthTokens = _require4.clearAuthTokens;
32
33
34var defaultHost = typeof window !== 'undefined' && window.location && '' + window.location.host || 'localhost:8181';
35var defaultSecure = typeof window !== 'undefined' && window.location && window.location.protocol === 'https:' || false;
36
37function Horizon() {
38 var _context;
39
40 var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
41
42 var _ref$host = _ref.host;
43 var host = _ref$host === undefined ? defaultHost : _ref$host;
44 var _ref$secure = _ref.secure;
45 var secure = _ref$secure === undefined ? defaultSecure : _ref$secure;
46 var _ref$path = _ref.path;
47 var path = _ref$path === undefined ? 'horizon' : _ref$path;
48 var _ref$lazyWrites = _ref.lazyWrites;
49 var lazyWrites = _ref$lazyWrites === undefined ? false : _ref$lazyWrites;
50 var _ref$authType = _ref.authType;
51 var authType = _ref$authType === undefined ? 'unauthenticated' : _ref$authType;
52
53 // If we're in a redirection from OAuth, store the auth token for
54 // this user in localStorage.
55 var tokenStorage = new TokenStorage(authType);
56 tokenStorage.setAuthFromQueryParams();
57
58 var socket = new HorizonSocket(host, secure, path, tokenStorage.handshake.bind(tokenStorage));
59
60 // Store whatever token we get back from the server when we get a
61 // handshake response
62 socket.handshake.subscribe(function (handshake) {
63 return tokenStorage.set(handshake.token);
64 });
65
66 // This is the object returned by the Horizon function. It's a
67 // function so we can construct a collection simply by calling it
68 // like horizon('my_collection')
69 function horizon(name) {
70 return new Collection(sendRequest, name, lazyWrites);
71 }
72
73 horizon.dispose = function () {
74 socket.complete();
75 };
76
77 // Dummy subscription to force it to connect to the
78 // server. Optionally provide an error handling function if the
79 // socket experiences an error.
80 // Note: Users of the Observable interface shouldn't need this
81 horizon.connect = function () {
82 var onError = arguments.length <= 0 || arguments[0] === undefined ? function (err) {
83 console.error('Received an error: ' + err);
84 } : arguments[0];
85
86 socket.subscribe(function () {}, onError);
87 };
88
89 // Either subscribe to status updates, or return an observable with
90 // the current status and all subsequent status changes.
91 horizon.status = subscribeOrObservable(socket.status);
92
93 // Convenience method for finding out when disconnected
94 horizon.onDisconnected = subscribeOrObservable((_context = socket.status, _filter.filter).call(_context, function (x) {
95 return x.type === 'disconnected';
96 }));
97
98 // Convenience method for finding out when opening
99 horizon.onConnected = subscribeOrObservable((_context = socket.status, _filter.filter).call(_context, function (x) {
100 return x.type === 'connected';
101 }));
102
103 // Convenience method for finding out when ready
104 horizon.onReady = subscribeOrObservable((_context = socket.status, _filter.filter).call(_context, function (x) {
105 return x.type === 'ready';
106 }));
107
108 // Convenience method for finding out when an error occurs
109 horizon.onSocketError = subscribeOrObservable((_context = socket.status, _filter.filter).call(_context, function (x) {
110 return x.type === 'error';
111 }));
112
113 horizon._authMethods = null;
114 horizon._horizonPath = path;
115 horizon.authEndpoint = authEndpoint;
116 horizon.hasAuthToken = tokenStorage.hasAuthToken.bind(tokenStorage);
117
118 return horizon;
119
120 // Sends a horizon protocol request to the server, and pulls the data
121 // portion of the response out.
122 function sendRequest(type, options) {
123 var _context2;
124
125 // Both remove and removeAll use the type 'remove' in the protocol
126 var normalizedType = type === 'removeAll' ? 'remove' : type;
127 return (_context2 = (_context2 = socket.makeRequest({ type: normalizedType, options: options }) // send the raw request
128 , _concatMap.concatMap).call(_context2, function (resp) {
129 // unroll arrays being returned
130 if (resp.data) {
131 return _from.from.call(Observable, resp.data);
132 } else {
133 // Still need to emit a document even if we have no new data
134 return _from.from.call(Observable, [{ state: resp.state, type: resp.type }]);
135 }
136 }), _catch2._catch).call(_context2, function (e) {
137 return Observable.create(function (observer) {
138 observer.error(e);
139 });
140 }); // on error, strip error message
141 }
142}
143
144function subscribeOrObservable(observable) {
145 return function () {
146 if (arguments.length > 0) {
147 return observable.subscribe.apply(observable, arguments);
148 } else {
149 return observable;
150 }
151 };
152}
153
154Horizon.log = log;
155Horizon.logError = logError;
156Horizon.enableLogging = enableLogging;
157Horizon.Socket = HorizonSocket;
158Horizon.clearAuthTokens = clearAuthTokens;
159
160module.exports = Horizon;
161//# sourceMappingURL=index.js.map
\No newline at end of file