@retter/sdk 0.1.14 → 0.2.2

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,838 +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*/, 9];
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*/, 8];
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, 6, , 7]);
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
- if (!!this.firebaseApp) return [3 /*break*/, 5];
262
- return [4 /*yield*/, this.initFirebase()];
263
- case 4:
264
- _c.sent();
265
- _c.label = 5;
266
- case 5: return [3 /*break*/, 7];
267
- case 6:
268
- err_1 = _c.sent();
269
- this.signOut();
270
- return [3 /*break*/, 7];
271
- case 7:
272
- loglevel_1.default.info('RBSSDK LOG: refreshed tokenData:', actionWrapper.tokenData);
273
- _c.label = 8;
274
- case 8: return [3 /*break*/, 13];
275
- case 9:
276
- loglevel_1.default.info('RBSSDK LOG: getting anonym token');
277
- url = this.getApiUrl() + "/INSTANCE/ProjectUser";
278
- params = {
279
- projectId: this.clientConfig.projectId,
280
- };
281
- _b = actionWrapper;
282
- return [4 /*yield*/, this.getP(url, params)];
283
- case 10:
284
- _b.tokenData = (_c.sent()).response;
285
- if (!!this.firebaseApp) return [3 /*break*/, 12];
286
- return [4 /*yield*/, this.initFirebase()];
287
- case 11:
288
- _c.sent();
289
- _c.label = 12;
290
- case 12:
291
- loglevel_1.default.info('RBSSDK LOG: fetched anonym token:', actionWrapper.tokenData);
292
- _c.label = 13;
293
- case 13:
294
- loglevel_1.default.info('RBSSDK LOG: resolving with actionWrapper:', actionWrapper);
295
- resolve(actionWrapper);
296
- return [2 /*return*/];
128
+ error_1 = _a.sent();
129
+ throw { action: action, responseError: error_1 };
130
+ case 3: return [2 /*return*/];
297
131
  }
298
132
  });
