@retter/sdk 0.1.13 → 0.2.1

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,849 +56,430 @@ 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.action);
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)];
264
+ response = _a.sent();
265
+ return [2 /*return*/, __assign(__assign({}, actionWrapper), { response: response })];
547
266
  }
548
267
  });
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;
579
- }
580
- action.generateGetUrl = true;
581
- _this.commandQueue.next(action);
582
- });
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
- });
596
- };
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
293
  });
611
- };
612
- this.signInAnonymously = function () { return __awaiter(_this, void 0, void 0, function () {
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 (action) {
303
+ var data = action.data;
304
+ if (action.action === types_1.RetterActions.COS_INSTANCE) {
305
+ var instanceId = data.key ? "".concat(data.key.name, "!").concat(data.key.value) : data.instanceId;
306
+ return {
307
+ path: "INSTANCE/".concat(data.classId).concat(data.instanceId ? "/".concat(instanceId) : ''),
308
+ params: {},
309
+ };
310
+ }
311
+ else if (action.action === types_1.RetterActions.COS_STATE) {
312
+ return {
313
+ path: "STATE/".concat(data.classId, "/").concat(data.instanceId),
314
+ params: {},
315
+ };
316
+ }
317
+ else {
318
+ return {
319
+ path: "CALL/".concat(data.classId, "/").concat(data.method, "/").concat(data.instanceId),
320
+ params: {},
321
+ };
322
+ }
323
+ };
324
+ Retter.prototype.getFirebaseListener = function (queue, collection, documentId) {
325
+ var document = (0, firestore_2.doc)(this.firestore, collection, documentId);
326
+ console.log('document', document);
327
+ return (0, firestore_2.onSnapshot)(document, function (doc) {
328
+ var data = Object.assign({}, doc.data());
329
+ for (var _i = 0, _a = Object.keys(data); _i < _a.length; _i++) {
330
+ var key = _a[_i];
331
+ if (key.startsWith('__'))
332
+ delete data[key];
333
+ }
334
+ queue.next(data);
335
+ });
336
+ };
337
+ Retter.prototype.clearCloudObjects = function () {
338
+ return __awaiter(this, void 0, void 0, function () {
613
339
  return __generator(this, function (_a) {
614
340
  switch (_a.label) {
615
- case 0: return [4 /*yield*/, this.send({
616
- action: 'signInAnonym',
617
- data: {},
618
- })];
341
+ case 0:
342
+ this.cloudObjects.map(function (i) { return i.unsubscribers.map(function (u) { return u(); }); });
343
+ this.cloudObjects = [];
344
+ if (!this.firebaseAuth) return [3 /*break*/, 2];
345
+ return [4 /*yield*/, (0, auth_1.signOut)(this.firebaseAuth)];
619
346
  case 1:
620
347
  _a.sent();
348
+ _a.label = 2;
349
+ case 2:
350
+ this.clearFirebase();
621
351
  return [2 /*return*/];
622
352
  }
623
353
  });
624
- }); };
625
- this.signOut = function () { return __awaiter(_this, void 0, void 0, function () {
354
+ });
355
+ };
356
+ // Public Methods
357
+ Retter.prototype.signInAnonymously = function () {
358
+ return __awaiter(this, void 0, void 0, function () {
626
359
  return __generator(this, function (_a) {
627
360
  switch (_a.label) {
628
361
  case 0:
629
362
  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];
363
+ throw new Error('Retter SDK not initialized.');
364
+ return [4 /*yield*/, this.sendToActionQueue({ action: types_1.RetterActions.SIGN_IN_ANONYM })];
365
+ case 1: return [2 /*return*/, _a.sent()];
653
366
  }
654
367
  });
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 _this = this;
368
+ });
369
+ };
370
+ Retter.prototype.authenticateWithCustomToken = function (token) {
371
+ return __awaiter(this, void 0, void 0, function () {
690
372
  return __generator(this, function (_a) {
691
- return [2 /*return*/, new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
692
- var firebaseConfig;
693
- var _a;
694
- return __generator(this, function (_b) {
695
- switch (_b.label) {
696
- case 0: return [4 /*yield*/, this.getStoredTokenData()];
697
- case 1:
698
- firebaseConfig = (_a = (_b.sent())) === null || _a === void 0 ? void 0 : _a.firebase;
699
- console.log('-- initFirebase -- firebaseConfig', firebaseConfig);
700
- if (!(firebaseConfig && !this.firebaseApp)) return [3 /*break*/, 4];
701
- console.log('-- initFirebase -- firebase app not defined');
702
- this.firebaseApp = (0, app_1.initializeApp)({
703
- apiKey: firebaseConfig.apiKey,
704
- authDomain: firebaseConfig.projectId + '.firebaseapp.com',
705
- projectId: firebaseConfig.projectId,
706
- });
707
- this.firestore = (0, firestore_1.getFirestore)(this.firebaseApp);
708
- this.firebaseAuth = (0, auth_1.getAuth)(this.firebaseApp);
709
- return [4 /*yield*/, (0, auth_1.signInWithCustomToken)(this.firebaseAuth, firebaseConfig.customToken)];
710
- case 2:
711
- _b.sent();
712
- console.log('-- initFirebase -- firebase authenticated');
713
- return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
714
- case 3:
715
- _b.sent();
716
- _b.label = 4;
717
- case 4:
718
- resolve();
719
- return [2 /*return*/];
720
- }
721
- });
722
- }); })];
373
+ switch (_a.label) {
374
+ case 0:
375
+ if (!this.initialized)
376
+ throw new Error('Retter SDK not initialized.');
377
+ return [4 /*yield*/, this.sendToAuthQueue({ action: types_1.RetterActions.SIGN_IN, data: token })];
378
+ case 1: return [2 /*return*/, _a.sent()];
379
+ }
723
380
  });
724
- }); };
725
- this.getFirebaseListeners = function (data, queue, key) { return __awaiter(_this, void 0, void 0, function () {
726
- var userData, documentId, collection, document, unsubscribe;
381
+ });
382
+ };
383
+ Retter.prototype.signOut = function () {
384
+ return __awaiter(this, void 0, void 0, function () {
727
385
  return __generator(this, function (_a) {
728
386
  switch (_a.label) {
729
- case 0: return [4 /*yield*/, this.getUser()];
387
+ case 0:
388
+ if (!this.initialized)
389
+ throw new Error('Retter SDK not initialized.');
390
+ return [4 /*yield*/, this.clearCloudObjects()];
730
391
  case 1:
731
- userData = _a.sent();
732
- if (!userData && key !== 'public')
733
- return [2 /*return*/, null];
734
- documentId = data.instanceId;
735
- collection = "/projects/" + this.clientConfig.projectId + "/classes/" + data.classId + "/instances";
736
- if (key === 'role') {
737
- documentId = userData.identity;
738
- collection += "/" + data.instanceId + "/roleState";
739
- }
740
- if (key === 'user') {
741
- documentId = userData.userId;
742
- collection += "/" + data.instanceId + "/userState";
743
- }
744
- console.log('-- getFirebaseListeners -- collection', collection, documentId);
745
- document = (0, firestore_2.doc)(this.firestore, collection, documentId);
746
- unsubscribe = (0, firestore_2.onSnapshot)(document, function (doc) {
747
- var data = Object.assign({}, doc.data());
748
- for (var _i = 0, _a = Object.keys(data); _i < _a.length; _i++) {
749
- var key_1 = _a[_i];
750
- if (key_1.startsWith('__'))
751
- delete data[key_1];
752
- }
753
- queue.next(data);
754
- });
755
- return [2 /*return*/, unsubscribe];
392
+ _a.sent();
393
+ return [4 /*yield*/, this.auth.clearTokenData()
394
+ // Fire auth status after all tokens cleared
395
+ ];
396
+ case 2:
397
+ _a.sent();
398
+ // Fire auth status after all tokens cleared
399
+ this.fireAuthStatus({});
400
+ // dont wait for sign out to finish
401
+ this.auth.signOut();
402
+ return [2 /*return*/];
756
403
  }
757
404
  });
758
- }); };
759
- this.cleanInitFirebase = function () { return __awaiter(_this, void 0, void 0, function () {
760
- var _this = this;
761
- return __generator(this, function (_a) {
762
- return [2 /*return*/, new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
763
- return __generator(this, function (_a) {
764
- switch (_a.label) {
765
- case 0:
766
- // unsubscribe from all events
767
- this.cloudObjects.map(function (cloudObject) {
768
- cloudObject.unsubscribers.map(function (unsubscribe) { return unsubscribe && unsubscribe(); });
769
- });
770
- this.cloudObjects = [];
771
- if (!this.firebaseAuth) return [3 /*break*/, 2];
772
- return [4 /*yield*/, (0, auth_1.signOut)(this.firebaseAuth)];
773
- case 1:
774
- _a.sent();
775
- _a.label = 2;
776
- case 2:
777
- this.firebaseApp = null;
778
- this.firestore = null;
779
- this.firebaseAuth = null;
780
- console.log('-- cleanInitFirebase -- firebase app cleaned');
781
- resolve();
782
- return [2 /*return*/];
783
- }
784
- });
785
- }); })];
786
- });
787
- }); };
788
- this.isCosAction = function (action) {
789
- return ['rbs.core.request.INSTANCE', 'rbs.core.request.CALL', 'rbs.core.request.STATE'].includes(action);
790
- };
791
- this.getCosEndpoint = function (method, classId, instanceId, methodId) {
792
- var region = _this.getRegion();
793
- return "https://" + _this.clientConfig.projectId + "." + region.apiUrl + "/" + method + "/" + classId + (methodId ? '/' + methodId : '') + (instanceId ? '/' + instanceId : '');
794
- };
795
- this.getCloudObject = function (data) { return __awaiter(_this, void 0, void 0, function () {
796
- var instanceResponse, seekedObject, queues, state, unsubscribers, _a, _b, _c, _d, _e, _f, call, getState;
405
+ });
406
+ };
407
+ Retter.prototype.getCloudObject = function (config) {
408
+ var _a;
409
+ return __awaiter(this, void 0, void 0, function () {
410
+ var instance, seekedObject, roleQueue, userQueue, publicQueue, state, projectId, user, unsubscribers, call, getState, retVal;
797
411
  var _this = this;
798
- var _g, _h;
799
- return __generator(this, function (_j) {
800
- switch (_j.label) {
412
+ return __generator(this, function (_b) {
413
+ switch (_b.label) {
801
414
  case 0:
802
- console.log('-- getCloudObject -- data', data);
803
- if (data.useLocal && data.instanceId) {
415
+ if (!this.initialized)
416
+ throw new Error('Retter SDK not initialized.');
417
+ return [4 /*yield*/, this.sendToActionQueue({ action: types_1.RetterActions.COS_INSTANCE, data: config })];
418
+ case 1:
419
+ instance = _b.sent();
420
+ config.instanceId = instance.instanceId;
421
+ if (config.useLocal && config.instanceId) {
804
422
  return [2 /*return*/, {
805
- instanceId: data.instanceId,
806
- isNewInstance: true,
807
- methods: [],
808
- getState: function (params) { return __awaiter(_this, void 0, void 0, function () {
423
+ call: function (params) { return __awaiter(_this, void 0, void 0, function () {
809
424
  return __generator(this, function (_a) {
810
425
  switch (_a.label) {
811
- case 0: return [4 /*yield*/, this.send({
812
- action: 'rbs.core.request.STATE',
813
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
814
- token: params === null || params === void 0 ? void 0 : params.token,
426
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
427
+ action: types_1.RetterActions.COS_CALL,
428
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
815
429
  })];
816
430
  case 1: return [2 /*return*/, _a.sent()];
817
431
  }
818
432
  });
819
433
  }); },
820
- call: function (params) { return __awaiter(_this, void 0, void 0, function () {
434
+ getState: function (params) { return __awaiter(_this, void 0, void 0, function () {
821
435
  return __generator(this, function (_a) {
822
436
  switch (_a.label) {
823
- case 0: return [4 /*yield*/, this.send({
824
- action: 'rbs.core.request.CALL',
825
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
826
- token: params.token,
437
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
438
+ action: types_1.RetterActions.COS_STATE,
439
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
827
440
  })];
828
441
  case 1: return [2 /*return*/, _a.sent()];
829
442
  }
830
443
  });
831
444
  }); },
445
+ methods: [],
446
+ instanceId: config.instanceId,
447
+ isNewInstance: false,
832
448
  }];
833
449
  }
834
- return [4 /*yield*/, this.send({
835
- action: 'rbs.core.request.INSTANCE',
836
- data: data,
837
- token: data.token,
838
- })];
839
- case 1:
840
- instanceResponse = (_j.sent()).data;
841
- if (!!this.firebaseApp) return [3 /*break*/, 3];
842
- console.log('-- getCloudObject -- firebase app not defined');
843
- return [4 /*yield*/, this.initFirebase()];
844
- case 2:
845
- _j.sent();
846
- _j.label = 3;
847
- case 3:
848
- if (instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.instanceId)
849
- data.instanceId = instanceResponse.instanceId;
850
- seekedObject = this.cloudObjects.find(function (cloudObject) { return cloudObject.config.classId === data.classId && cloudObject.config.instanceId === data.instanceId; });
450
+ seekedObject = this.cloudObjects.find(function (r) { return r.config.classId === config.classId && r.config.instanceId === r.instanceId; });
851
451
  if (seekedObject) {
852
- seekedObject.methods = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods; // refresh methods.
853
452
  return [2 /*return*/, {
854
- instanceId: seekedObject.config.instanceId,
855
453
  call: seekedObject.call,
856
454
  state: seekedObject.state,
857
455
  getState: seekedObject.getState,
858
- methods: seekedObject.methods || [],
859
- isNewInstance: seekedObject.isNewInstance,
456
+ methods: instance.methods,
457
+ instanceId: config.instanceId,
458
+ isNewInstance: false,
860
459
  }];
861
460
  }
862
- queues = {
863
- roleQueue: new rxjs_1.ReplaySubject(1),
864
- userQueue: new rxjs_1.ReplaySubject(1),
865
- publicQueue: new rxjs_1.ReplaySubject(1),
866
- };
461
+ roleQueue = new rxjs_1.ReplaySubject(1);
462
+ userQueue = new rxjs_1.ReplaySubject(1);
463
+ publicQueue = new rxjs_1.ReplaySubject(1);
867
464
  state = {
868
- role: queues.roleQueue.asObservable(),
869
- user: queues.userQueue.asObservable(),
870
- public: queues.publicQueue.asObservable(),
465
+ role: roleQueue.asObservable(),
466
+ user: userQueue.asObservable(),
467
+ public: publicQueue.asObservable(),
871
468
  };
469
+ projectId = this.clientConfig.projectId;
470
+ return [4 /*yield*/, this.auth.getCurrentUser()];
471
+ case 2:
472
+ user = _b.sent();
872
473
  unsubscribers = [];
873
- _b = (_a = unsubscribers).push;
874
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.roleQueue, 'role')];
875
- case 4:
876
- _b.apply(_a, [_j.sent()]);
877
- _d = (_c = unsubscribers).push;
878
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.userQueue, 'user')];
879
- case 5:
880
- _d.apply(_c, [_j.sent()]);
881
- _f = (_e = unsubscribers).push;
882
- return [4 /*yield*/, this.getFirebaseListeners(data, queues.publicQueue, 'public')];
883
- case 6:
884
- _f.apply(_e, [_j.sent()]);
474
+ unsubscribers.push(this.getFirebaseListener(publicQueue, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances"), config.instanceId));
475
+ unsubscribers.push(this.getFirebaseListener(userQueue, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances/").concat(config.instanceId, "/userState"), user.userId));
476
+ unsubscribers.push(this.getFirebaseListener(roleQueue, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances/").concat(config.instanceId, "/roleState"), user.identity));
885
477
  call = function (params) { return __awaiter(_this, void 0, void 0, function () {
886
478
  return __generator(this, function (_a) {
887
479
  switch (_a.label) {
888
- case 0: return [4 /*yield*/, this.send({
889
- action: 'rbs.core.request.CALL',
890
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
891
- token: params.token,
480
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
481
+ action: types_1.RetterActions.COS_CALL,
482
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
892
483
  })];
893
484
  case 1: return [2 /*return*/, _a.sent()];
894
485
  }
@@ -897,259 +488,37 @@ var RBS = /** @class */ (function () {
897
488
  getState = function (params) { return __awaiter(_this, void 0, void 0, function () {
898
489
  return __generator(this, function (_a) {
899
490
  switch (_a.label) {
900
- case 0: return [4 /*yield*/, this.send({
901
- action: 'rbs.core.request.STATE',
902
- data: __assign(__assign({}, params), { classId: data.classId, instanceId: data.instanceId }),
903
- token: params === null || params === void 0 ? void 0 : params.token,
491
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
492
+ action: types_1.RetterActions.COS_STATE,
493
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
904
494
  })];
905
495
  case 1: return [2 /*return*/, _a.sent()];
906
496
  }
907
497
  });
908
498
  }); };
909
- this.cloudObjects.push({
910
- config: data,
911
- isNewInstance: (_g = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.newInstance) !== null && _g !== void 0 ? _g : false,
912
- methods: instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods,
913
- response: instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.response,
499
+ retVal = {
914
500
  call: call,
915
501
  state: state,
916
502
  getState: getState,
917
- unsubscribers: unsubscribers,
918
- });
919
- return [2 /*return*/, {
920
- instanceId: data.instanceId,
921
- state: state,
922
- call: call,
923
- getState: getState,
924
- isNewInstance: (_h = instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.newInstance) !== null && _h !== void 0 ? _h : false,
925
- methods: (instanceResponse === null || instanceResponse === void 0 ? void 0 : instanceResponse.methods) || [],
926
- response: instanceResponse.response,
927
- }];
503
+ methods: instance.methods,
504
+ instanceId: config.instanceId,
505
+ isNewInstance: (_a = instance.isNewInstance) !== null && _a !== void 0 ? _a : false,
506
+ };
507
+ this.cloudObjects.push(__assign(__assign({}, retVal), { config: config, unsubscribers: unsubscribers }));
508
+ return [2 /*return*/, retVal];
928
509
  }
929
510
  });
930
- }); };
931
- }
932
- RBS.prototype.isNode = function () {
933
- return typeof window === 'undefined';
511
+ });
934
512
  };
935
- Object.defineProperty(RBS.prototype, "authStatus", {
513
+ Object.defineProperty(Retter.prototype, "authStatus", {
936
514
  get: function () {
937
515
  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; }));
938
- // .pipe(debounce(() => timer(100)))
939
516
  },
940
517
  enumerable: false,
941
518
  configurable: true
942
519
  });
943
- RBS.clearTokens = function () {
944
- if (typeof document != 'undefined') {
945
- // I'm on the web!
946
- // Browser environment
947
- for (var key in localStorage) {
948
- if (key.startsWith(RBS_TOKENS_KEY))
949
- localStorage.removeItem(key);
950
- }
951
- }
952
- };
953
- RBS.getInstance = function (config) {
954
- if (config === void 0) { config = null; }
955
- if (!RBS.instances)
956
- RBS.instances = [];
957
- 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); });
958
- if (!instance) {
959
- instance = new RBS();
960
- if (config) {
961
- instance.init(config);
962
- }
963
- RBS.instances.push(instance);
964
- }
965
- return instance;
966
- };
967
- RBS.dispose = function () {
968
- RBS.instances = [];
969
- };
970
- RBS.prototype.init = function (config) {
971
- var _this = this;
972
- if (this.initialized)
973
- throw new Error('RBS SDK already initialized.');
974
- this.initialized = true;
975
- var axiosRequestConfiguration = {
976
- responseType: 'json',
977
- headers: {
978
- 'Content-Type': 'application/json',
979
- },
980
- timeout: 30000,
981
- };
982
- this.axiosInstance = (0, axiosSetup_1.default)(axiosRequestConfiguration);
983
- config.logLevel ? loglevel_1.default.setLevel(config.logLevel) : loglevel_1.default.setLevel('ERROR');
984
- this.clientConfig = config;
985
- if (!this.clientConfig.region)
986
- this.clientConfig.region = RbsRegion.euWest1;
987
- var incomingAction = this.commandQueue.asObservable();
988
- var actionResult = incomingAction.pipe((0, operators_1.concatMap)(function (action) { return __awaiter(_this, void 0, void 0, function () {
989
- var actionWrapper;
990
- return __generator(this, function (_a) {
991
- switch (_a.label) {
992
- case 0:
993
- actionWrapper = {
994
- action: action,
995
- };
996
- return [4 /*yield*/, this.getActionWithTokenData(actionWrapper)];
997
- case 1: return [2 /*return*/, _a.sent()];
998
- }
999
- });
1000
- }); }), (0, operators_1.tap)(function (actionWrapper) {
1001
- _this.fireAuthStatus(actionWrapper.tokenData);
1002
- }), (0, operators_1.filter)(function (actionWrapper) { return actionWrapper.tokenData != null; }), (0, operators_1.tap)(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1003
- return __generator(this, function (_a) {
1004
- switch (_a.label) {
1005
- case 0: return [4 /*yield*/, this.setTokenData(actionWrapper.tokenData)];
1006
- case 1:
1007
- _a.sent();
1008
- return [2 /*return*/];
1009
- }
1010
- });
1011
- }); }), (0, operators_1.mergeMap)(function (ev) {
1012
- var _a;
1013
- var endpoint = ev.tokenData.isServiceToken ? '/service/action' : '/user/action';
1014
- var action = ev.action.action;
1015
- var actionType = action.split('.')[2];
1016
- endpoint = endpoint + "/" + _this.clientConfig.projectId + "/" + action;
1017
- endpoint = _this.getBaseUrl(action) + _this.getServiceEndpoint(ev);
1018
- if ((_a = ev.action) === null || _a === void 0 ? void 0 : _a.token) {
1019
- ev.tokenData.accessToken = ev.action.token;
1020
- }
1021
- if (_this.isCosAction(action)) {
1022
- var cosData = ev.action.data;
1023
- endpoint = _this.getCosEndpoint(action.split('.')[3], cosData.classId, cosData.key ? cosData.key.name + "!" + cosData.key.value : cosData.instanceId, cosData.method);
1024
- return (0, rxjs_1.defer)(function () { return _this.request(endpoint, ev); }).pipe((0, operators_1.materialize)());
1025
- }
1026
- if (action !== 'signInAnonym') {
1027
- if (actionType === 'get') {
1028
- return (0, rxjs_1.defer)(function () { return _this.get(endpoint, ev); }).pipe((0, operators_1.materialize)());
1029
- }
1030
- else {
1031
- return (0, rxjs_1.defer)(function () { return _this.post(endpoint, ev); }).pipe((0, operators_1.materialize)());
1032
- }
1033
- }
1034
- return (0, rxjs_1.defer)(function () { }).pipe((0, operators_1.materialize)());
1035
- }), (0, operators_1.share)());
1036
- actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; })).subscribe(function (e) {
1037
- var _a, _b, _c;
1038
- if ((_b = (_a = e.value) === null || _a === void 0 ? void 0 : _a.action) === null || _b === void 0 ? void 0 : _b.onSuccess) {
1039
- if (e.value.action.generateGetUrl) {
1040
- e.value.action.onSuccess(e.value.url);
1041
- }
1042
- else {
1043
- e.value.action.onSuccess((_c = e.value) === null || _c === void 0 ? void 0 : _c.response);
1044
- }
1045
- }
1046
- });
1047
- actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
1048
- var _a, _b;
1049
- if (e.error) {
1050
- var actionWrapper = e.error;
1051
- if ((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.onError) {
1052
- (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.onError(actionWrapper.responseError);
1053
- }
1054
- }
1055
- });
1056
- // Custom auth
1057
- var customAuthResult = this.customAuthQueue.pipe((0, operators_1.concatMap)(function (action) {
1058
- var actionWrapper = {
1059
- action: action,
1060
- };
1061
- return (0, rxjs_1.defer)(function () {
1062
- var userId = (0, jwt_decode_1.default)(action.data.token).userId;
1063
- var url = _this.getApiUrl() + "/CALL/ProjectUser/authWithCustomToken/" + _this.clientConfig.projectId + "_" + userId;
1064
- console.log('-- custom auth -- userId: ', userId);
1065
- return _this.getPlain(url, { customToken: action.data.token }, actionWrapper);
1066
- }).pipe((0, operators_1.materialize)());
1067
- }), (0, operators_1.share)());
1068
- customAuthResult
1069
- .pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; }), (0, operators_1.map)(function (e) {
1070
- var actionWrapper = e.value;
1071
- actionWrapper.tokenData = {
1072
- accessToken: actionWrapper.response.data.accessToken,
1073
- refreshToken: actionWrapper.response.data.refreshToken,
1074
- isServiceToken: false,
1075
- accessTokenExpiresAt: 0,
1076
- refreshTokenExpiresAt: 0,
1077
- };
1078
- if (actionWrapper.response.data.firebase) {
1079
- actionWrapper.tokenData.firebase = {
1080
- apiKey: actionWrapper.response.data.firebase.apiKey,
1081
- projectId: actionWrapper.response.data.firebase.projectId,
1082
- customToken: actionWrapper.response.data.firebase.customToken,
1083
- };
1084
- }
1085
- return actionWrapper;
1086
- }), (0, operators_1.tap)(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1087
- return __generator(this, function (_a) {
1088
- switch (_a.label) {
1089
- case 0:
1090
- if (!actionWrapper.tokenData) return [3 /*break*/, 2];
1091
- return [4 /*yield*/, this.setTokenData(actionWrapper.tokenData)];
1092
- case 1:
1093
- _a.sent();
1094
- _a.label = 2;
1095
- case 2:
1096
- this.fireAuthStatus(actionWrapper.tokenData);
1097
- console.log('-- customAuthResult -- auth status fired');
1098
- return [2 /*return*/];
1099
- }
1100
- });
1101
- }); }), (0, operators_1.tap)(function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
1102
- switch (_a.label) {
1103
- case 0: return [4 /*yield*/, this.cleanInitFirebase()];
1104
- case 1: return [2 /*return*/, _a.sent()];
1105
- }
1106
- }); }); }))
1107
- .subscribe(function (actionWrapper) { return __awaiter(_this, void 0, void 0, function () {
1108
- var authEvent, _a;
1109
- return __generator(this, function (_b) {
1110
- switch (_b.label) {
1111
- case 0:
1112
- _a = this.getAuthChangedEvent;
1113
- return [4 /*yield*/, this.getStoredTokenData()];
1114
- case 1:
1115
- authEvent = _a.apply(this, [_b.sent()]);
1116
- if (actionWrapper.action.onSuccess) {
1117
- actionWrapper.action.onSuccess(authEvent);
1118
- }
1119
- return [2 /*return*/];
1120
- }
1121
- });
1122
- }); });
1123
- customAuthResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
1124
- var _a, _b;
1125
- console.log('-- customAuthResult ', e);
1126
- if (e.error) {
1127
- var actionWrapper = e.error;
1128
- if ((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.onError) {
1129
- (_b = actionWrapper.action) === null || _b === void 0 ? void 0 : _b.onError({
1130
- authStatus: RBSAuthStatus.AUTH_FAILED,
1131
- message: actionWrapper.responseError,
1132
- });
1133
- }
1134
- }
1135
- });
1136
- this.authStatus.subscribe();
1137
- setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
1138
- var _a;
1139
- return __generator(this, function (_b) {
1140
- switch (_b.label) {
1141
- case 0:
1142
- _a = this.fireAuthStatus;
1143
- return [4 /*yield*/, this.getStoredTokenData()];
1144
- case 1:
1145
- _a.apply(this, [_b.sent()]);
1146
- return [2 /*return*/];
1147
- }
1148
- });
1149
- }); }, 1);
1150
- };
1151
- RBS.instances = null;
1152
- return RBS;
520
+ Retter.instances = [];
521
+ return Retter;
1153
522
  }());
1154
- exports.default = RBS;
523
+ exports.default = Retter;
1155
524
  //# sourceMappingURL=index.js.map