UNPKG

17 kBJavaScriptView Raw
1/**
2 * @fileoverview added by tsickle
3 * @suppress {checkTypes} checked by tsc
4 */
5import * as tslib_1 from "tslib";
6import { BehaviorSubject, } from 'rxjs';
7import { distinctUntilChanged, first, } from 'rxjs/operators';
8import { ENDPOINTS, makeApolloClient, } from '@chatie/graphql';
9export { ObservableQuery, } from '@chatie/graphql';
10import { GQL_CURRENT_USER } from './db.graphql';
11import { log } from './config';
12/**
13 * @record
14 */
15export function DbOptions() { }
16function DbOptions_tsickle_Closure_declarations() {
17 /** @type {?|undefined} */
18 DbOptions.prototype.token;
19 /** @type {?|undefined} */
20 DbOptions.prototype.endpoints;
21 /** @type {?|undefined} */
22 DbOptions.prototype.log;
23}
24export class Db {
25 /**
26 * @param {?=} options
27 */
28 constructor(options = {}) {
29 this.log = options.log || log;
30 this.log.verbose('Db', 'constructor({token=%s, endpoints=%s})', options.token || '', JSON.stringify(options.endpoints) || '');
31 this.endpoints = options.endpoints || ENDPOINTS;
32 this.token = options.token || '';
33 this.currentUser$ = new BehaviorSubject(undefined);
34 this.currentUser = this.currentUser$.asObservable().pipe(distinctUntilChanged());
35 this.apollo$ = new BehaviorSubject(undefined);
36 this.apollo = this.apollo$.asObservable().pipe(distinctUntilChanged());
37 }
38 /**
39 * @param {?=} available
40 * @return {?}
41 */
42 nextApollo(available = true) {
43 return tslib_1.__awaiter(this, void 0, void 0, function* () {
44 this.log.verbose('Db', 'nextApollo(available=%s)', available);
45 const /** @type {?} */ oldApollo = yield this.apollo.pipe(first()).toPromise();
46 this.log.silly('Db', 'nextApollo() oldApollo=%s', typeof oldApollo);
47 if (available) {
48 /**
49 * 1. born a new apollo client with the token & endpoints
50 */
51 const /** @type {?} */ newApollo = yield makeApolloClient(this.token, this.endpoints);
52 this.apollo$.next(newApollo);
53 const /** @type {?} */ currentUser = yield this.getCurrentUser(newApollo);
54 this.currentUser$.next(currentUser);
55 }
56 else {
57 /**
58 * 2. born undefined(if should not available any more)
59 */
60 this.currentUser$.next(undefined);
61 this.apollo$.next(undefined);
62 }
63 /**
64 * 3. close the old one(if any)
65 */
66 if (oldApollo) {
67 if (!oldApollo.wsClose) {
68 throw new Error('no wsClose!');
69 }
70 yield oldApollo.wsClose();
71 // await oldApollo.resetStore()
72 }
73 });
74 }
75 /**
76 * @param {?} token
77 * @return {?}
78 */
79 setToken(token) {
80 this.log.verbose('Db', 'setToken(token=%s)', token);
81 if (this.token === token) {
82 this.log.info('Db', 'setToken() got the same token as before');
83 return;
84 }
85 this.log.silly('Db', 'setToken() old token=%s', this.token || '""');
86 this.token = token;
87 }
88 /**
89 * @param {?} endpoints
90 * @return {?}
91 */
92 setEndpoints(endpoints) {
93 this.log.verbose('Db', 'setEndpoints(endpoints=%s)', JSON.stringify(endpoints));
94 const /** @type {?} */ oldJson = JSON.stringify(this.endpoints);
95 const /** @type {?} */ newJson = JSON.stringify(endpoints);
96 if (oldJson === newJson) {
97 this.log.info('Db', 'setEndpoints() got the same endpoints as before');
98 return;
99 }
100 this.log.silly('Db', 'setEndpoints() endpoints changed from %s to %s', oldJson, newJson);
101 this.endpoints = endpoints;
102 }
103 /**
104 * @return {?}
105 */
106 open() {
107 return tslib_1.__awaiter(this, void 0, void 0, function* () {
108 this.log.verbose('Db', 'open()');
109 yield this.nextApollo();
110 });
111 }
112 /**
113 * @return {?}
114 */
115 close() {
116 return tslib_1.__awaiter(this, void 0, void 0, function* () {
117 this.log.verbose('Db', 'close()');
118 yield this.nextApollo(false);
119 });
120 }
121 /**
122 * @param {?} apollo
123 * @return {?}
124 */
125 getCurrentUser(apollo) {
126 return tslib_1.__awaiter(this, void 0, void 0, function* () {
127 this.log.verbose('Db', 'currentUser()');
128 if (!apollo) {
129 this.log.error('Db', 'currentUser() no apollo defined!');
130 throw new Error('no current user in Db');
131 }
132 const /** @type {?} */ user = yield apollo.query({
133 query: GQL_CURRENT_USER,
134 }).then(x => x.data.user);
135 if (!user) {
136 throw new Error('cant get current user!');
137 }
138 log.silly('Db', 'currentUser(id=%s, email=%s, name=%s)', user.id, user.email, user.name);
139 return user;
140 });
141 }
142}
143function Db_tsickle_Closure_declarations() {
144 /** @type {?} */
145 Db.prototype.apollo$;
146 /** @type {?} */
147 Db.prototype.apollo;
148 /** @type {?} */
149 Db.prototype.currentUser$;
150 /** @type {?} */
151 Db.prototype.currentUser;
152 /** @type {?} */
153 Db.prototype.endpoints;
154 /** @type {?} */
155 Db.prototype.token;
156 /** @type {?} */
157 Db.prototype.log;
158}
159export { BehaviorSubject, };
160
161//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2hhdGllL2RiLyIsInNvdXJjZXMiOlsic3JjL2RiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBOEIsTUFBTSxDQUFBO0FBQ3JDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxHQUNOLE1BQThCLGdCQUFnQixDQUFBO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBSVQsZ0JBQWdCLEdBQ2pCLE1BQThCLGlCQUFpQixDQUFBO0FBRWhELE9BQU8sRUFFTCxlQUFlLEdBQ2hCLE1BQThCLGlCQUFpQixDQUFBO0FBTWhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQW1CLFVBQVUsQ0FBQTs7Ozs7Ozs7Ozs7OztBQVkzQyxNQUFNOzs7O0lBYUosWUFBWSxVQUFxQixFQUFFO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQVUsT0FBTyxDQUFDLEdBQUcsSUFBVSxHQUFHLENBQUE7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLHVDQUF1QyxFQUM1QyxPQUFPLENBQUMsS0FBSyxJQUF3QixFQUFFLEVBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FDeEMsQ0FBQTtRQUVqQixJQUFJLENBQUMsU0FBUyxHQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFBO1FBQ2hELElBQUksQ0FBQyxLQUFLLEdBQVEsT0FBTyxDQUFDLEtBQUssSUFBUSxFQUFFLENBQUE7UUFFekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBMEIsU0FBUyxDQUFDLENBQUE7UUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0Is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SUFBSSxFQUFFLHVDQUF1QyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEYsTUFBTSxDQUFDLElBQUksQ0FBQTs7O0NBRWQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUQsT0FBTyxFQUNMLGVBQWUsR0FFaEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgLy8gU3Vic2NyaXB0aW9uLFxufSAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJ1xuaW1wb3J0IHtcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpcnN0LFxufSAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIEVORFBPSU5UUyxcbiAgQXBvbGxvQ2xpZW50LFxuICBFbmRwb2ludHMsXG4gIE5vcm1hbGl6ZWRDYWNoZU9iamVjdCxcbiAgbWFrZUFwb2xsb0NsaWVudCxcbn0gICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGNoYXRpZS9ncmFwaHFsJ1xuXG5leHBvcnQge1xuICBNdXRhdGlvblVwZGF0ZXJGbixcbiAgT2JzZXJ2YWJsZVF1ZXJ5LFxufSAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAY2hhdGllL2dyYXBocWwnXG5cbmltcG9ydCB7XG4gIEN1cnJlbnRVc2VyUXVlcnksXG59ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZ2VuZXJhdGVkLXNjaGVtYXMvZGItc2NoZW1hJ1xuXG5pbXBvcnQgeyBHUUxfQ1VSUkVOVF9VU0VSIH0gZnJvbSAnLi9kYi5ncmFwaHFsJ1xuaW1wb3J0IHsgbG9nIH0gICAgICAgICAgICAgIGZyb20gJy4vY29uZmlnJ1xuXG5leHBvcnQgdHlwZSBBcG9sbG8gPSBBcG9sbG9DbGllbnQ8Tm9ybWFsaXplZENhY2hlT2JqZWN0PiAmIHsgd3NDbG9zZT86IEZ1bmN0aW9uIH1cblxuZXhwb3J0IGludGVyZmFjZSBEYk9wdGlvbnMge1xuICB0b2tlbj86ICAgICBzdHJpbmcsXG4gIGVuZHBvaW50cz86IEVuZHBvaW50cyxcbiAgbG9nPzogICAgICAgdHlwZW9mIGxvZyxcbn1cblxuZXhwb3J0IHR5cGUgQ3VycmVudFVzZXIgPSBDdXJyZW50VXNlclF1ZXJ5Wyd1c2VyJ11cblxuZXhwb3J0IGNsYXNzIERiIHtcblxuICBwcml2YXRlIGFwb2xsbyQ6ICBCZWhhdmlvclN1YmplY3QgPEFwb2xsbyB8IHVuZGVmaW5lZD5cbiAgcHVibGljICBhcG9sbG86ICAgT2JzZXJ2YWJsZSAgICAgIDxBcG9sbG8gfCB1bmRlZmluZWQ+XG5cbiAgcHJpdmF0ZSBjdXJyZW50VXNlciQ6IEJlaGF2aW9yU3ViamVjdCA8Q3VycmVudFVzZXIgfCB1bmRlZmluZWQ+XG4gIHB1YmxpYyAgY3VycmVudFVzZXI6ICBPYnNlcnZhYmxlICAgICAgPEN1cnJlbnRVc2VyIHwgdW5kZWZpbmVkPlxuXG4gIHByaXZhdGUgZW5kcG9pbnRzOiAgRW5kcG9pbnRzXG4gIHByaXZhdGUgdG9rZW46ICAgICAgc3RyaW5nXG5cbiAgcHVibGljIGxvZzogICAgICAgICB0eXBlb2YgbG9nXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmxvZyAgICAgICAgPSBvcHRpb25zLmxvZyAgICAgICB8fCBsb2dcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdEYicsICdjb25zdHJ1Y3Rvcih7dG9rZW49JXMsIGVuZHBvaW50cz0lc30pJyxcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRva2VuICAgICAgICAgICAgICAgICAgICAgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5lbmRwb2ludHMpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICB0aGlzLmVuZHBvaW50cyAgPSBvcHRpb25zLmVuZHBvaW50cyB8fCBFTkRQT0lOVFNcbiAgICB0aGlzLnRva2VuICAgICAgPSBvcHRpb25zLnRva2VuICAgICB8fCAnJ1xuXG4gICAgdGhpcy5jdXJyZW50VXNlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEN1cnJlbnRVc2VyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gICAgdGhpcy5jdXJyZW50VXNlciAgPSB0aGlzLmN1cnJlbnRVc2VyJC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG5cbiAgICB0aGlzLmFwb2xsbyQgID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcG9sbG8gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgICB0aGlzLmFwb2xsbyAgID0gdGhpcy5hcG9sbG8kLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcblxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBuZXh0QXBvbGxvKGF2YWlsYWJsZSA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdEYicsICduZXh0QXBvbGxvKGF2YWlsYWJsZT0lcyknLCBhdmFpbGFibGUpXG5cbiAgICBjb25zdCBvbGRBcG9sbG8gPSBhd2FpdCB0aGlzLmFwb2xsby5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpXG4gICAgdGhpcy5sb2cuc2lsbHkoJ0RiJywgJ25leHRBcG9sbG8oKSBvbGRBcG9sbG89JXMnLCB0eXBlb2Ygb2xkQXBvbGxvKVxuXG4gICAgaWYgKGF2YWlsYWJsZSkge1xuICAgICAgLyoqXG4gICAgICAgKiAxLiBib3JuIGEgbmV3IGFwb2xsbyBjbGllbnQgd2l0aCB0aGUgdG9rZW4gJiBlbmRwb2ludHNcbiAgICAgICAqL1xuICAgICAgY29uc3QgbmV3QXBvbGxvID0gYXdhaXQgbWFrZUFwb2xsb0NsaWVudChcbiAgICAgICAgdGhpcy50b2tlbixcbiAgICAgICAgdGhpcy5lbmRwb2ludHMsXG4gICAgICApXG5cbiAgICAgIHRoaXMuYXBvbGxvJC5uZXh0KG5ld0Fwb2xsbylcblxuICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVc2VyKG5ld0Fwb2xsbylcbiAgICAgIHRoaXMuY3VycmVudFVzZXIkLm5leHQoY3VycmVudFVzZXIpXG5cbiAgICB9IGVsc2Uge1xuICAgICAgLyoqXG4gICAgICAgKiAyLiBib3JuIHVuZGVmaW5lZChpZiBzaG91bGQgbm90IGF2YWlsYWJsZSBhbnkgbW9yZSlcbiAgICAgICAqL1xuICAgICAgdGhpcy5jdXJyZW50VXNlciQubmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLmFwb2xsbyQubmV4dCh1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMy4gY2xvc2UgdGhlIG9sZCBvbmUoaWYgYW55KVxuICAgICAqL1xuICAgIGlmIChvbGRBcG9sbG8pIHtcbiAgICAgIGlmICghb2xkQXBvbGxvLndzQ2xvc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyB3c0Nsb3NlIScpXG4gICAgICB9XG4gICAgICBhd2FpdCBvbGRBcG9sbG8ud3NDbG9zZSgpXG4gICAgICAvLyBhd2FpdCBvbGRBcG9sbG8ucmVzZXRTdG9yZSgpXG4gICAgfVxuXG4gIH1cblxuICBwdWJsaWMgc2V0VG9rZW4odG9rZW46IHN0cmluZykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ0RiJywgJ3NldFRva2VuKHRva2VuPSVzKScsIHRva2VuKVxuXG4gICAgaWYgKHRoaXMudG9rZW4gPT09IHRva2VuKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdEYicsICdzZXRUb2tlbigpIGdvdCB0aGUgc2FtZSB0b2tlbiBhcyBiZWZvcmUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5sb2cuc2lsbHkoJ0RiJywgJ3NldFRva2VuKCkgb2xkIHRva2VuPSVzJywgdGhpcy50b2tlbiAgfHwgJ1wiXCInKVxuICAgIHRoaXMudG9rZW4gPSB0b2tlblxuICB9XG5cbiAgcHVibGljIHNldEVuZHBvaW50cyhlbmRwb2ludHM6IEVuZHBvaW50cykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ0RiJywgJ3NldEVuZHBvaW50cyhlbmRwb2ludHM9JXMpJywgSlNPTi5zdHJpbmdpZnkoZW5kcG9pbnRzKSlcblxuICAgIGNvbnN0IG9sZEpzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVuZHBvaW50cylcbiAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkoZW5kcG9pbnRzKVxuXG4gICAgaWYgKG9sZEpzb24gPT09IG5ld0pzb24pIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ0RiJywgJ3NldEVuZHBvaW50cygpIGdvdCB0aGUgc2FtZSBlbmRwb2ludHMgYXMgYmVmb3JlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nLnNpbGx5KCdEYicsICdzZXRFbmRwb2ludHMoKSBlbmRwb2ludHMgY2hhbmdlZCBmcm9tICVzIHRvICVzJywgb2xkSnNvbiwgbmV3SnNvbilcbiAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50c1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnRGInLCAnb3BlbigpJylcblxuICAgIGF3YWl0IHRoaXMubmV4dEFwb2xsbygpXG4gIH1cblxuICAvLyBEb2VzIGNsb3NlKCkgbmVjZXNzYXJ5P1xuICBwdWJsaWMgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnRGInLCAnY2xvc2UoKScpXG4gICAgYXdhaXQgdGhpcy5uZXh0QXBvbGxvKGZhbHNlKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDdXJyZW50VXNlcihhcG9sbG86IEFwb2xsbykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ0RiJywgJ2N1cnJlbnRVc2VyKCknKVxuXG4gICAgaWYgKCFhcG9sbG8pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKCdEYicsICdjdXJyZW50VXNlcigpIG5vIGFwb2xsbyBkZWZpbmVkIScpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGN1cnJlbnQgdXNlciBpbiBEYicpXG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IGFwb2xsby5xdWVyeTxDdXJyZW50VXNlclF1ZXJ5Pih7XG4gICAgICBxdWVyeTogR1FMX0NVUlJFTlRfVVNFUixcbiAgICB9KS50aGVuKHggPT4geC5kYXRhLnVzZXIpXG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBnZXQgY3VycmVudCB1c2VyIScpXG4gICAgfVxuXG4gICAgbG9nLnNpbGx5KCdEYicsICdjdXJyZW50VXNlcihpZD0lcywgZW1haWw9JXMsIG5hbWU9JXMpJywgdXNlci5pZCwgdXNlci5lbWFpbCwgdXNlci5uYW1lKVxuICAgIHJldHVybiB1c2VyXG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBFbmRwb2ludHMsXG59XG4iXX0=
\No newline at end of file