299
- }); });
300
- };
301
- 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 () {
302
138
  return __generator(this, function (_a) {
303
139
  switch (_a.label) {
304
- case 0: return [4 /*yield*/, this.axiosInstance.get(url, { params: queryParams })];
305
- case 1: return [2 /*return*/, (_a.sent()).data];
306
- }
307
- });
308
- }); };
309
- this.getPlatform = function () {
310
- var _a;
311
- return ((_a = _this.clientConfig) === null || _a === void 0 ? void 0 : _a.platform) ? _this.clientConfig.platform : 'WEB';
312
- };
313
- this.request = function (url, actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
314
- var data, params, key, _a, config, request, response, error_1;
315
- var _b, _c, _d;
316
- return __generator(this, function (_e) {
317
- switch (_e.label) {
318
- case 0:
319
- data = (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.data;
320
- params = {
321
- _token: (_c = actionWrapper.tokenData) === null || _c === void 0 ? void 0 : _c.accessToken,
322
- };
323
- for (key in data.queryStringParams || []) {
324
- params[key] = data.queryStringParams[key];
325
- }
326
- _e.label = 1;
140
+ case 0: return [4 /*yield*/, this.clearCloudObjects()];
327
141
  case 1:
328
- _e.trys.push([1, 3, , 4]);
329
- if (!this.axiosInstance)
330
- throw new Error('Axios instance is null');
331
- return [4 /*yield*/, this.axiosInstance({
332
- url: url,
333
- method: (_d = data.httpMethod) !== null && _d !== void 0 ? _d : 'post',
334
- params: params,
335
- data: data.body,
336
- headers: __assign(__assign({}, data.headers), { accept: 'text/plain', 'Content-Type': 'text/plain' }),
337
- })];
338
- case 2:
339
- _a = _e.sent(), config = _a.config, request = _a.request, response = __rest(_a, ["config", "request"]);
340
- actionWrapper.response = response;
341
- return [2 /*return*/, actionWrapper];
342
- case 3:
343
- error_1 = _e.sent();
344
- actionWrapper.response = error_1.response;
345
- actionWrapper.responseError = error_1;
346
- throw actionWrapper;
347
- case 4: return [2 /*return*/];
348
- }
349
- });
350
- }); };
351
- this.post = function (url, actionWrapper) {
352
- return new Promise(function (resolve, reject) {
353
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
354
- var params = {
355
- auth: (_a = actionWrapper.tokenData) === null || _a === void 0 ? void 0 : _a.accessToken,
356
- };
357
- var data = (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.data;
358
- if ((_c = actionWrapper.action) === null || _c === void 0 ? void 0 : _c.targetServiceId) {
359
- params.targetServiceId = (_d = actionWrapper.action) === null || _d === void 0 ? void 0 : _d.targetServiceId;
360
- }
361
- if ((_e = actionWrapper.action) === null || _e === void 0 ? void 0 : _e.relatedUserId) {
362
- params.relatedUserId = (_f = actionWrapper.action) === null || _f === void 0 ? void 0 : _f.relatedUserId;
363
- }
364
- if ((_g = actionWrapper.action) === null || _g === void 0 ? void 0 : _g.headers) {
365
- params.headers = base64_1.default.urlEncode(JSON.stringify((_h = actionWrapper.action) === null || _h === void 0 ? void 0 : _h.headers));
366
- }
367
- if ((_j = actionWrapper.action) === null || _j === void 0 ? void 0 : _j.culture) {
368
- params.culture = actionWrapper.action.culture;
369
- }
370
- if ((_k = actionWrapper.action) === null || _k === void 0 ? void 0 : _k.pop) {
371
- params.pop = 'true';
142
+ _a.sent();
143
+ if (ev.tokenData) {
144
+ this.initFirebase(ev);
145
+ }
146
+ return [2 /*return*/];
372
147
  }
373
- params.platform = _this.getPlatform();
374
- _this.axiosInstance.post(url, data, {
375
- params: params,
376
- })
377
- .then(function (resp) {
378
- actionWrapper.response = resp.data;
379
- resolve(actionWrapper);
380
- })
381
- .catch(function (err) {
382
- actionWrapper.responseError = err;
383
- reject(actionWrapper);
384
- });
385
148
  });
386
- };
387
- this.getParams = function (actionWrapper) {
388
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
389
- var params = {
390
- auth: (_a = actionWrapper.tokenData) === null || _a === void 0 ? void 0 : _a.accessToken,
391
- };
392
- if ((_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.data) {
393
- var data = ((_c = actionWrapper.action) === null || _c === void 0 ? void 0 : _c.data) ? (_d = actionWrapper.action) === null || _d === void 0 ? void 0 : _d.data : {};
394
- params.data = base64_1.default.urlEncode(JSON.stringify(data));
395
- }
396
- if ((_e = actionWrapper.action) === null || _e === void 0 ? void 0 : _e.targetServiceId) {
397
- params.targetServiceId = (_f = actionWrapper.action) === null || _f === void 0 ? void 0 : _f.targetServiceId;
398
- }
399
- if ((_g = actionWrapper.action) === null || _g === void 0 ? void 0 : _g.relatedUserId) {
400
- params.relatedUserId = (_h = actionWrapper.action) === null || _h === void 0 ? void 0 : _h.relatedUserId;
401
- }
402
- if ((_j = actionWrapper.action) === null || _j === void 0 ? void 0 : _j.headers) {
403
- 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));
404
154
  }
405
- if ((_l = actionWrapper.action) === null || _l === void 0 ? void 0 : _l.culture) {
406
- 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);
407
165
  }
408
- if ((_m = actionWrapper.action) === null || _m === void 0 ? void 0 : _m.pop) {
409
- 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);
410
184
  }
411
- params.platform = _this.getPlatform();
412
- return params;
413
- };
414
- this.get = function (url, actionWrapper) {
415
- return new Promise(function (resolve, reject) {
416
- var _a;
417
- var _b, _c;
418
- var params = _this.getParams(actionWrapper);
419
- if ((_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.generateGetUrl) {
420
- // Don't get from server but just return get url
421
- var url_1 = _this.getBaseUrl(actionWrapper.action.action) + _this.getServiceEndpoint(actionWrapper) + '?';
422
- for (var _i = 0, _d = Object.keys(params); _i < _d.length; _i++) {
423
- var k = _d[_i];
424
- url_1 = "" + url_1 + k + "=" + params[k] + "&";
425
- }
426
- actionWrapper.url = url_1;
427
- resolve(actionWrapper);
428
- }
429
- else {
430
- _this.axiosInstance.get(url, {
431
- params: params,
432
- headers: __assign((_a = {}, _a['Content-Type'] = 'text/plain', _a), (_c = actionWrapper.action) === null || _c === void 0 ? void 0 : _c.headers),
433
- })
434
- .then(function (resp) {
435
- actionWrapper.response = resp.data;
436
- resolve(actionWrapper);
437
- })
438
- .catch(function (err) {
439
- actionWrapper.responseError = err;
440
- reject(actionWrapper);
441
- });
442
- }
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
+ })];
443
195
  });
