@retter/sdk 0.1.15 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -10,6 +10,16 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
+ };
13
23
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
24
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
25
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -46,831 +56,444 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
46
56
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
57
  }
48
58
  };
49
- var __rest = (this && this.__rest) || function (s, e) {
50
- var t = {};
51
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
- t[p] = s[p];
53
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
- t[p[i]] = s[p[i]];
57
- }
58
- return t;
59
- };
60
59
  var __importDefault = (this && this.__importDefault) || function (mod) {
61
60
  return (mod && mod.__esModule) ? mod : { "default": mod };
62
61
  };
63
62
  Object.defineProperty(exports, "__esModule", { value: true });
64
- exports.RBSAuthStatus = exports.RbsRegion = exports.parseClassValidatorErrors = exports.RESPONSE_TYPE = exports.createResponse = void 0;
65
- var jwt_decode_1 = __importDefault(require("jwt-decode"));
66
- var loglevel_1 = __importDefault(require("loglevel"));
67
63
  var firestore_1 = require("firebase/firestore");
68
64
  var app_1 = require("firebase/app");
69
65
  var firestore_2 = require("firebase/firestore");
70
- var rxjs_1 = require("rxjs");
71
- var async_storage_1 = __importDefault(require("@react-native-async-storage/async-storage"));
72
66
  var auth_1 = require("firebase/auth");
67
+ var rxjs_1 = require("rxjs");
73
68
  var operators_1 = require("rxjs/operators");
