1 | /**
|
2 | * @fileoverview added by tsickle
|
3 | * @suppress {checkTypes} checked by tsc
|
4 | */
|
5 | import * as tslib_1 from "tslib";
|
6 | import { BehaviorSubject, } from 'rxjs';
|
7 | import { distinctUntilChanged, first, } from 'rxjs/operators';
|
8 | import { ENDPOINTS, makeApolloClient, } from '@chatie/graphql';
|
9 | export { ObservableQuery, } from '@chatie/graphql';
|
10 | import { GQL_CURRENT_USER } from './db.graphql';
|
11 | import { log } from './config';
|
12 | /**
|
13 | * @record
|
14 | */
|
15 | export function DbOptions() { }
|
16 | function 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 | }
|
24 | export 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 | }
|
143 | function 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 | }
|
159 | export { BehaviorSubject, };
|
160 |
|
161 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2hhdGllL2RiLyIsInNvdXJjZXMiOlsic3JjL2RiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBOEIsTUFBTSxDQUFBO0FBQ3JDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxHQUNOLE1BQThCLGdCQUFnQixDQUFBO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBSVQsZ0JBQWdCLEdBQ2pCLE1BQThCLGlCQUFpQixDQUFBO0FBRWhELE9BQU8sRUFFTCxlQUFlLEdBQ2hCLE1BQThCLGlCQUFpQixDQUFBO0FBTWhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQW1CLFVBQVUsQ0FBQTs7Ozs7Ozs7Ozs7OztBQVkzQyxNQUFNOzs7O0lBYUosWUFBWSxVQUFxQixFQUFFO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQVUsT0FBTyxDQUFDLEdBQUcsSUFBVSxHQUFHLENBQUE7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLHVDQUF1QyxFQUM1QyxPQUFPLENBQUMsS0FBSyxJQUF3QixFQUFFLEVBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FDeEMsQ0FBQTtRQUVqQixJQUFJLENBQUMsU0FBUyxHQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFBO1FBQ2hELElBQUksQ0FBQyxLQUFLLEdBQVEsT0FBTyxDQUFDLEtBQUssSUFBUSxFQUFFLENBQUE7UUFFekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBMEIsU0FBUyxDQUFDLENBQUE7UUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0Is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SUFBSSxFQUFFLHVDQUF1QyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEYsTUFBTSxDQUFDLElBQUksQ0FBQTs7O0NBRWQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUQsT0FBTyxFQUNMLGVBQWUsR0FFaEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgLy8gU3Vic2NyaXB0aW9uLFxufSAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJ1xuaW1wb3J0IHtcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpcnN0LFxufSAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIEVORFBPSU5UUyxcbiAgQXBvbGxvQ2xpZW50LFxuICBFbmRwb2ludHMsXG4gIE5vcm1hbGl6ZWRDYWNoZU9iamVjdCxcbiAgbWFrZUFwb2xsb0NsaWVudCxcbn0gICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGNoYXRpZS9ncmFwaHFsJ1xuXG5leHBvcnQge1xuICBNdXRhdGlvblVwZGF0ZXJGbixcbiAgT2JzZXJ2YWJsZVF1ZXJ5LFxufSAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAY2hhdGllL2dyYXBocWwnXG5cbmltcG9ydCB7XG4gIEN1cnJlbnRVc2VyUXVlcnksXG59ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZ2VuZXJhdGVkLXNjaGVtYXMvZGItc2NoZW1hJ1xuXG5pbXBvcnQgeyBHUUxfQ1VSUkVOVF9VU0VSIH0gZnJvbSAnLi9kYi5ncmFwaHFsJ1xuaW1wb3J0IHsgbG9nIH0gICAgICAgICAgICAgIGZyb20gJy4vY29uZmlnJ1xuXG5leHBvcnQgdHlwZSBBcG9sbG8gPSBBcG9sbG9DbGllbnQ8Tm9ybWFsaXplZENhY2hlT2JqZWN0PiAmIHsgd3NDbG9zZT86IEZ1bmN0aW9uIH1cblxuZXhwb3J0IGludGVyZmFjZSBEYk9wdGlvbnMge1xuICB0b2tlbj86ICAgICBzdHJpbmcsXG4gIGVuZHBvaW50cz86IEVuZHBvaW50cyxcbiAgbG9nPzogICAgICAgdHlwZW9mIGxvZyxcbn1cblxuZXhwb3J0IHR5cGUgQ3VycmVudFVzZXIgPSBDdXJyZW50VXNlclF1ZXJ5Wyd1c2VyJ11cblxuZXhwb3J0IGNsYXNzIERiIHtcblxuICBwcml2YXRlIGFwb2xsbyQ6ICBCZWhhdmlvclN1YmplY3QgPEFwb2xsbyB8IHVuZGVmaW5lZD5cbiAgcHVibGljICBhcG9sbG86ICAgT2JzZXJ2YWJsZSAgICAgIDxBcG9sbG8gfCB1bmRlZmluZWQ+XG5cbiAgcHJpdmF0ZSBjdXJyZW50VXNlciQ6IEJlaGF2aW9yU3ViamVjdCA8Q3VycmVudFVzZXIgfCB1bmRlZmluZWQ+XG4gIHB1YmxpYyAgY3VycmVudFVzZXI6ICBPYnNlcnZhYmxlICAgICAgPEN1cnJlbnRVc2VyIHwgdW5kZWZpbmVkPlxuXG4gIHByaXZhdGUgZW5kcG9pbnRzOiAgRW5kcG9pbnRzXG4gIHByaXZhdGUgdG9rZW46ICAgICAgc3RyaW5nXG5cbiAgcHVibGljIGxvZzogICAgICAgICB0eXBlb2YgbG9nXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmxvZyAgICAgICAgPSBvcHRpb25zLmxvZyAgICAgICB8fCBsb2dcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdEYicsICdjb25zdHJ1Y3Rvcih7dG9rZW49JXMsIGVuZHBvaW50cz0lc30pJyxcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRva2VuICAgICAgICAgICAgICAgICAgICAgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5lbmRwb2ludHMpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICB0aGlzLmVuZHBvaW50cyAgPSBvcHRpb25zLmVuZHBvaW50cyB8fCBFTkRQT0lOVFNcbiAgICB0aGlzLnRva2VuICAgICAgPSBvcHRpb25zLnRva2VuICAgICB8fCAnJ1xuXG4gICAgdGhpcy5jdXJyZW50VXNlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEN1cnJlbnRVc2VyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gICAgdGhpcy5jdXJyZW50VXNlciAgPSB0aGlzLmN1cnJlbnRVc2VyJC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG5cbiAgICB0aGlzLmFwb2xsbyQgID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcG9sbG8gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgICB0aGlzLmFwb2xsbyAgID0gdGhpcy5hcG9sbG8kLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcblxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBuZXh0QXBvbGxvKGF2YWlsYWJsZSA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdEYicsICduZXh0QXBvbGxvKGF2YWlsYWJsZT0lcyknLCBhdmFpbGFibGUpXG5cbiAgICBjb25zdCBvbGRBcG9sbG8gPSBhd2FpdCB0aGlzLmFwb2xsby5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpXG4gICAgdGhpcy5sb2cuc2lsbHkoJ0RiJywgJ25leHRBcG9sbG8oKSBvbGRBcG9sbG89JXMnLCB0eXBlb2Ygb2xkQXBvbGxvKVxuXG4gICAgaWYgKGF2YWlsYWJsZSkge1xuICAgICAgLyoqXG4gICAgICAgKiAxLiBib3JuIGEgbmV3IGFwb2xsbyBjbGllbnQgd2l0aCB0aGUgdG9rZW4gJiBlbmRwb2ludHNcbiAgICAgICAqL1xuICAgICAgY29uc3QgbmV3QXBvbGxvID0gYXdhaXQgbWFrZUFwb2xsb0NsaWVudChcbiAgICAgICAgdGhpcy50b2tlbixcbiAgICAgICAgdGhpcy5lbmRwb2ludHMsXG4gICAgICApXG5cbiAgICAgIHRoaXMuYXBvbGxvJC5uZXh0KG5ld0Fwb2xsbylcblxuICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVc2VyKG5ld0Fwb2xsbylcbiAgICAgIHRoaXMuY3VycmVudFVzZXIkLm5leHQoY3VycmVudFVzZXIpXG5cbiAgICB9IGVsc2Uge1xuICAgICAgLyoqXG4gICAgICAgKiAyLiBib3JuIHVuZGVmaW5lZChpZiBzaG91bGQgbm90IGF2YWlsYWJsZSBhbnkgbW9yZSlcbiAgICAgICAqL1xuICAgICAgdGhpcy5jdXJyZW50VXNlciQubmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLmFwb2xsbyQubmV4dCh1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMy4gY2xvc2UgdGhlIG9sZCBvbmUoaWYgYW55KVxuICAgICAqL1xuICAgIGlmIChvbGRBcG9sbG8pIHtcbiAgICAgIGlmICghb2xkQXBvbGxvLndzQ2xvc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyB3c0Nsb3NlIScpXG4gICAgICB9XG4gICAgICBhd2FpdCBvbGRBcG9sbG8ud3NDbG9zZSgpXG4gICAgICAvLyBhd2FpdCBvbGRBcG9sbG8ucmVzZXRTdG9yZSgpXG4gICAgfVxuXG4gIH1cblxuICBwdWJsaWMgc2V0VG9rZW4odG9rZW46IHN0cmluZykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ0RiJywgJ3NldFRva2VuKHRva2VuPSVzKScsIHRva2VuKVxuXG4gICAgaWYgKHRoaXMudG9rZW4gPT09IHRva2VuKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdEYicsICdzZXRUb2tlbigpIGdvdCB0aGUgc2FtZSB0b2tlbiBhcyBiZWZvcmUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5sb2cuc2lsbHkoJ0RiJywgJ3NldFRva2VuKCkgb2xkIHRva2VuPSVzJywgdGhpcy50b2tlbiAgfHwgJ1wiXCInKVxuICAgIHRoaXMudG9rZW4gPSB0b2tlblxuICB9XG5cbiAgcHVibGljIHNldEVuZHBvaW50cyhlbmRwb2ludHM6IEVuZHBvaW50cykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ0RiJywgJ3NldEVuZHBvaW50cyhlbmRwb2ludHM9JXMpJywgSlNPTi5zdHJpbmdpZnkoZW5kcG9pbnRzKSlcblxuICAgIGNvbnN0IG9sZEpzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVuZHBvaW50cylcbiAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkoZW5kcG9pbnRzKVxuXG4gICAgaWYgKG9sZEpzb24gPT09IG5ld0pzb24pIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ0RiJywgJ3NldEVuZHBvaW50cygpIGdvdCB0aGUgc2FtZSBlbmRwb2ludHMgYXMgYmVmb3JlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nLnNpbGx5KCdEYicsICdzZXRFbmRwb2ludHMoKSBlbmRwb2ludHMgY2hhbmdlZCBmcm9tICVzIHRvICVzJywgb2xkSnNvbiwgbmV3SnNvbilcbiAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50c1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnRGInLCAnb3BlbigpJylcblxuICAgIGF3YWl0IHRoaXMubmV4dEFwb2xsbygpXG4gIH1cblxuICAvLyBEb2VzIGNsb3NlKCkgbmVjZXNzYXJ5P1xuICBwdWJsaWMgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnRGInLCAnY2xvc2UoKScpXG4gICAgYXdhaXQgdGhpcy5uZXh0QXBvbGxvKGZhbHNlKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDdXJyZW50VXNlcihhcG9sbG86IEFwb2xsbykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ0RiJywgJ2N1cnJlbnRVc2VyKCknKVxuXG4gICAgaWYgKCFhcG9sbG8pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKCdEYicsICdjdXJyZW50VXNlcigpIG5vIGFwb2xsbyBkZWZpbmVkIScpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGN1cnJlbnQgdXNlciBpbiBEYicpXG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IGFwb2xsby5xdWVyeTxDdXJyZW50VXNlclF1ZXJ5Pih7XG4gICAgICBxdWVyeTogR1FMX0NVUlJFTlRfVVNFUixcbiAgICB9KS50aGVuKHggPT4geC5kYXRhLnVzZXIpXG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBnZXQgY3VycmVudCB1c2VyIScpXG4gICAgfVxuXG4gICAgbG9nLnNpbGx5KCdEYicsICdjdXJyZW50VXNlcihpZD0lcywgZW1haWw9JXMsIG5hbWU9JXMpJywgdXNlci5pZCwgdXNlci5lbWFpbCwgdXNlci5uYW1lKVxuICAgIHJldHVybiB1c2VyXG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBFbmRwb2ludHMsXG59XG4iXX0= |
\ | No newline at end of file |