444
- };
445
- this.getPlain = function (url, params, actionWrapper) {
446
- return new Promise(function (resolve, reject) {
447
- _this.axiosInstance.get(url, {
448
- params: params,
449
- })
450
- .then(function (resp) {
451
- actionWrapper.response = resp;
452
- resolve(actionWrapper);
453
- })
454
- .catch(function (err) {
455
- actionWrapper.responseError = err;
456
- reject(actionWrapper);
457
- });
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
+ })];
458
205
  });
459
- };
460
- this.getSafeNow = function () {
461
- return Math.round(new Date().getTime() / 1000) + 30; // Plus 30 seconds, just in case.
462
- };
463
- 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;
464
212
  var _a;
465
- return RBS_TOKENS_KEY + "." + ((_a = _this.clientConfig) === null || _a === void 0 ? void 0 : _a.projectId);
466
- };
467
- this.setTokenData = function (tokenData) { return __awaiter(_this, void 0, void 0, function () {
468
- return __generator(this, function (_a) {
469
- switch (_a.label) {
213
+ return __generator(this, function (_b) {
214
+ switch (_b.label) {
470
215
  case 0:
471
- if (!(typeof document != 'undefined')) return [3 /*break*/, 1];
472
- // I'm on the web!
473
- // Browser environment
474
- localStorage.setItem(this.getTokenDataKey(), JSON.stringify(tokenData));
475
- return [3 /*break*/, 4];
216
+ _b.trys.push([0, 3, , 4]);
217
+ _a = { action: action };
218
+ return [4 /*yield*/, this.auth.getTokenData()];
476
219
  case 1:
477
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 3];
478
- // I'm in react-native
479
- 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)];
480
222
  case 2:
481
- // I'm in react-native
482
- _a.sent();
483
- return [3 /*break*/, 4];
223
+ _b.sent();
224
+ return [2 /*return*/, ev];
484
225
  case 3:
485
- // I'm in node js
486
- // Node environment
487
- this.latestTokenData = tokenData;
488
- _a.label = 4;
226
+ error_2 = _b.sent();
227
+ this.signOut();
228
+ return [2 /*return*/, { action: action }];
489
229
  case 4: return [2 /*return*/];
490
230
  }
491
231
  });
492
- }); };
493
- // PUBLIC METHODS
494
- this.getStoredTokenData = function () { return __awaiter(_this, void 0, void 0, function () {
495
- 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 () {
496
240
  return __generator(this, function (_a) {
497
241
  switch (_a.label) {
498
- case 0:
499
- if (!(typeof document != 'undefined')) return [3 /*break*/, 1];
500
- storedTokenData = localStorage.getItem(this.getTokenDataKey());
501
- if (storedTokenData) {
502
- data = JSON.parse(storedTokenData);
503
- accessTokenExpiresAt = (0, jwt_decode_1.default)(data.accessToken).exp || 0;
504
- refreshTokenExpiresAt = (0, jwt_decode_1.default)(data.refreshToken).exp || 0;
505
- data.accessTokenExpiresAt = accessTokenExpiresAt;
506
- data.refreshTokenExpiresAt = refreshTokenExpiresAt;
507
- return [2 /*return*/, data];
508
- }
509
- else {
510
- return [2 /*return*/, undefined];
511
- }
512
- return [3 /*break*/, 4];
242
+ case 0: return [4 /*yield*/, this.auth.storeTokenData(actionWrapper.tokenData)];
513
243
  case 1:
514
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 3];
515
- return [4 /*yield*/, async_storage_1.default.getItem(this.getTokenDataKey())];
516
- case 2:
517
- storedTokenData = _a.sent();
518
- if (storedTokenData) {
519
- data = JSON.parse(storedTokenData);
520
- accessTokenExpiresAt = (0, jwt_decode_1.default)(data.accessToken).exp || 0;
521
- refreshTokenExpiresAt = (0, jwt_decode_1.default)(data.refreshToken).exp || 0;
522
- data.accessTokenExpiresAt = accessTokenExpiresAt;
523
- data.refreshTokenExpiresAt = refreshTokenExpiresAt;
524
- return [2 /*return*/, data];
525
- }
526
- else {
527
- return [2 /*return*/, undefined];
528
- }
529
- return [3 /*break*/, 4];
530
- case 3:
531
- // Node environment
532
- return [2 /*return*/, this.latestTokenData];
533
- case 4: return [2 /*return*/];
244
+ _a.sent();
245
+ return [2 /*return*/];
534
246
  }
535
247
  });
536
- }); };
537
- this.getUser = function () { return __awaiter(_this, void 0, void 0, function () {
538
- 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;
539
258
  return __generator(this, function (_a) {
540
259
  switch (_a.label) {
541
- 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)];
542
263
  case 1:
543
- tokenData = _a.sent();
544
- if (!tokenData)
545
- return [2 /*return*/, null];
546
- return [2 /*return*/, (0, jwt_decode_1.default)(tokenData.accessToken)];
547
- }
548
- });
549
- }); };
550
- this.generatePublicGetActionUrl = function (action) {
551
- var actionWrapper = {
552
- action: action,
553
- tokenData: {
554
- isServiceToken: false,
555
- accessToken: '',
556
- refreshToken: '',
557
- accessTokenExpiresAt: 0,
558
- refreshTokenExpiresAt: 0,
559
- },
560
- };
561
- var params = _this.getParams(actionWrapper);
562
- // Don't get from server but just return get url
563
- var url = _this.getBaseUrl(actionWrapper.action.action) + _this.getServiceEndpoint(actionWrapper) + '?';
564
- for (var _i = 0, _a = Object.keys(params); _i < _a.length; _i++) {
565
- var k = _a[_i];
566
- url = "" + url + k + "=" + params[k] + "&";
567
- }
568
- return url;
569
- };
570
- this.generateGetActionUrl = function (action) {
571
- if (!_this.initialized)
572
- throw new Error('RBS SDK is not initialized');
573
- if (!action.culture)
574
- action.culture = 'en-US';
575
- return new Promise(function (resolve, reject) {
576
- if (!action.onSuccess && !action.onError) {
577
- action.onSuccess = resolve;
578
- action.onError = reject;
264
+ response = _a.sent();
265
+ return [2 /*return*/, __assign(__assign({}, actionWrapper), { response: response })];
579
266
  }
580
- action.generateGetUrl = true;
581
- _this.commandQueue.next(action);
582
267
  });
583
- };
584
- this.send = function (action) {
585
- if (!_this.initialized)
586
- throw new Error('RBS SDK is not initialized');
587
- if (!action.culture)
588
- action.culture = 'en-US';
589
- return new Promise(function (resolve, reject) {
590
- if (!action.onSuccess && !action.onError) {
591
- action.onSuccess = resolve;
592
- 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];
593
292
  }
594
- _this.commandQueue.next(action);
595
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,
596
308
  };
597
- this.authenticateWithCustomToken = function (token) {
598
- if (!_this.initialized)
599
- throw new Error('RBS SDK is not initialized');
600
- return new Promise(function (resolve, reject) {
601
- var action = {
602
- action: 'customauth',
603
- data: {
604
- token: token,
605
- },
606
- onSuccess: resolve,
607
- onError: reject,
608
- };
609
- _this.customAuthQueue.next(action);
610
- });
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' }),
611
317
  };
612
- 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 () {
613
353
  return __generator(this, function (_a) {
614
354
  switch (_a.label) {
615
- case 0: return [4 /*yield*/, this.send({
616
- action: 'signInAnonym',
617
- data: {},
618
- })];
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)];
619
360
  case 1:
620
361
  _a.sent();
362
+ _a.label = 2;
363
+ case 2:
364
+ this.clearFirebase();
621
365
  return [2 /*return*/];
622
366
  }
623
367
  });