74
- var base64_1 = __importDefault(require("./base64"));
75
- var axiosSetup_1 = __importDefault(require("./axiosSetup"));
76
- var helpers_1 = require("./helpers");
77
- Object.defineProperty(exports, "createResponse", { enumerable: true, get: function () { return helpers_1.createResponse; } });
78
- Object.defineProperty(exports, "RESPONSE_TYPE", { enumerable: true, get: function () { return helpers_1.RESPONSE_TYPE; } });
79
- Object.defineProperty(exports, "parseClassValidatorErrors", { enumerable: true, get: function () { return helpers_1.parseClassValidatorErrors; } });
80
- var LogLevel;
81
- (function (LogLevel) {
82
- LogLevel[LogLevel["VERBOSE"] = 1] = "VERBOSE";
83
- LogLevel[LogLevel["DEBUG"] = 2] = "DEBUG";
84
- LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
85
- })(LogLevel || (LogLevel = {}));
86
- var RbsRegion;
87
- (function (RbsRegion) {
88
- RbsRegion[RbsRegion["euWest1"] = 0] = "euWest1";
89
- RbsRegion[RbsRegion["euWest1Beta"] = 1] = "euWest1Beta";
90
- })(RbsRegion = exports.RbsRegion || (exports.RbsRegion = {}));
91
- var RbsRegions = [
92
- {
93
- regionId: RbsRegion.euWest1,
94
- getUrl: 'https://core.rtbs.io',
95
- url: 'https://core-internal.rtbs.io',
96
- apiUrl: 'api.rtbs.io',
97
- },
98
- {
99
- regionId: RbsRegion.euWest1Beta,
100
- getUrl: 'https://core-test.rtbs.io',
101
- url: 'https://core-internal-beta.rtbs.io',
102
- apiUrl: 'test-api.rtbs.io',
103
- },
104
- ];
105
- var RBSAuthStatus;
106
- (function (RBSAuthStatus) {
107
- RBSAuthStatus["SIGNED_IN"] = "SIGNED_IN";
108
- RBSAuthStatus["SIGNED_IN_ANONYM"] = "SIGNED_IN_ANONYM";
109
- RBSAuthStatus["SIGNED_OUT"] = "SIGNED_OUT";
110
- RBSAuthStatus["AUTH_FAILED"] = "AUTH_FAILED";
111
- })(RBSAuthStatus = exports.RBSAuthStatus || (exports.RBSAuthStatus = {}));
112
- var RBS_TOKENS_KEY = 'RBS_TOKENS_KEY';
113
- var RBS = /** @class */ (function () {
114
- function RBS() {
115
- var _this = this;
116
- this.firebaseApp = null;
117
- this.firestore = null;
118
- this.firebaseAuth = null;
119
- this.cloudObjects = [];
120
- this.commandQueue = new rxjs_1.Subject();
121
- this.customAuthQueue = new rxjs_1.Subject();
122
- this.clientConfig = null;
123
- this.axiosInstance = null;
69
+ var Auth_1 = __importDefault(require("./Auth"));
70
+ var Request_1 = __importDefault(require("./Request"));
71
+ var types_1 = require("./types");
72
+ __exportStar(require("./types"), exports);
73
+ var Retter = /** @class */ (function () {
74
+ function Retter() {
124
75
  this.initialized = false;
76
+ this.authQueue = new rxjs_1.Subject();
77
+ this.actionQueue = new rxjs_1.Subject();
125
78
  this.authStatusSubject = new rxjs_1.ReplaySubject(1);
126
- this.getServiceEndpoint = function (actionWrapper) {
127
- var endpoint = actionWrapper.tokenData.isServiceToken ? '/service/action' : '/user/action';
128
- var action = actionWrapper.action.action;
129
- var actionType = action.split('.')[2];
130
- endpoint = endpoint + "/" + _this.clientConfig.projectId + "/" + action;
131
- return endpoint;
132
- };
133
- this.getRegion = function () {
134
- var region = undefined;
135
- if (_this.clientConfig.regionConfiguration) {
136
- region = _this.clientConfig.regionConfiguration;
137
- }
138
- else {
139
- region = RbsRegions.find(function (r) { return r.regionId === _this.clientConfig.region; });
140
- if (!region) {
141
- region = RbsRegions.find(function (r) { return r.regionId === RbsRegion.euWest1; });
142
- }
143
- }
144
- if (!region)
145
- throw new Error('Invalid rbs region');
146
- return region;
147
- };
148
- this.getApiUrl = function () {
149
- var region = _this.getRegion();
150
- return "https://root." + region.apiUrl;
151
- };
152
- this.getBaseUrl = function (action) {
153
- var region = _this.getRegion();
154
- if (action.includes('.get.')) {
155
- return region.getUrl;
156
- }
157
- else {
158
- return region.url;
159
- }
160
- };
161
- this.getAuthChangedEvent = function (tokenData) {
162
- if (!tokenData) {
163
- return {
164
- authStatus: RBSAuthStatus.SIGNED_OUT,
165
- };
166
- }
167
- else {
168
- var data = (0, jwt_decode_1.default)(tokenData.accessToken);
169
- if (data.anonymous) {
170
- return {
171
- authStatus: RBSAuthStatus.SIGNED_IN_ANONYM,
172
- uid: data.userId,
173
- identity: data.identity,
174
- };
175
- }
176
- else {
177
- return {
178
- authStatus: RBSAuthStatus.SIGNED_IN,
179
- uid: data.userId,
180
- identity: data.identity,
181
- };
182
- }
183
- }
184
- };
185
- this.fireAuthStatus = function (tokenData) {
186
- var event = _this.getAuthChangedEvent(tokenData);
187
- loglevel_1.default.info('RBSSDK LOG: fireAuthStatus event:', event);
188
- _this.authStatusSubject.next(event);
189
- };
190
- this._getStoredTokenData = function () { return __awaiter(_this, void 0, void 0, function () {
191
- var storedTokenData, item, item;
79
+ this.cloudObjects = [];
80
+ }
81
+ Retter.getInstance = function (config) {
82
+ var instance = Retter.instances.find(function (instance) { var _a; return ((_a = instance.clientConfig) === null || _a === void 0 ? void 0 : _a.projectId) === config.projectId; });
83
+ if (instance)
84
+ return instance;
85
+ var newInstance = new Retter();
86
+ newInstance.init(config);
87
+ Retter.instances.push(newInstance);
88
+ return newInstance;
89
+ };
90
+ Retter.prototype.init = function (config) {
91
+ var _this = this;
92
+ if (this.initialized)
93
+ throw new Error('SDK already initialized.');
94
+ this.initialized = true;
95
+ this.clientConfig = config;
96
+ this.auth = new Auth_1.default(config);
97
+ this.http = new Request_1.default(config);
98
+ this.auth.setHttp(this.http);
99
+ this.processAuthQueue();
100
+ this.processActionQueue();
101
+ setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
102
+ var tokenData;
192
103
  return __generator(this, function (_a) {
193
104
  switch (_a.label) {
194
- case 0:
195
- if (!(typeof document != 'undefined')) return [3 /*break*/, 1];
196
- item = localStorage.getItem(this.getTokenDataKey());
197
- if (item) {
198
- storedTokenData = JSON.parse(item);
199
- }
200
- return [3 /*break*/, 4];
105
+ case 0: return [4 /*yield*/, this.auth.getCurrentTokenData()];
201
106
  case 1:
202
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 3];
203
- return [4 /*yield*/, async_storage_1.default.getItem(this.getTokenDataKey())];
204
- case 2:
205
- item = _a.sent();
206
- if (item) {
207
- storedTokenData = JSON.parse(item);
208
- }
209
- return [3 /*break*/, 4];
210
- case 3:
211
- // I'm in node js
212
- // Node environment
213
- storedTokenData = this.latestTokenData;
214
- _a.label = 4;
215
- case 4: return [2 /*return*/, storedTokenData];
107
+ tokenData = _a.sent();
108
+ this.fireAuthStatus({ tokenData: tokenData });
109
+ return [2 /*return*/];
216
110
  }
217
111
  });
218
- }); };
219
- this.logMessage = function (logMessage) { };
220
- this.getActionWithTokenData = function (actionWrapper) {
221
- return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
222
- var now, storedTokenData, accessTokenExpiresAt, refreshTokenExpiresAt, userId, url, _a, err_1, url, params, _b;
223
- return __generator(this, function (_c) {
224
- switch (_c.label) {
112
+ }); }, 1);
113
+ };
114
+ Retter.prototype.processAuthQueue = function () {
115
+ var _this = this;
116
+ var authResult = this.authQueue.pipe((0, operators_1.concatMap)(function (action) {
117
+ return (0, rxjs_1.defer)(function () { return __awaiter(_this, void 0, void 0, function () {
118
+ var response, error_1;
119
+ return __generator(this, function (_a) {
120
+ switch (_a.label) {
225
121
  case 0:
226
- loglevel_1.default.info('RBSSDK LOG: getActionWithTokenData started');
227
- loglevel_1.default.info('RBSSDK LOG: secretKey and serviceId not found');
228
- now = this.getSafeNow();
229
- loglevel_1.default.info('RBSSDK LOG: now:', now);
230
- return [4 /*yield*/, this._getStoredTokenData()];
122
+ _a.trys.push([0, 2, , 3]);
123
+ return [4 /*yield*/, this.auth.signIn(action.data)];
231
124
  case 1:
232
- storedTokenData = _c.sent();
233
- loglevel_1.default.info('RBSSDK LOG: storedTokenData:', storedTokenData);
234
- if (!storedTokenData) return [3 /*break*/, 7];
235
- loglevel_1.default.info('RBSSDK LOG: storedTokenData is defined');
236
- accessTokenExpiresAt = (0, jwt_decode_1.default)(storedTokenData.accessToken).exp || 0;
237
- refreshTokenExpiresAt = (0, jwt_decode_1.default)(storedTokenData.refreshToken).exp || 0;
238
- userId = (0, jwt_decode_1.default)(storedTokenData.refreshToken).userId;
239
- // If token doesn't need refreshing return it.
240
- if (refreshTokenExpiresAt > now && accessTokenExpiresAt > now) {
241
- loglevel_1.default.info('RBSSDK LOG: returning same token');
242
- // Just return same token
243
- actionWrapper.tokenData = storedTokenData;
244
- }
245
- if (!(refreshTokenExpiresAt > now && accessTokenExpiresAt <= now)) return [3 /*break*/, 6];
246
- // now + 280 -> only wait 20 seconds for debugging
247
- // Refresh token
248
- loglevel_1.default.info('RBSSDK LOG: token refresh needed');
249
- _c.label = 2;
125
+ response = _a.sent();
126
+ return [2 /*return*/, { action: action, response: response }];
250
127
  case 2:
251
- _c.trys.push([2, 4, , 5]);
252
- url = this.getApiUrl() + "/CALL/ProjectUser/refreshToken/" + this.clientConfig.projectId + "_" + userId;
253
- _a = actionWrapper;
254
- return [4 /*yield*/, this.getP(url, {
255
- refreshToken: storedTokenData.refreshToken,
256
- })];
257
- case 3:
258
- _a.tokenData = _c.sent();
259
- console.log('-- getActionWithTokenData -- token refreshed');
260
- console.log('-- getActionWithTokenData -- firebase app: ', !!this.firebaseApp);
261
- return [3 /*break*/, 5];
262
- case 4:
263
- err_1 = _c.sent();
264
- this.signOut();
265
- return [3 /*break*/, 5];
266
- case 5:
267
- loglevel_1.default.info('RBSSDK LOG: refreshed tokenData:', actionWrapper.tokenData);
268
- _c.label = 6;
269
- case 6: return [3 /*break*/, 9];
270
- case 7:
271
- loglevel_1.default.info('RBSSDK LOG: getting anonym token');
272
- url = this.getApiUrl() + "/INSTANCE/ProjectUser";
273
- params = {
274
- projectId: this.clientConfig.projectId,
275
- };
276
- _b = actionWrapper;
277
- return [4 /*yield*/, this.getP(url, params)];
278
- case 8:
279
- _b.tokenData = (_c.sent()).response;
280
- loglevel_1.default.info('RBSSDK LOG: fetched anonym token:', actionWrapper.tokenData);
281
- _c.label = 9;
282
- case 9:
283
- if (!!this.firebaseApp) return [3 /*break*/, 11];
284
- return [4 /*yield*/, this.initFirebase()];
285
- case 10:
286
- _c.sent();
287
- _c.label = 11;
288
- case 11:
289
- loglevel_1.default.info('RBSSDK LOG: resolving with actionWrapper:', actionWrapper);
290
- resolve(actionWrapper);
291
- return [2 /*return*/];
128
+ error_1 = _a.sent();
129
+ throw { action: action, responseError: error_1 };
130
+ case 3: return [2 /*return*/];
292
131
  }
293
132
  });
294
- }); });
295
- };
296
- this.getP = function (url, queryParams) { return __awaiter(_this, void 0, void 0, function () {
133
+ }); }).pipe((0, operators_1.materialize)());
134
+ }), (0, operators_1.share)());
135
+ // on success
136
+ authResult
137
+ .pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; }), (0, operators_1.map)(function (e) { var _a; return (__assign(__assign({}, e.value), { tokenData: (_a = e.value) === null || _a === void 0 ? void 0 : _a.response })); }), (0, operators_1.tap)(this.storeTokenData.bind(this)), (0, operators_1.tap)(function (ev) { return __awaiter(_this, void 0, void 0, function () {
297
138
  return __generator(this, function (_a) {
298
139
  switch (_a.label) {
299
- case 0: return [4 /*yield*/, this.axiosInstance.get(url, { params: queryParams })];
300
- case 1: return [2 /*return*/, (_a.sent()).data];
301
- }
302
- });
303
- }); };
304
- this.getPlatform = function () {
305
- var _a;
306
- return ((_a = _this.clientConfig) === null || _a === void 0 ? void 0 : _a.platform) ? _this.clientConfig.platform : 'WEB';
307
- };
308
- this.request = function (url, actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
309
- var data, params, key, _a, config, request, response, error_1;
310
- var _b, _c, _d;
311
- return __generator(this, function (_e) {
312
- switch (_e.label) {
313
- case 0:
314
- data = (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.data;
315
- params = {
316
- _token: (_c = actionWrapper.tokenData) === null || _c === void 0 ? void 0 : _c.accessToken,
317
- };
318
- for (key in data.queryStringParams || []) {
319
- params[key] = data.queryStringParams[key];
320
- }
321
- _e.label = 1;
140
+ case 0: return [4 /*yield*/, this.clearCloudObjects()];
322
141
  case 1:
323
- _e.trys.push([1, 3, , 4]);
324
- if (!this.axiosInstance)
325
- throw new Error('Axios instance is null');
326
- return [4 /*yield*/, this.axiosInstance({
327
- url: url,
328
- method: (_d = data.httpMethod) !== null && _d !== void 0 ? _d : 'post',
329
- params: params,
330
- data: data.body,
331
- headers: __assign(__assign({}, data.headers), { accept: 'text/plain', 'Content-Type': 'text/plain' }),
332
- })];
333
- case 2:
334
- _a = _e.sent(), config = _a.config, request = _a.request, response = __rest(_a, ["config", "request"]);
335
- actionWrapper.response = response;
336
- return [2 /*return*/, actionWrapper];
337
- case 3:
338
- error_1 = _e.sent();
339
- actionWrapper.response = error_1.response;
340
- actionWrapper.responseError = error_1;
341
- throw actionWrapper;
342
- case 4: return [2 /*return*/];
343
- }
344
- });
345
- }); };
346
- this.post = function (url, actionWrapper) {
347
- return new Promise(function (resolve, reject) {
348
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
349
- var params = {
350
- auth: (_a = actionWrapper.tokenData) === null || _a === void 0 ? void 0 : _a.accessToken,
351
- };
352
- var data = (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.data;
353
- if ((_c = actionWrapper.action) === null || _c === void 0 ? void 0 : _c.targetServiceId) {
354
- params.targetServiceId = (_d = actionWrapper.action) === null || _d === void 0 ? void 0 : _d.targetServiceId;
355
- }
356
- if ((_e = actionWrapper.action) === null || _e === void 0 ? void 0 : _e.relatedUserId) {
357
- params.relatedUserId = (_f = actionWrapper.action) === null || _f === void 0 ? void 0 : _f.relatedUserId;
358
- }
359
- if ((_g = actionWrapper.action) === null || _g === void 0 ? void 0 : _g.headers) {
360
- params.headers = base64_1.default.urlEncode(JSON.stringify((_h = actionWrapper.action) === null || _h === void 0 ? void 0 : _h.headers));
361
- }
362
- if ((_j = actionWrapper.action) === null || _j === void 0 ? void 0 : _j.culture) {
363
- params.culture = actionWrapper.action.culture;
364
- }
365
- if ((_k = actionWrapper.action) === null || _k === void 0 ? void 0 : _k.pop) {
366
- params.pop = 'true';
142
+ _a.sent();
143
+ if (ev.tokenData) {
144
+ this.initFirebase(ev);
145
+ }
146
+ return [2 /*return*/];
367
147
  }
368
- params.platform = _this.getPlatform();
369
- _this.axiosInstance.post(url, data, {
370
- params: params,
371
- })
372
- .then(function (resp) {
373
- actionWrapper.response = resp.data;
374
- resolve(actionWrapper);
375
- })
376
- .catch(function (err) {
377
- actionWrapper.responseError = err;
378
- reject(actionWrapper);
379
- });
380
148
  });
381
- };
382
- this.getParams = function (actionWrapper) {
383
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
384
- var params = {
385
- auth: (_a = actionWrapper.tokenData) === null || _a === void 0 ? void 0 : _a.accessToken,
386
- };
387
- if ((_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.data) {
388
- var data = ((_c = actionWrapper.action) === null || _c === void 0 ? void 0 : _c.data) ? (_d = actionWrapper.action) === null || _d === void 0 ? void 0 : _d.data : {};
389
- params.data = base64_1.default.urlEncode(JSON.stringify(data));
390
- }
391
- if ((_e = actionWrapper.action) === null || _e === void 0 ? void 0 : _e.targetServiceId) {
392
- params.targetServiceId = (_f = actionWrapper.action) === null || _f === void 0 ? void 0 : _f.targetServiceId;
393
- }
394
- if ((_g = actionWrapper.action) === null || _g === void 0 ? void 0 : _g.relatedUserId) {
395
- params.relatedUserId = (_h = actionWrapper.action) === null || _h === void 0 ? void 0 : _h.relatedUserId;
396
- }
397
- if ((_j = actionWrapper.action) === null || _j === void 0 ? void 0 : _j.headers) {
398
- params.headers = base64_1.default.urlEncode(JSON.stringify((_k = actionWrapper.action) === null || _k === void 0 ? void 0 : _k.headers));
149
+ }); }), (0, operators_1.tap)(this.fireAuthStatus.bind(this)))
150
+ .subscribe(function (ev) {
151
+ var _a, _b;
152
+ if ((_a = ev.action) === null || _a === void 0 ? void 0 : _a.resolve) {
153
+ ev.action.resolve((_b = _this.auth) === null || _b === void 0 ? void 0 : _b.getAuthStatus(ev.tokenData));
399
154
  }
400
- if ((_l = actionWrapper.action) === null || _l === void 0 ? void 0 : _l.culture) {
401
- params.culture = actionWrapper.action.culture;
155
+ });
156
+ // on error
157
+ authResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
158
+ var _a;
159
+ if (e.error && e.error.action && e.error.action.resolve) {
160
+ var response = {
161
+ authStatus: types_1.RetterAuthStatus.AUTH_FAILED,
162
+ message: (_a = e.error.responseError.response) === null || _a === void 0 ? void 0 : _a.data,
163
+ };
164
+ e.error.action.resolve(response);
402
165
  }
403
- if ((_m = actionWrapper.action) === null || _m === void 0 ? void 0 : _m.pop) {
404
- params.pop = 'true';
166
+ });
167
+ this.authStatus.subscribe();
168
+ };
169
+ Retter.prototype.processActionQueue = function () {
170
+ var actionResult = this.actionQueue.asObservable().pipe(
171
+ // Get current token data if exists and store it in action
172
+ (0, operators_1.concatMap)(this.getActionWithTokenData.bind(this)),
173
+ // // Fire auth status event
174
+ (0, operators_1.tap)(this.fireAuthStatus.bind(this)),
175
+ // // Make sure we have a token
176
+ (0, operators_1.filter)(function (ev) { return ev.tokenData !== null; }),
177
+ // // Store token data
178
+ (0, operators_1.tap)(this.storeTokenData.bind(this)),
179
+ // // Process action
180
+ (0, operators_1.mergeMap)(this.processAction.bind(this)), (0, operators_1.share)());
181
+ actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; })).subscribe(function (e) {
182
+ if (e.value && e.value.action && e.value.action.resolve && e.value.response) {
183
+ e.value.action.resolve(e.value.response);
405
184
  }
406
- params.platform = _this.getPlatform();
407
- return params;
408
- };
409
- this.get = function (url, actionWrapper) {
410
- return new Promise(function (resolve, reject) {
411
- var _a;
412
- var _b, _c;
413
- var params = _this.getParams(actionWrapper);
414
- if ((_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.generateGetUrl) {
415
- // Don't get from server but just return get url
416
- var url_1 = _this.getBaseUrl(actionWrapper.action.action) + _this.getServiceEndpoint(actionWrapper) + '?';
417
- for (var _i = 0, _d = Object.keys(params); _i < _d.length; _i++) {
418
- var k = _d[_i];
419
- url_1 = "" + url_1 + k + "=" + params[k] + "&";
420
- }
421
- actionWrapper.url = url_1;
422
- resolve(actionWrapper);
423
- }
424
- else {
425
- _this.axiosInstance.get(url, {
426
- params: params,
427
- headers: __assign((_a = {}, _a['Content-Type'] = 'text/plain', _a), (_c = actionWrapper.action) === null || _c === void 0 ? void 0 : _c.headers),
428
- })
429
- .then(function (resp) {
430
- actionWrapper.response = resp.data;
431
- resolve(actionWrapper);
432
- })
433
- .catch(function (err) {
434
- actionWrapper.responseError = err;
435
- reject(actionWrapper);
436
- });
437
- }
185
+ });
186
+ };
187
+ //
188
+ Retter.prototype.sendToAuthQueue = function (action) {
189
+ return __awaiter(this, void 0, void 0, function () {
190
+ var _this = this;
191
+ return __generator(this, function (_a) {
192
+ return [2 /*return*/, new Promise(function (resolve, reject) {
193
+ _this.authQueue.next(__assign(__assign({}, action), { reject: reject, resolve: resolve }));
194
+ })];
438
195
  });
439
- };
440
- this.getPlain = function (url, params, actionWrapper) {
441
- return new Promise(function (resolve, reject) {
442
- _this.axiosInstance.get(url, {
443
- params: params,
444
- })
445
- .then(function (resp) {
446
- actionWrapper.response = resp;
447
- resolve(actionWrapper);
448
- })
449
- .catch(function (err) {
450
- actionWrapper.responseError = err;
451
- reject(actionWrapper);
452
- });
196
+ });
197
+ };
198
+ Retter.prototype.sendToActionQueue = function (action) {
199
+ return __awaiter(this, void 0, void 0, function () {
200
+ var _this = this;
201
+ return __generator(this, function (_a) {
202
+ return [2 /*return*/, new Promise(function (resolve, reject) {
203
+ _this.actionQueue.next(__assign(__assign({}, action), { reject: reject, resolve: resolve }));
204
+ })];
453
205
  });
454
- };
455
- this.getSafeNow = function () {
456
- return Math.round(new Date().getTime() / 1000) + 30; // Plus 30 seconds, just in case.
457
- };
458
- this.getTokenDataKey = function () {
206
+ });
207
+ };
208
+ //
209
+ Retter.prototype.getActionWithTokenData = function (action) {
210
+ return __awaiter(this, void 0, void 0, function () {
211
+ var ev, error_2;
459
212
  var _a;
460
- return RBS_TOKENS_KEY + "." + ((_a = _this.clientConfig) === null || _a === void 0 ? void 0 : _a.projectId);
461
- };
462
- this.setTokenData = function (tokenData) { return __awaiter(_this, void 0, void 0, function () {
463
- return __generator(this, function (_a) {
464
- switch (_a.label) {
213
+ return __generator(this, function (_b) {
214
+ switch (_b.label) {
465
215
  case 0:
466
- if (!(typeof document != 'undefined')) return [3 /*break*/, 1];
467
- // I'm on the web!
468
- // Browser environment
469
- localStorage.setItem(this.getTokenDataKey(), JSON.stringify(tokenData));
470
- return [3 /*break*/, 4];
216
+ _b.trys.push([0, 3, , 4]);
217
+ _a = { action: action };
218
+ return [4 /*yield*/, this.auth.getTokenData()];
471
219
  case 1:
472
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 3];
473
- // I'm in react-native
474
- return [4 /*yield*/, async_storage_1.default.setItem(this.getTokenDataKey(), JSON.stringify(tokenData))];
220
+ ev = (_a.tokenData = _b.sent(), _a);
221
+ return [4 /*yield*/, this.initFirebase(ev)];
475
222
  case 2:
476
- // I'm in react-native
477
- _a.sent();
478
- return [3 /*break*/, 4];
223
+ _b.sent();
224
+ return [2 /*return*/, ev];
479
225
  case 3:
480
- // I'm in node js
481
- // Node environment
482
- this.latestTokenData = tokenData;
483
- _a.label = 4;
226
+ error_2 = _b.sent();
227
+ this.signOut();
228
+ return [2 /*return*/, { action: action }];
484
229
  case 4: return [2 /*return*/];
485
230
  }
486
231
  });
487
- }); };
488
- // PUBLIC METHODS
489
- this.getStoredTokenData = function () { return __awaiter(_this, void 0, void 0, function () {
490
- var storedTokenData, data, accessTokenExpiresAt, refreshTokenExpiresAt, storedTokenData, data, accessTokenExpiresAt, refreshTokenExpiresAt;
232
+ });
233
+ };
234
+ Retter.prototype.fireAuthStatus = function (actionWrapper) {
235
+ var event = this.auth.getAuthStatus(actionWrapper.tokenData);
236
+ this.authStatusSubject.next(event);
237
+ };
238
+ Retter.prototype.storeTokenData = function (actionWrapper) {
239
+ return __awaiter(this, void 0, void 0, function () {
491
240
  return __generator(this, function (_a) {
492
241
  switch (_a.label) {
493
- case 0:
494
- if (!(typeof document != 'undefined')) return [3 /*break*/, 1];
495
- storedTokenData = localStorage.getItem(this.getTokenDataKey());
496
- if (storedTokenData) {
497
- data = JSON.parse(storedTokenData);
498
- accessTokenExpiresAt = (0, jwt_decode_1.default)(data.accessToken).exp || 0;
499
- refreshTokenExpiresAt = (0, jwt_decode_1.default)(data.refreshToken).exp || 0;
500
- data.accessTokenExpiresAt = accessTokenExpiresAt;
501
- data.refreshTokenExpiresAt = refreshTokenExpiresAt;
502
- return [2 /*return*/, data];
503
- }
504
- else {
505
- return [2 /*return*/, undefined];
506
- }
507
- return [3 /*break*/, 4];
242
+ case 0: return [4 /*yield*/, this.auth.storeTokenData(actionWrapper.tokenData)];
508
243
  case 1:
509
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 3];
510
- return [4 /*yield*/, async_storage_1.default.getItem(this.getTokenDataKey())];
511
- case 2:
512
- storedTokenData = _a.sent();
513
- if (storedTokenData) {
514
- data = JSON.parse(storedTokenData);
515
- accessTokenExpiresAt = (0, jwt_decode_1.default)(data.accessToken).exp || 0;
516
- refreshTokenExpiresAt = (0, jwt_decode_1.default)(data.refreshToken).exp || 0;
517
- data.accessTokenExpiresAt = accessTokenExpiresAt;
518
- data.refreshTokenExpiresAt = refreshTokenExpiresAt;
519
- return [2 /*return*/, data];
520
- }
521
- else {
522
- return [2 /*return*/, undefined];
523
- }
524
- return [3 /*break*/, 4];
525
- case 3:
526
- // Node environment
527
- return [2 /*return*/, this.latestTokenData];
528
- case 4: return [2 /*return*/];
244
+ _a.sent();
245
+ return [2 /*return*/];
529
246
  }
530
247
  });
531
- }); };
532
- this.getUser = function () { return __awaiter(_this, void 0, void 0, function () {
533
- var tokenData;
248
+ });
249
+ };
250
+ Retter.prototype.processAction = function (actionWrapper) {
251
+ var _this = this;
252
+ var _a;
253
+ if (((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.action) === types_1.RetterActions.SIGN_IN_ANONYM) {
254
+ return (0, rxjs_1.defer)(function () { return (0, rxjs_1.of)(__assign(__assign({}, actionWrapper), { response: _this.auth.getAuthStatus(actionWrapper.tokenData) })); }).pipe((0, operators_1.materialize)());
255
+ }
256
+ return (0, rxjs_1.defer)(function () { return __awaiter(_this, void 0, void 0, function () {
257
+ var endpoint, response;
534
258
  return __generator(this, function (_a) {
535
259
  switch (_a.label) {
536
- case 0: return [4 /*yield*/, this.getStoredTokenData()];
260
+ case 0:
261
+ endpoint = this.getCosEndpoint(actionWrapper);
262
+ return [4 /*yield*/, this.http.call(this.clientConfig.projectId, endpoint.path, endpoint.params)];
537
263
  case 1:
538
- tokenData = _a.sent();
539
- if (!tokenData)
540
- return [2 /*return*/, null];
541
- return [2 /*return*/, (0, jwt_decode_1.default)(tokenData.accessToken)];
542
- }
543
- });
544
- }); };
545
- this.generatePublicGetActionUrl = function (action) {
546
- var actionWrapper = {
547
- action: action,
548
- tokenData: {
549
- isServiceToken: false,
550
- accessToken: '',
551
- refreshToken: '',
552
- accessTokenExpiresAt: 0,
553
- refreshTokenExpiresAt: 0,
554
- },
555
- };
556
- var params = _this.getParams(actionWrapper);
557
- // Don't get from server but just return get url
558
- var url = _this.getBaseUrl(actionWrapper.action.action) + _this.getServiceEndpoint(actionWrapper) + '?';
559
- for (var _i = 0, _a = Object.keys(params); _i < _a.length; _i++) {
560
- var k = _a[_i];
561
- url = "" + url + k + "=" + params[k] + "&";
562
- }
563
- return url;
564
- };
565
- this.generateGetActionUrl = function (action) {
566
- if (!_this.initialized)
567
- throw new Error('RBS SDK is not initialized');
568
- if (!action.culture)
569
- action.culture = 'en-US';
570
- return new Promise(function (resolve, reject) {
571
- if (!action.onSuccess && !action.onError) {
572
- action.onSuccess = resolve;
573
- action.onError = reject;
264
+ response = _a.sent();
265
+ return [2 /*return*/, __assign(__assign({}, actionWrapper), { response: response })];
574
266
  }
575
- action.generateGetUrl = true;
576
- _this.commandQueue.next(action);
577
267
  });
578
- };
579
- this.send = function (action) {
580
- if (!_this.initialized)
581
- throw new Error('RBS SDK is not initialized');
582
- if (!action.culture)
583
- action.culture = 'en-US';
584
- return new Promise(function (resolve, reject) {
585
- if (!action.onSuccess && !action.onError) {
586
- action.onSuccess = resolve;
587
- action.onError = reject;
268
+ }); }).pipe((0, operators_1.materialize)());
269
+ };
270
+ // Firebase
271
+ Retter.prototype.initFirebase = function (actionWrapper) {
272
+ var _a;
273
+ return __awaiter(this, void 0, void 0, function () {
274
+ var firebaseConfig;
275
+ return __generator(this, function (_b) {
276
+ switch (_b.label) {
277
+ case 0:
278
+ firebaseConfig = (_a = actionWrapper.tokenData) === null || _a === void 0 ? void 0 : _a.firebase;
279
+ if (!firebaseConfig || !!this.firebase)
280
+ return [2 /*return*/, actionWrapper];
281
+ this.firebase = (0, app_1.initializeApp)({
282
+ apiKey: firebaseConfig.apiKey,
283
+ authDomain: firebaseConfig.projectId + '.firebaseapp.com',
284
+ projectId: firebaseConfig.projectId,
285
+ });
286
+ this.firestore = (0, firestore_1.getFirestore)(this.firebase);
287
+ this.firebaseAuth = (0, auth_1.getAuth)(this.firebase);
288
+ return [4 /*yield*/, (0, auth_1.signInWithCustomToken)(this.firebaseAuth, firebaseConfig.customToken)];
289
+ case 1:
290
+ _b.sent();
291
+ return [2 /*return*/, actionWrapper];
588
292
  }
589
- _this.commandQueue.next(action);
590
293
  });
294
+ });
295
+ };
296
+ Retter.prototype.clearFirebase = function () {
297
+ this.firebase = undefined;
298
+ this.firestore = undefined;
299
+ this.firebaseAuth = undefined;
300
+ };
301
+ // Cloud Objects
302
+ Retter.prototype.getCosEndpoint = function (ev) {
303
+ var _a, _b, _c;
304
+ var action = ev.action;
305
+ var data = action.data;
306
+ var queryParams = {
307
+ _token: (_a = data.token) !== null && _a !== void 0 ? _a : (_b = ev.tokenData) === null || _b === void 0 ? void 0 : _b.accessToken,
591
308
  };
592
- this.authenticateWithCustomToken = function (token) {
593
- if (!_this.initialized)
594
- throw new Error('RBS SDK is not initialized');
595
- return new Promise(function (resolve, reject) {
596
- var action = {
597
- action: 'customauth',
598
- data: {
599
- token: token,
600
- },
601
- onSuccess: resolve,
602
- onError: reject,
603
- };
604
- _this.customAuthQueue.next(action);
605
- });
309
+ for (var key in data.queryStringParams || []) {
310
+ queryParams[key] = data.queryStringParams[key];
311
+ }
312
+ var params = {
313
+ params: queryParams,
314
+ method: (_c = data.method) !== null && _c !== void 0 ? _c : 'post',
315
+ data: data.body,
316
+ headers: __assign(__assign({}, data.headers), { accept: 'text/plain', 'Content-Type': 'text/plain' }),
606
317
  };
607
- this.signInAnonymously = function () { return __awaiter(_this, void 0, void 0, function () {
318
+ if (action.action === types_1.RetterActions.COS_INSTANCE) {
319
+ var instanceId = data.key ? "".concat(data.key.name, "!").concat(data.key.value) : data.instanceId;
320
+ return {
321
+ path: "INSTANCE/".concat(data.classId).concat(data.instanceId ? "/".concat(instanceId) : ''),
322
+ params: params,
323
+ };
324
+ }
325
+ else if (action.action === types_1.RetterActions.COS_STATE) {
326
+ return {
327
+ path: "STATE/".concat(data.classId, "/").concat(data.instanceId),
328
+ params: params,
329
+ };
330
+ }
331
+ else {
332
+ return {
333
+ path: "CALL/".concat(data.classId, "/").concat(data.method, "/").concat(data.instanceId),
334
+ params: params,
335
+ };
336
+ }
337
+ };
338
+ Retter.prototype.getFirebaseListener = function (queue, collection, documentId) {
339
+ var document = (0, firestore_2.doc)(this.firestore, collection, documentId);
340
+ console.log('document', document);
341
+ return (0, firestore_2.onSnapshot)(document, function (doc) {
342
+ var data = Object.assign({}, doc.data());
343
+ for (var _i = 0, _a = Object.keys(data); _i < _a.length; _i++) {
344
+ var key = _a[_i];
345
+ if (key.startsWith('__'))
346
+ delete data[key];
347
+ }
348
+ queue.next(data);
349
+ });
350
+ };
351
+ Retter.prototype.clearCloudObjects = function () {
352
+ return __awaiter(this, void 0, void 0, function () {
608
353
  return __generator(this, function (_a) {
609
354
  switch (_a.label) {
610
- case 0: return [4 /*yield*/, this.send({
611
- action: 'signInAnonym',
612
- data: {},
613
- })];
355
+ case 0:
356
+ this.cloudObjects.map(function (i) { return i.unsubscribers.map(function (u) { return u(); }); });
357
+ this.cloudObjects = [];
358
+ if (!this.firebaseAuth) return [3 /*break*/, 2];
359
+ return [4 /*yield*/, (0, auth_1.signOut)(this.firebaseAuth)];
614
360
  case 1:
615
361
  _a.sent();
362
+ _a.label = 2;
363
+ case 2:
364
+ this.clearFirebase();
616
365
  return [2 /*return*/];
617
366
  }
618
367
  });
619
- }); };
620
- this.signOut = function () { return __awaiter(_this, void 0, void 0, function () {
368
+ });
369
+ };
370
+ // Public Methods
371
+ Retter.prototype.signInAnonymously = function () {
372
+ return __awaiter(this, void 0, void 0, function () {
621
373
  return __generator(this, function (_a) {
622
374
  switch (_a.label) {
623
375
  case 0:
624
376
  if (!this.initialized)
625
- throw new Error('RBS SDK is not initialized');
626
- console.log('Signing out...');
627
- return [4 /*yield*/, this.cleanFirebase()];
628
- case 1:
629
- _a.sent();
630
- return [4 /*yield*/, this.logoutUser()];
631
- case 2:
632
- _a.sent();
633
- if (!(typeof document != 'undefined')) return [3 /*break*/, 3];
634
- localStorage.removeItem(this.getTokenDataKey());
635
- return [3 /*break*/, 6];
636
- case 3:
637
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 5];
638
- return [4 /*yield*/, async_storage_1.default.removeItem(this.getTokenDataKey())];
639
- case 4:
640
- _a.sent();
641
- return [3 /*break*/, 6];
642
- case 5:
643
- this.latestTokenData = undefined;
644
- _a.label = 6;
645
- case 6:
646
- this.fireAuthStatus(undefined);
647
- return [2 /*return*/, true];
377
+ throw new Error('Retter SDK not initialized.');
378
+ return [4 /*yield*/, this.sendToActionQueue({ action: types_1.RetterActions.SIGN_IN_ANONYM })];
379
+ case 1: return [2 /*return*/, _a.sent()];
648
380
  }
649
381
  });
650
- }); };
651
- this.logoutUser = function () { return __awaiter(_this, void 0, void 0, function () {
652
- var _this = this;
382
+ });
383
+ };
384
+ Retter.prototype.authenticateWithCustomToken = function (token) {
385
+ return __awaiter(this, void 0, void 0, function () {
653
386
  return __generator(this, function (_a) {
654
- return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
655
- var tokenData, userId, endpoint, err_2;
656
- return __generator(this, function (_a) {
657
- switch (_a.label) {
658
- case 0: return [4 /*yield*/, this.getStoredTokenData()];
659
- case 1:
660
- tokenData = _a.sent();
661
- userId = tokenData ? (0, jwt_decode_1.default)(tokenData.accessToken).userId : '';
662
- endpoint = this.getApiUrl() + "/CALL/ProjectUser/signOut/" + this.clientConfig.projectId + "_" + userId;
663
- _a.label = 2;
664
- case 2:
665
- _a.trys.push([2, 4, , 5]);
666
- return [4 /*yield*/, this.getP(endpoint, {
667
- accessToken: tokenData === null || tokenData === void 0 ? void 0 : tokenData.accessToken,
668
- })];
669
- case 3:
670
- _a.sent();
671
- return [3 /*break*/, 5];
672
- case 4:
673
- err_2 = _a.sent();
674
- return [3 /*break*/, 5];
675
- case 5:
676
- resolve(true);
677
- return [2 /*return*/];
678
- }
679
- });
680
- }); })];
681
- });
682
- }); };
683
- this.initFirebase = function () { return __awaiter(_this, void 0, void 0, function () {
684
- var firebaseConfig, fireUser;
685
- var _a;
686
- return __generator(this, function (_b) {
687
- switch (_b.label) {
688
- case 0: return [4 /*yield*/, this.getStoredTokenData()];
689
- case 1:
690
- firebaseConfig = (_a = (_b.sent())) === null || _a === void 0 ? void 0 : _a.firebase;
691
- console.log('-- initFirebase -- firebaseConfig', firebaseConfig);
692
- if (!firebaseConfig)
693
- return [2 /*return*/];
694
- if (!!this.firebaseApp) return [3 /*break*/, 4];
695
- console.log('-- initFirebase -- firebase app not defined');
696
- this.firebaseApp = (0, app_1.initializeApp)({
697
- apiKey: firebaseConfig.apiKey,
698
- authDomain: firebaseConfig.projectId + '.firebaseapp.com',
699
- projectId: firebaseConfig.projectId,
700
- });
701
- this.firestore = (0, firestore_1.getFirestore)(this.firebaseApp);
702
- this.firebaseAuth = (0, auth_1.getAuth)(this.firebaseApp);
703
- return [4 /*yield*/, (0, auth_1.signInWithCustomToken)(this.firebaseAuth, firebaseConfig.customToken)];
704
- case 2:
705
- fireUser = _b.sent();
706
- return [4 /*yield*/, fireUser.user.getIdToken()];
707
- case 3:
708
- _b.sent();
709
- console.log('-- initFirebase -- firebase authenticated');
710
- _b.label = 4;
711
- case 4: return [2 /*return*/];
712
- }
713
- });
714
- }); };
715
- this.getFirebaseListeners = function (data, queue, key) { return __awaiter(_this, void 0, void 0, function () {
716
- var idToken, userData, documentId, collection, document, unsubscribe;
717
- var _a, _b;
718
- return __generator(this, function (_c) {
719
- switch (_c.label) {
720
- case 0: return [4 /*yield*/, ((_b = (_a = this.firebaseAuth) === null || _a === void 0 ? void 0 : _a.currentUser) === null || _b === void 0 ? void 0 : _b.getIdToken())];
721
- case 1:
722
- idToken = _c.sent();
723
- console.log('-- getFirebaseListeners -- idToken', idToken);
724
- return [4 /*yield*/, this.getUser()];
725
- case 2:
726
- userData = _c.sent();
727
- if (!userData && key !== 'public')
728
- return [2 /*return*/, null];
729
- documentId = data.instanceId;
730
- collection = "/projects/" + this.clientConfig.projectId + "/classes/" + data.classId + "/instances";
731
- if (key === 'role') {
732
- documentId = userData.identity;
733
- collection += "/" + data.instanceId + "/roleState";
734
- }
735
- if (key === 'user') {
736
- documentId = userData.userId;
737
- collection += "/" + data.instanceId + "/userState";
738
- }
739
- console.log('-- getFirebaseListeners -- collection', collection, documentId);
740
- document = (0, firestore_2.doc)(this.firestore, collection, documentId);
741
- unsubscribe = (0, firestore_2.onSnapshot)(document, function (doc) {
742
- var data = Object.assign({}, doc.data());
743
- for (var _i = 0, _a = Object.keys(data); _i < _a.length; _i++) {
744
- var key_1 = _a[_i];
745
- if (key_1.startsWith('__'))
746
- delete data[key_1];
747
- }
748
- queue.next(data);
749
- });
750
- return [2 /*return*/, unsubscribe];
387
+ switch (_a.label) {
388
+ case 0:
389
+ if (!this.initialized)
390
+ throw new Error('Retter SDK not initialized.');
391
+ return [4 /*yield*/, this.sendToAuthQueue({ action: types_1.RetterActions.SIGN_IN, data: token })];
392
+ case 1: return [2 /*return*/, _a.sent()];
751
393
  }
752
394
  });
753
- }); };
754
- this.cleanFirebase = function () { return __awaiter(_this, void 0, void 0, function () {
395
+ });
396
+ };
397
+ Retter.prototype.signOut = function () {
398
+ return __awaiter(this, void 0, void 0, function () {
755
399
  return __generator(this, function (_a) {
756
400
  switch (_a.label) {
757
401
  case 0:
758
- // unsubscribe from all events
759
- this.cloudObjects.map(function (cloudObject) {
760
- cloudObject.unsubscribers.map(function (unsubscribe) { return unsubscribe && unsubscribe(); });
761
- });
762
- this.cloudObjects = [];
763
- if (!this.firebaseAuth) return [3 /*break*/, 2];
764
- return [4 /*yield*/, (0, auth_1.signOut)(this.firebaseAuth)];
402
+ if (!this.initialized)
403
+ throw new Error('Retter SDK not initialized.');
404
+ return [4 /*yield*/, this.clearCloudObjects()];
765
405
  case 1:
766
406
  _a.sent();
767
- _a.label = 2;
407
+ return [4 /*yield*/, this.auth.clearTokenData()
408
+ // Fire auth status after all tokens cleared
409
+ ];
768
410
  case 2:
769
- this.firebaseApp = null;
770
- this.firestore = null;
771
- this.firebaseAuth = null;
772
- console.log('-- cleanInitFirebase -- firebase app cleaned');
411
+ _a.sent();
412
+ // Fire auth status after all tokens cleared
413
+ this.fireAuthStatus({});
414
+ // dont wait for sign out to finish
415
+ this.auth.signOut();
773
416
  return [2 /*return*/];
774
417
  }
775
418
  });
776
- }); };
777
- this.isCosAction = function (action) {
778
- return ['rbs.core.request.INSTANCE', 'rbs.core.request.CALL', 'rbs.core.request.STATE'].includes(action);
779
- };
780
- this.getCosEndpoint = function (method, classId, instanceId, methodId) {
781
- var region = _this.getRegion();
782
- return "https://" + _this.clientConfig.projectId + "." + region.apiUrl + "/" + method + "/" + classId + (methodId ? '/' + methodId : '') + (instanceId ? '/' + instanceId : '');
783
- };
784
- this.getCloudObject = function (data) { return __awaiter(_this, void 0, void 0, function () {
785
- var instanceResponse, seekedObject, queues, state, unsubscribers, _a, _b, _c, _d, _e, _f, call, getState;
419
+ });
420
+ };
421
+ Retter.prototype.getCloudObject = function (config) {
422
+ var _a;
423
+ return __awaiter(this, void 0, void 0, function () {
424
+ var instance, seekedObject, roleQueue, userQueue, publicQueue, state, projectId, user, unsubscribers, call, getState, retVal;
786
425
  var _this = this;
787
- var _g, _h;
788
- return __generator(this, function (_j) {
789
- switch (_j.label) {
426
+ return __generator(this, function (_b) {
427
+ switch (_b.label) {
790
428
  case 0:
791
- console.log('-- getCloudObject -- data', data);
792
- if (data.useLocal && data.instanceId) {
429
+ if (!this.initialized)
430
+ throw new Error('Retter SDK not initialized.');
431
+ return [4 /*yield*/, this.sendToActionQueue({ action: types_1.RetterActions.COS_INSTANCE, data: config })];
432
+ case 1:
433
+ instance = _b.sent();
434
+ config.instanceId = instance.instanceId;
435
+ if (config.useLocal && config.instanceId) {
793
436
  return [2 /*return*/, {
794
- instanceId: data.instanceId,
795
- isNewInstance: true,
796
- methods: [],
797
- getState: function (params) { return __awaiter(_this, void 0, void 0, function () {
437
+ call: function (params) { return __awaiter(_this, void 0, void 0, function () {
798
438
  return __generator(this, function (_a) {
799
439
  switch (_a.label) {
800
- case 0: return [4 /*yield*/, this.send({
801
- action: 'rbs.core.request.STATE',
802
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
803
- token: params === null || params === void 0 ? void 0 : params.token,
440
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
441
+ action: types_1.RetterActions.COS_CALL,
442
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
804
443
  })];
805
444
  case 1: return [2 /*return*/, _a.sent()];
806
445
  }
807
446
  });
808
447
  }); },
809
- call: function (params) { return __awaiter(_this, void 0, void 0, function () {
448
+ getState: function (params) { return __awaiter(_this, void 0, void 0, function () {
810
449
  return __generator(this, function (_a) {
811
450
  switch (_a.label) {
812
- case 0: return [4 /*yield*/, this.send({
813
- action: 'rbs.core.request.CALL',
814
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
815
- token: params.token,
451
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
452
+ action: types_1.RetterActions.COS_STATE,
453
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
816
454
  })];
817
455
  case 1: return [2 /*return*/, _a.sent()];
818
456
  }
819
457
  });
820
458
  }); },
459
+ methods: [],
460
+ instanceId: config.instanceId,
461
+ isNewInstance: false,
821
462
  }];
822
463
  }
823
- return [4 /*yield*/, this.send({
824
- action: 'rbs.core.request.INSTANCE',
825
- data: data,
826
- token: data.token,
827
- })];
828
- case 1:
829
- instanceResponse = (_j.sent()).data;
830
- if (instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.instanceId)
831
- data.instanceId = instanceResponse.instanceId;
832
- seekedObject = this.cloudObjects.find(function (cloudObject) { return cloudObject.config.classId === data.classId && cloudObject.config.instanceId === data.instanceId; });
464
+ seekedObject = this.cloudObjects.find(function (r) { return r.config.classId === config.classId && r.config.instanceId === r.instanceId; });
833
465
  if (seekedObject) {
834
- seekedObject.methods = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods; // refresh methods.
835
466
  return [2 /*return*/, {
836
- instanceId: seekedObject.config.instanceId,
837
467
  call: seekedObject.call,
838
468
  state: seekedObject.state,
839
469
  getState: seekedObject.getState,
840
- methods: seekedObject.methods || [],
841
- isNewInstance: seekedObject.isNewInstance,
470
+ methods: instance.methods,
471
+ instanceId: config.instanceId,
472
+ isNewInstance: false,
842
473
  }];
843
474
  }
844
- queues = {
845
- roleQueue: new rxjs_1.ReplaySubject(1),
846
- userQueue: new rxjs_1.ReplaySubject(1),
847
- publicQueue: new rxjs_1.ReplaySubject(1),
848
- };
475
+ roleQueue = new rxjs_1.ReplaySubject(1);
476
+ userQueue = new rxjs_1.ReplaySubject(1);
477
+ publicQueue = new rxjs_1.ReplaySubject(1);
849
478
  state = {
850
- role: queues.roleQueue.asObservable(),
851
- user: queues.userQueue.asObservable(),
852
- public: queues.publicQueue.asObservable(),
479
+ role: roleQueue.asObservable(),
480
+ user: userQueue.asObservable(),
481
+ public: publicQueue.asObservable(),
853
482
  };
854
- unsubscribers = [];
855
- _b = (_a = unsubscribers).push;
856
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.roleQueue, 'role')];
483
+ projectId = this.clientConfig.projectId;
484
+ return [4 /*yield*/, this.auth.getCurrentUser()];
857
485
  case 2:
858
- _b.apply(_a, [_j.sent()]);
859
- _d = (_c = unsubscribers).push;
860
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.userQueue, 'user')];
861
- case 3:
862
- _d.apply(_c, [_j.sent()]);
863
- _f = (_e = unsubscribers).push;
864
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.publicQueue, 'public')];
865
- case 4:
866
- _f.apply(_e, [_j.sent()]);
486
+ user = _b.sent();
487
+ unsubscribers = [];
488
+ unsubscribers.push(this.getFirebaseListener(publicQueue, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances"), config.instanceId));
489
+ unsubscribers.push(this.getFirebaseListener(userQueue, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances/").concat(config.instanceId, "/userState"), user.userId));
490
+ unsubscribers.push(this.getFirebaseListener(roleQueue, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances/").concat(config.instanceId, "/roleState"), user.identity));
867
491
  call = function (params) { return __awaiter(_this, void 0, void 0, function () {
868
492
  return __generator(this, function (_a) {
869
493
  switch (_a.label) {
870
- case 0: return [4 /*yield*/, this.send({
871
- action: 'rbs.core.request.CALL',
872
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
873
- token: params.token,
494
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
495
+ action: types_1.RetterActions.COS_CALL,
496
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
874
497
  })];
875
498
  case 1: return [2 /*return*/, _a.sent()];
876
499
  }
@@ -879,259 +502,37 @@ var RBS = /** @class */ (function () {
879
502
  getState = function (params) { return __awaiter(_this, void 0, void 0, function () {
880
503
  return __generator(this, function (_a) {
881
504
  switch (_a.label) {
882
- case 0: return [4 /*yield*/, this.send({
883
- action: 'rbs.core.request.STATE',
884
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
885
- token: params === null || params === void 0 ? void 0 : params.token,
505
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
506
+ action: types_1.RetterActions.COS_STATE,
507
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
886
508
  })];
887
509
  case 1: return [2 /*return*/, _a.sent()];
888
510
  }
889
511
  });
890
512
  }); };
891
- this.cloudObjects.push({
892
- config: data,
893
- isNewInstance: (_g = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.newInstance) !== null && _g !== void 0 ? _g : false,
894
- methods: instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods,
895
- response: instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.response,
513
+ retVal = {
896
514
  call: call,
897
515
  state: state,
898
516
  getState: getState,
899
- unsubscribers: unsubscribers,
900
- });
901
- return [2 /*return*/, {
902
- instanceId: data.instanceId,
903
- state: state,
904
- call: call,
905
- getState: getState,
906
- isNewInstance: (_h = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.newInstance) !== null && _h !== void 0 ? _h : false,
907
- methods: (instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods) || [],
908
- response: instanceResponse.response,
909
- }];
517
+ methods: instance.methods,
518
+ instanceId: config.instanceId,
519
+ isNewInstance: (_a = instance.isNewInstance) !== null && _a !== void 0 ? _a : false,
520
+ };
521
+ this.cloudObjects.push(__assign(__assign({}, retVal), { config: config, unsubscribers: unsubscribers }));
522
+ return [2 /*return*/, retVal];
910
523
  }
911
524
  });
912
- }); };
913
- }
914
- RBS.prototype.isNode = function () {
915
- return typeof window === 'undefined';
525
+ });
916
526
  };
917
- Object.defineProperty(RBS.prototype, "authStatus", {
527
+ Object.defineProperty(Retter.prototype, "authStatus", {
918
528
  get: function () {
919
529
  return this.authStatusSubject.asObservable().pipe((0, operators_1.distinctUntilChanged)(function (a, b) { return a.authStatus === b.authStatus && a.identity === b.identity && a.uid === b.uid; }));
920
- // .pipe(debounce(() => timer(100)))
921
530
  },
922
531
  enumerable: false,
923
532
  configurable: true
924
533
  });
925
- RBS.clearTokens = function () {
926
- if (typeof document != 'undefined') {
927
- // I'm on the web!
928
- // Browser environment
929
- for (var key in localStorage) {
930
- if (key.startsWith(RBS_TOKENS_KEY))
931
- localStorage.removeItem(key);
932
- }
933
- }
934
- };
935
- RBS.getInstance = function (config) {
936
- if (config === void 0) { config = null; }
937
- if (!RBS.instances)
938
- RBS.instances = [];
939
- var instance = RBS.instances.find(function (i) { var _a; return ((_a = i.clientConfig) === null || _a === void 0 ? void 0 : _a.projectId) === (config === null || config === void 0 ? void 0 : config.projectId); });
940
- if (!instance) {
941
- instance = new RBS();
942
- if (config) {
943
- instance.init(config);
944
- }
945
- RBS.instances.push(instance);
946
- }
947
- return instance;
948
- };
949
- RBS.dispose = function () {
950
- RBS.instances = [];
951
- };
952
- RBS.prototype.init = function (config) {
953
- var _this = this;
954
- if (this.initialized)
955
- throw new Error('RBS SDK already initialized.');
956
- this.initialized = true;
957
- var axiosRequestConfiguration = {
958
- responseType: 'json',
959
- headers: {
960
- 'Content-Type': 'application/json',
961
- },
962
- timeout: 30000,
963
- };
964
- this.axiosInstance = (0, axiosSetup_1.default)(axiosRequestConfiguration);
965
- config.logLevel ? loglevel_1.default.setLevel(config.logLevel) : loglevel_1.default.setLevel('ERROR');
966
- this.clientConfig = config;
967
- if (!this.clientConfig.region)
968
- this.clientConfig.region = RbsRegion.euWest1;
969
- var incomingAction = this.commandQueue.asObservable();
970
- var actionResult = incomingAction.pipe((0, operators_1.concatMap)(function (action) { return __awaiter(_this, void 0, void 0, function () {
971
- var actionWrapper;
972
- return __generator(this, function (_a) {
973
- switch (_a.label) {
974
- case 0:
975
- actionWrapper = {
976
- action: action,
977
- };
978
- return [4 /*yield*/, this.getActionWithTokenData(actionWrapper)];
979
- case 1: return [2 /*return*/, _a.sent()];
980
- }
981
- });
982
- }); }), (0, operators_1.tap)(function (actionWrapper) {
983
- _this.fireAuthStatus(actionWrapper.tokenData);
984
- }), (0, operators_1.filter)(function (actionWrapper) { return actionWrapper.tokenData != null; }), (0, operators_1.tap)(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
985
- return __generator(this, function (_a) {
986
- switch (_a.label) {
987
- case 0: return [4 /*yield*/, this.setTokenData(actionWrapper.tokenData)];
988
- case 1:
989
- _a.sent();
990
- return [2 /*return*/];
991
- }
992
- });
993
- }); }), (0, operators_1.mergeMap)(function (ev) {
994
- var _a;
995
- var endpoint = ev.tokenData.isServiceToken ? '/service/action' : '/user/action';
996
- var action = ev.action.action;
997
- var actionType = action.split('.')[2];
998
- endpoint = endpoint + "/" + _this.clientConfig.projectId + "/" + action;
999
- endpoint = _this.getBaseUrl(action) + _this.getServiceEndpoint(ev);
1000
- if ((_a = ev.action) === null || _a === void 0 ? void 0 : _a.token) {
1001
- ev.tokenData.accessToken = ev.action.token;
1002
- }
1003
- if (_this.isCosAction(action)) {
1004
- var cosData = ev.action.data;
1005
- endpoint = _this.getCosEndpoint(action.split('.')[3], cosData.classId, cosData.key ? cosData.key.name + "!" + cosData.key.value : cosData.instanceId, cosData.method);
1006
- return (0, rxjs_1.defer)(function () { return _this.request(endpoint, ev); }).pipe((0, operators_1.materialize)());
1007
- }
1008
- if (action !== 'signInAnonym') {
1009
- if (actionType === 'get') {
1010
- return (0, rxjs_1.defer)(function () { return _this.get(endpoint, ev); }).pipe((0, operators_1.materialize)());
1011
- }
1012
- else {
1013
- return (0, rxjs_1.defer)(function () { return _this.post(endpoint, ev); }).pipe((0, operators_1.materialize)());
1014
- }
1015
- }
1016
- return (0, rxjs_1.defer)(function () { }).pipe((0, operators_1.materialize)());
1017
- }), (0, operators_1.share)());
1018
- actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; })).subscribe(function (e) {
1019
- var _a, _b, _c;
1020
- if ((_b = (_a = e.value) === null || _a === void 0 ? void 0 : _a.action) === null || _b === void 0 ? void 0 : _b.onSuccess) {
1021
- if (e.value.action.generateGetUrl) {
1022
- e.value.action.onSuccess(e.value.url);
1023
- }
1024
- else {
1025
- e.value.action.onSuccess((_c = e.value) === null || _c === void 0 ? void 0 : _c.response);
1026
- }
1027
- }
1028
- });
1029
- actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
1030
- var _a, _b;
1031
- if (e.error) {
1032
- var actionWrapper = e.error;
1033
- if ((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.onError) {
1034
- (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.onError(actionWrapper.responseError);
1035
- }
1036
- }
1037
- });
1038
- // Custom auth
1039
- var customAuthResult = this.customAuthQueue.pipe((0, operators_1.concatMap)(function (action) {
1040
- var actionWrapper = {
1041
- action: action,
1042
- };
1043
- return (0, rxjs_1.defer)(function () {
1044
- var userId = (0, jwt_decode_1.default)(action.data.token).userId;
1045
- var url = _this.getApiUrl() + "/CALL/ProjectUser/authWithCustomToken/" + _this.clientConfig.projectId + "_" + userId;
1046
- console.log('-- custom auth -- userId: ', userId);
1047
- return _this.getPlain(url, { customToken: action.data.token }, actionWrapper);
1048
- }).pipe((0, operators_1.materialize)());
1049
- }), (0, operators_1.share)());
1050
- customAuthResult
1051
- .pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; }), (0, operators_1.map)(function (e) {
1052
- var actionWrapper = e.value;
1053
- actionWrapper.tokenData = {
1054
- accessToken: actionWrapper.response.data.accessToken,
1055
- refreshToken: actionWrapper.response.data.refreshToken,
1056
- isServiceToken: false,
1057
- accessTokenExpiresAt: 0,
1058
- refreshTokenExpiresAt: 0,
1059
- };
1060
- if (actionWrapper.response.data.firebase) {
1061
- actionWrapper.tokenData.firebase = {
1062
- apiKey: actionWrapper.response.data.firebase.apiKey,
1063
- projectId: actionWrapper.response.data.firebase.projectId,
1064
- customToken: actionWrapper.response.data.firebase.customToken,
1065
- };
1066
- }
1067
- return actionWrapper;
1068
- }), (0, operators_1.tap)(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1069
- return __generator(this, function (_a) {
1070
- switch (_a.label) {
1071
- case 0: return [4 /*yield*/, this.cleanFirebase()];
1072
- case 1:
1073
- _a.sent();
1074
- if (!actionWrapper.tokenData) return [3 /*break*/, 4];
1075
- return [4 /*yield*/, this.setTokenData(actionWrapper.tokenData)];
1076
- case 2:
1077
- _a.sent();
1078
- return [4 /*yield*/, this.initFirebase()];
1079
- case 3:
1080
- _a.sent();
1081
- _a.label = 4;
1082
- case 4:
1083
- this.fireAuthStatus(actionWrapper.tokenData);
1084
- console.log('-- customAuthResult -- auth status fired');
1085
- return [2 /*return*/];
1086
- }
1087
- });
1088
- }); }))
1089
- .subscribe(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1090
- var authEvent, _a;
1091
- return __generator(this, function (_b) {
1092
- switch (_b.label) {
1093
- case 0:
1094
- _a = this.getAuthChangedEvent;
1095
- return [4 /*yield*/, this.getStoredTokenData()];
1096
- case 1:
1097
- authEvent = _a.apply(this, [_b.sent()]);
1098
- if (actionWrapper.action.onSuccess) {
1099
- actionWrapper.action.onSuccess(authEvent);
1100
- }
1101
- return [2 /*return*/];
1102
- }
1103
- });
1104
- }); });
1105
- customAuthResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
1106
- var _a, _b;
1107
- console.log('-- customAuthResult ', e);
1108
- if (e.error) {
1109
- var actionWrapper = e.error;
1110
- if ((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.onError) {
1111
- (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.onError({
1112
- authStatus: RBSAuthStatus.AUTH_FAILED,
1113
- message: actionWrapper.responseError,
1114
- });
1115
- }
1116
- }
1117
- });
1118
- this.authStatus.subscribe();
1119
- setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
1120
- var _a;
1121
- return __generator(this, function (_b) {
1122
- switch (_b.label) {
1123
- case 0:
1124
- _a = this.fireAuthStatus;
1125
- return [4 /*yield*/, this.getStoredTokenData()];
1126
- case 1:
1127
- _a.apply(this, [_b.sent()]);
1128
- return [2 /*return*/];
1129
- }
1130
- });
1131
- }); }, 1);
1132
- };
1133
- RBS.instances = null;
1134
- return RBS;
534
+ Retter.instances = [];
535
+ return Retter;
1135
536
  }());
1136
- exports.default = RBS;
537
+ exports.default = Retter;
1137
538
  //# sourceMappingURL=index.js.map