624
- }); };
625
- 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 () {
626
373
  return __generator(this, function (_a) {
627
374
  switch (_a.label) {
628
375
  case 0:
629
376
  if (!this.initialized)
630
- throw new Error('RBS SDK is not initialized');
631
- console.log('Signing out...');
632
- return [4 /*yield*/, this.cleanInitFirebase()];
633
- case 1:
634
- _a.sent();
635
- return [4 /*yield*/, this.logoutUser()];
636
- case 2:
637
- _a.sent();
638
- if (!(typeof document != 'undefined')) return [3 /*break*/, 3];
639
- localStorage.removeItem(this.getTokenDataKey());
640
- return [3 /*break*/, 6];
641
- case 3:
642
- if (!(typeof navigator != 'undefined' && navigator.product == 'ReactNative')) return [3 /*break*/, 5];
643
- return [4 /*yield*/, async_storage_1.default.removeItem(this.getTokenDataKey())];
644
- case 4:
645
- _a.sent();
646
- return [3 /*break*/, 6];
647
- case 5:
648
- this.latestTokenData = undefined;
649
- _a.label = 6;
650
- case 6:
651
- this.fireAuthStatus(undefined);
652
- return [2 /*return*/, true];
653
- }
654
- });
655
- }); };
656
- this.logoutUser = function () { return __awaiter(_this, void 0, void 0, function () {
657
- var _this = this;
658
- return __generator(this, function (_a) {
659
- return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
660
- var tokenData, userId, endpoint, err_2;
661
- return __generator(this, function (_a) {
662
- switch (_a.label) {
663
- case 0: return [4 /*yield*/, this.getStoredTokenData()];
664
- case 1:
665
- tokenData = _a.sent();
666
- userId = tokenData ? (0, jwt_decode_1.default)(tokenData.accessToken).userId : '';
667
- endpoint = this.getApiUrl() + "/CALL/ProjectUser/signOut/" + this.clientConfig.projectId + "_" + userId;
668
- _a.label = 2;
669
- case 2:
670
- _a.trys.push([2, 4, , 5]);
671
- return [4 /*yield*/, this.getP(endpoint, {
672
- accessToken: tokenData === null || tokenData === void 0 ? void 0 : tokenData.accessToken,
673
- })];
674
- case 3:
675
- _a.sent();
676
- return [3 /*break*/, 5];
677
- case 4:
678
- err_2 = _a.sent();
679
- return [3 /*break*/, 5];
680
- case 5:
681
- resolve(true);
682
- return [2 /*return*/];
683
- }
684
- });
685
- }); })];
686
- });
687
- }); };
688
- this.initFirebase = function () { return __awaiter(_this, void 0, void 0, function () {
689
- var firebaseConfig, fireUser;
690
- var _a;
691
- return __generator(this, function (_b) {
692
- switch (_b.label) {
693
- case 0: return [4 /*yield*/, this.getStoredTokenData()];
694
- case 1:
695
- firebaseConfig = (_a = (_b.sent())) === null || _a === void 0 ? void 0 : _a.firebase;
696
- console.log('-- initFirebase -- firebaseConfig', firebaseConfig);
697
- if (!firebaseConfig)
698
- return [2 /*return*/];
699
- if (!!this.firebaseApp) return [3 /*break*/, 4];
700
- console.log('-- initFirebase -- firebase app not defined');
701
- this.firebaseApp = (0, app_1.initializeApp)({
702
- apiKey: firebaseConfig.apiKey,
703
- authDomain: firebaseConfig.projectId + '.firebaseapp.com',
704
- projectId: firebaseConfig.projectId,
705
- });
706
- this.firestore = (0, firestore_1.getFirestore)(this.firebaseApp);
707
- this.firebaseAuth = (0, auth_1.getAuth)(this.firebaseApp);
708
- return [4 /*yield*/, (0, auth_1.signInWithCustomToken)(this.firebaseAuth, firebaseConfig.customToken)];
709
- case 2:
710
- fireUser = _b.sent();
711
- return [4 /*yield*/, fireUser.user.getIdToken()];
712
- case 3:
713
- _b.sent();
714
- console.log('-- initFirebase -- firebase authenticated');
715
- _b.label = 4;
716
- case 4: return [2 /*return*/];
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()];
717
380
  }
718
381
  });
719
- }); };
720
- this.getFirebaseListeners = function (data, queue, key) { return __awaiter(_this, void 0, void 0, function () {
721
- var userData, documentId, collection, document, unsubscribe;
382
+ });
383
+ };
384
+ Retter.prototype.authenticateWithCustomToken = function (token) {
385
+ return __awaiter(this, void 0, void 0, function () {
722
386
  return __generator(this, function (_a) {
723
387
  switch (_a.label) {
724
- case 0: return [4 /*yield*/, this.getUser()];
725
- case 1:
726
- userData = _a.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];
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.cleanInitFirebase = 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 (!!this.firebaseApp) return [3 /*break*/, 3];
831
- console.log('-- getCloudObject -- firebase app not defined');
832
- return [4 /*yield*/, this.initFirebase()];
833
- case 2:
834
- _j.sent();
835
- _j.label = 3;
836
- case 3:
837
- if (instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.instanceId)
838
- data.instanceId = instanceResponse.instanceId;
839
- 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; });
840
465
  if (seekedObject) {
841
- seekedObject.methods = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods; // refresh methods.
842
466
  return [2 /*return*/, {
843
- instanceId: seekedObject.config.instanceId,
844
467
  call: seekedObject.call,
845
468
  state: seekedObject.state,
846
469
  getState: seekedObject.getState,
847
- methods: seekedObject.methods || [],
848
- isNewInstance: seekedObject.isNewInstance,
470
+ methods: instance.methods,
471
+ instanceId: config.instanceId,
472
+ isNewInstance: false,
849
473
  }];
850
474
  }
851
- queues = {
852
- roleQueue: new rxjs_1.ReplaySubject(1),
853
- userQueue: new rxjs_1.ReplaySubject(1),
854
- publicQueue: new rxjs_1.ReplaySubject(1),
855
- };
475
+ roleQueue = new rxjs_1.ReplaySubject(1);
476
+ userQueue = new rxjs_1.ReplaySubject(1);
477
+ publicQueue = new rxjs_1.ReplaySubject(1);
856
478
  state = {
857
- role: queues.roleQueue.asObservable(),
858
- user: queues.userQueue.asObservable(),
859
- public: queues.publicQueue.asObservable(),
479
+ role: roleQueue.asObservable(),
480
+ user: userQueue.asObservable(),
481
+ public: publicQueue.asObservable(),
860
482
  };
483
+ projectId = this.clientConfig.projectId;
484
+ return [4 /*yield*/, this.auth.getCurrentUser()];
485
+ case 2:
486
+ user = _b.sent();
861
487
  unsubscribers = [];
862
- _b = (_a = unsubscribers).push;
863
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.roleQueue, 'role')];
864
- case 4:
865
- _b.apply(_a, [_j.sent()]);
866
- _d = (_c = unsubscribers).push;
867
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.userQueue, 'user')];
868
- case 5:
869
- _d.apply(_c, [_j.sent()]);
870
- _f = (_e = unsubscribers).push;
871
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.publicQueue, 'public')];
872
- case 6:
873
- _f.apply(_e, [_j.sent()]);
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));
874
491
  call = function (params) { return __awaiter(_this, void 0, void 0, function () {
875
492
  return __generator(this, function (_a) {
876
493
  switch (_a.label) {
877
- case 0: return [4 /*yield*/, this.send({
878
- action: 'rbs.core.request.CALL',
879
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
880
- 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 }),
881
497
  })];
882
498
  case 1: return [2 /*return*/, _a.sent()];
883
499
  }
@@ -886,259 +502,37 @@ var RBS = /** @class */ (function () {
886
502
  getState = function (params) { return __awaiter(_this, void 0, void 0, function () {
887
503
  return __generator(this, function (_a) {
888
504
  switch (_a.label) {
889
- case 0: return [4 /*yield*/, this.send({
890
- action: 'rbs.core.request.STATE',
891
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
892
- 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 }),
893
508
  })];
894
509
  case 1: return [2 /*return*/, _a.sent()];
895
510
  }
896
511
  });
897
512
  }); };
898
- this.cloudObjects.push({
899
- config: data,
900
- isNewInstance: (_g = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.newInstance) !== null && _g !== void 0 ? _g : false,
901
- methods: instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods,
902
- response: instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.response,
513
+ retVal = {
903
514
  call: call,
904
515
  state: state,
905
516
  getState: getState,
906
- unsubscribers: unsubscribers,
907
- });
908
- return [2 /*return*/, {
909
- instanceId: data.instanceId,
910
- state: state,
911
- call: call,
912
- getState: getState,
913
- isNewInstance: (_h = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.newInstance) !== null && _h !== void 0 ? _h : false,
914
- methods: (instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods) || [],
915
- response: instanceResponse.response,
916
- }];
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];
917
523
  }
918
524
  });
919
- }); };
920
- }
921
- RBS.prototype.isNode = function () {
922
- return typeof window === 'undefined';
525
+ });
923
526
  };
924
- Object.defineProperty(RBS.prototype, "authStatus", {
527
+ Object.defineProperty(Retter.prototype, "authStatus", {
925
528
  get: function () {
926
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; }));
927
- // .pipe(debounce(() => timer(100)))
928
530
  },
929
531
  enumerable: false,
930
532
  configurable: true
931
533
  });
932
- RBS.clearTokens = function () {
933
- if (typeof document != 'undefined') {
934
- // I'm on the web!
935
- // Browser environment
936
- for (var key in localStorage) {
937
- if (key.startsWith(RBS_TOKENS_KEY))
938
- localStorage.removeItem(key);
939
- }
940
- }
941
- };
942
- RBS.getInstance = function (config) {
943
- if (config === void 0) { config = null; }
944
- if (!RBS.instances)
945
- RBS.instances = [];
946
- 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); });
947
- if (!instance) {
948
- instance = new RBS();
949
- if (config) {
950
- instance.init(config);
951
- }
952
- RBS.instances.push(instance);
953
- }
954
- return instance;
955
- };
956
- RBS.dispose = function () {
957
- RBS.instances = [];
958
- };
959
- RBS.prototype.init = function (config) {
960
- var _this = this;
961
- if (this.initialized)
962
- throw new Error('RBS SDK already initialized.');
963
- this.initialized = true;
964
- var axiosRequestConfiguration = {
965
- responseType: 'json',
966
- headers: {
967
- 'Content-Type': 'application/json',
968
- },
969
- timeout: 30000,
970
- };
971
- this.axiosInstance = (0, axiosSetup_1.default)(axiosRequestConfiguration);
972
- config.logLevel ? loglevel_1.default.setLevel(config.logLevel) : loglevel_1.default.setLevel('ERROR');
973
- this.clientConfig = config;
974
- if (!this.clientConfig.region)
975
- this.clientConfig.region = RbsRegion.euWest1;
976
- var incomingAction = this.commandQueue.asObservable();
977
- var actionResult = incomingAction.pipe((0, operators_1.concatMap)(function (action) { return __awaiter(_this, void 0, void 0, function () {
978
- var actionWrapper;
979
- return __generator(this, function (_a) {
980
- switch (_a.label) {
981
- case 0:
982
- actionWrapper = {
983
- action: action,
984
- };
985
- return [4 /*yield*/, this.getActionWithTokenData(actionWrapper)];
986
- case 1: return [2 /*return*/, _a.sent()];
987
- }
988
- });
989
- }); }), (0, operators_1.tap)(function (actionWrapper) {
990
- _this.fireAuthStatus(actionWrapper.tokenData);
991
- }), (0, operators_1.filter)(function (actionWrapper) { return actionWrapper.tokenData != null; }), (0, operators_1.tap)(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
992
- return __generator(this, function (_a) {
993
- switch (_a.label) {
994
- case 0: return [4 /*yield*/, this.setTokenData(actionWrapper.tokenData)];
995
- case 1:
996
- _a.sent();
997
- return [2 /*return*/];
998
- }
999
- });
1000
- }); }), (0, operators_1.mergeMap)(function (ev) {
1001
- var _a;
1002
- var endpoint = ev.tokenData.isServiceToken ? '/service/action' : '/user/action';
1003
- var action = ev.action.action;
1004
- var actionType = action.split('.')[2];
1005
- endpoint = endpoint + "/" + _this.clientConfig.projectId + "/" + action;
1006
- endpoint = _this.getBaseUrl(action) + _this.getServiceEndpoint(ev);
1007
- if ((_a = ev.action) === null || _a === void 0 ? void 0 : _a.token) {
1008
- ev.tokenData.accessToken = ev.action.token;
1009
- }
1010
- if (_this.isCosAction(action)) {
1011
- var cosData = ev.action.data;
1012
- endpoint = _this.getCosEndpoint(action.split('.')[3], cosData.classId, cosData.key ? cosData.key.name + "!" + cosData.key.value : cosData.instanceId, cosData.method);
1013
- return (0, rxjs_1.defer)(function () { return _this.request(endpoint, ev); }).pipe((0, operators_1.materialize)());
1014
- }
1015
- if (action !== 'signInAnonym') {
1016
- if (actionType === 'get') {
1017
- return (0, rxjs_1.defer)(function () { return _this.get(endpoint, ev); }).pipe((0, operators_1.materialize)());
1018
- }
1019
- else {
1020
- return (0, rxjs_1.defer)(function () { return _this.post(endpoint, ev); }).pipe((0, operators_1.materialize)());
1021
- }
1022
- }
1023
- return (0, rxjs_1.defer)(function () { }).pipe((0, operators_1.materialize)());
1024
- }), (0, operators_1.share)());
1025
- actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; })).subscribe(function (e) {
1026
- var _a, _b, _c;
1027
- if ((_b = (_a = e.value) === null || _a === void 0 ? void 0 : _a.action) === null || _b === void 0 ? void 0 : _b.onSuccess) {
1028
- if (e.value.action.generateGetUrl) {
1029
- e.value.action.onSuccess(e.value.url);
1030
- }
1031
- else {
1032
- e.value.action.onSuccess((_c = e.value) === null || _c === void 0 ? void 0 : _c.response);
1033
- }
1034
- }
1035
- });
1036
- actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
1037
- var _a, _b;
1038
- if (e.error) {
1039
- var actionWrapper = e.error;
1040
- if ((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.onError) {
1041
- (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.onError(actionWrapper.responseError);
1042
- }
1043
- }
1044
- });
1045
- // Custom auth
1046
- var customAuthResult = this.customAuthQueue.pipe((0, operators_1.concatMap)(function (action) {
1047
- var actionWrapper = {
1048
- action: action,
1049
- };
1050
- return (0, rxjs_1.defer)(function () {
1051
- var userId = (0, jwt_decode_1.default)(action.data.token).userId;
1052
- var url = _this.getApiUrl() + "/CALL/ProjectUser/authWithCustomToken/" + _this.clientConfig.projectId + "_" + userId;
1053
- console.log('-- custom auth -- userId: ', userId);
1054
- return _this.getPlain(url, { customToken: action.data.token }, actionWrapper);
1055
- }).pipe((0, operators_1.materialize)());
1056
- }), (0, operators_1.share)());
1057
- customAuthResult
1058
- .pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; }), (0, operators_1.map)(function (e) {
1059
- var actionWrapper = e.value;
1060
- actionWrapper.tokenData = {
1061
- accessToken: actionWrapper.response.data.accessToken,
1062
- refreshToken: actionWrapper.response.data.refreshToken,
1063
- isServiceToken: false,
1064
- accessTokenExpiresAt: 0,
1065
- refreshTokenExpiresAt: 0,
1066
- };
1067
- if (actionWrapper.response.data.firebase) {
1068
- actionWrapper.tokenData.firebase = {
1069
- apiKey: actionWrapper.response.data.firebase.apiKey,
1070
- projectId: actionWrapper.response.data.firebase.projectId,
1071
- customToken: actionWrapper.response.data.firebase.customToken,
1072
- };
1073
- }
1074
- return actionWrapper;
1075
- }), (0, operators_1.tap)(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1076
- return __generator(this, function (_a) {
1077
- switch (_a.label) {
1078
- case 0:
1079
- if (!actionWrapper.tokenData) return [3 /*break*/, 2];
1080
- return [4 /*yield*/, this.setTokenData(actionWrapper.tokenData)];
1081
- case 1:
1082
- _a.sent();
1083
- _a.label = 2;
1084
- case 2:
1085
- this.fireAuthStatus(actionWrapper.tokenData);
1086
- console.log('-- customAuthResult -- auth status fired');
1087
- return [2 /*return*/];
1088
- }
1089
- });
1090
- }); }), (0, operators_1.tap)(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
1091
- switch (_a.label) {
1092
- case 0: return [4 /*yield*/, this.cleanInitFirebase()];
1093
- case 1: return [2 /*return*/, _a.sent()];
1094
- }
1095
- }); }); }))
1096
- .subscribe(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1097
- var authEvent, _a;
1098
- return __generator(this, function (_b) {
1099
- switch (_b.label) {
1100
- case 0:
1101
- _a = this.getAuthChangedEvent;
1102
- return [4 /*yield*/, this.getStoredTokenData()];
1103
- case 1:
1104
- authEvent = _a.apply(this, [_b.sent()]);
1105
- if (actionWrapper.action.onSuccess) {
1106
- actionWrapper.action.onSuccess(authEvent);
1107
- }
1108
- return [2 /*return*/];
1109
- }
1110
- });
1111
- }); });
1112
- customAuthResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
1113
- var _a, _b;
1114
- console.log('-- customAuthResult ', e);
1115
- if (e.error) {
1116
- var actionWrapper = e.error;
1117
- if ((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.onError) {
1118
- (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.onError({
1119
- authStatus: RBSAuthStatus.AUTH_FAILED,
1120
- message: actionWrapper.responseError,
1121
- });
1122
- }
1123
- }
1124
- });
1125
- this.authStatus.subscribe();
1126
- setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
1127
- var _a;
1128
- return __generator(this, function (_b) {
1129
- switch (_b.label) {
1130
- case 0:
1131
- _a = this.fireAuthStatus;
1132
- return [4 /*yield*/, this.getStoredTokenData()];
1133
- case 1:
1134
- _a.apply(this, [_b.sent()]);
1135
- return [2 /*return*/];
1136
- }
1137
- });
1138
- }); }, 1);
1139
- };
1140
- RBS.instances = null;
1141
- return RBS;
534
+ Retter.instances = [];
535
+ return Retter;
1142
536
  }());
1143
- exports.default = RBS;
537
+ exports.default = Retter;
1144
538
  //# sourceMappingURL=index.js.map