@retter/sdk 0.7.1-development → 0.7.1-development-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 ADDED
@@ -0,0 +1,704 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
25
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
26
+ };
27
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
+ return new (P || (P = Promise))(function (resolve, reject) {
30
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
34
+ });
35
+ };
36
+ var __generator = (this && this.__generator) || function (thisArg, body) {
37
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
38
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39
+ function verb(n) { return function (v) { return step([n, v]); }; }
40
+ function step(op) {
41
+ if (f) throw new TypeError("Generator is already executing.");
42
+ while (_) try {
43
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
44
+ if (y = 0, t) op = [op[0] & 2, t.value];
45
+ switch (op[0]) {
46
+ case 0: case 1: t = op; break;
47
+ case 4: _.label++; return { value: op[1], done: false };
48
+ case 5: _.label++; y = op[1]; op = [0]; continue;
49
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
50
+ default:
51
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55
+ if (t[2]) _.ops.pop();
56
+ _.trys.pop(); continue;
57
+ }
58
+ op = body.call(thisArg, _);
59
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61
+ }
62
+ };
63
+ var __importDefault = (this && this.__importDefault) || function (mod) {
64
+ return (mod && mod.__esModule) ? mod : { "default": mod };
65
+ };
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ var firestore_1 = require("firebase/firestore");
68
+ var app_1 = require("firebase/app");
69
+ var firestore_2 = require("firebase/firestore");
70
+ var auth_1 = require("firebase/auth");
71
+ var rxjs_1 = require("rxjs");
72
+ var operators_1 = require("rxjs/operators");
73
+ var Auth_1 = __importDefault(require("./Auth"));
74
+ var Request_1 = __importDefault(require("./Request"));
75
+ var types_1 = require("./types");
76
+ __exportStar(require("./types"), exports);
77
+ var DEFAULT_RETRY_DELAY = 50; // in ms
78
+ var DEFAULT_RETRY_COUNT = 3;
79
+ var DEFAULT_RETRY_RATE = 1.5;
80
+ var Retter = /** @class */ (function () {
81
+ function Retter() {
82
+ this.initialized = false;
83
+ this.authQueue = new rxjs_1.Subject();
84
+ this.actionQueue = new rxjs_1.Subject();
85
+ this.authStatusSubject = new rxjs_1.ReplaySubject(1);
86
+ this.cloudObjects = [];
87
+ this.listeners = {};
88
+ }
89
+ Retter.getInstance = function (config) {
90
+ var instance = Retter.instances.find(function (instance) { var _a; return ((_a = instance.clientConfig) === null || _a === void 0 ? void 0 : _a.projectId) === config.projectId; });
91
+ if (instance)
92
+ return instance;
93
+ var newInstance = new Retter();
94
+ newInstance.init(config);
95
+ Retter.instances.push(newInstance);
96
+ return newInstance;
97
+ };
98
+ Retter.prototype.init = function (config) {
99
+ var _this = this;
100
+ if (this.initialized)
101
+ throw new Error('SDK already initialized.');
102
+ this.initialized = true;
103
+ if (!config.retryConfig)
104
+ config.retryConfig = {};
105
+ if (!config.retryConfig.delay)
106
+ config.retryConfig.delay = DEFAULT_RETRY_DELAY;
107
+ if (!config.retryConfig.count)
108
+ config.retryConfig.count = DEFAULT_RETRY_COUNT;
109
+ if (!config.retryConfig.rate)
110
+ config.retryConfig.rate = DEFAULT_RETRY_RATE;
111
+ this.clientConfig = config;
112
+ this.auth = new Auth_1.default(config);
113
+ this.http = new Request_1.default(config);
114
+ this.auth.setHttp(this.http);
115
+ this.processAuthQueue();
116
+ this.processActionQueue();
117
+ setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
118
+ var tokenData;
119
+ return __generator(this, function (_a) {
120
+ switch (_a.label) {
121
+ case 0: return [4 /*yield*/, this.auth.getCurrentTokenData()];
122
+ case 1:
123
+ tokenData = _a.sent();
124
+ this.fireAuthStatus({ tokenData: tokenData });
125
+ return [2 /*return*/];
126
+ }
127
+ });
128
+ }); }, 1);
129
+ };
130
+ Retter.prototype.processAuthQueue = function () {
131
+ var _this = this;
132
+ var authResult = this.authQueue.pipe((0, operators_1.concatMap)(function (action) {
133
+ return (0, rxjs_1.defer)(function () { return __awaiter(_this, void 0, void 0, function () {
134
+ var response, error_1;
135
+ return __generator(this, function (_a) {
136
+ switch (_a.label) {
137
+ case 0:
138
+ _a.trys.push([0, 2, , 3]);
139
+ return [4 /*yield*/, this.auth.signIn(action.data)];
140
+ case 1:
141
+ response = _a.sent();
142
+ return [2 /*return*/, { action: action, response: response }];
143
+ case 2:
144
+ error_1 = _a.sent();
145
+ throw { action: action, responseError: error_1 };
146
+ case 3: return [2 /*return*/];
147
+ }
148
+ });
149
+ }); }).pipe((0, operators_1.materialize)());
150
+ }), (0, operators_1.share)());
151
+ // on success
152
+ authResult
153
+ .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.switchMap)(function (ev) { return __awaiter(_this, void 0, void 0, function () {
154
+ return __generator(this, function (_a) {
155
+ switch (_a.label) {
156
+ case 0: return [4 /*yield*/, this.storeTokenData(ev)];
157
+ case 1:
158
+ _a.sent();
159
+ return [2 /*return*/, ev];
160
+ }
161
+ });
162
+ }); }), (0, operators_1.switchMap)(function (ev) { return __awaiter(_this, void 0, void 0, function () {
163
+ return __generator(this, function (_a) {
164
+ switch (_a.label) {
165
+ case 0:
166
+ if (!this.firebaseAuth) return [3 /*break*/, 2];
167
+ return [4 /*yield*/, (0, auth_1.signOut)(this.firebaseAuth)];
168
+ case 1:
169
+ _a.sent();
170
+ _a.label = 2;
171
+ case 2:
172
+ this.clearFirebase();
173
+ if (!ev.tokenData) return [3 /*break*/, 4];
174
+ return [4 /*yield*/, this.initFirebase(ev)];
175
+ case 3:
176
+ _a.sent();
177
+ _a.label = 4;
178
+ case 4:
179
+ this.fireAuthStatus(ev);
180
+ return [2 /*return*/, ev];
181
+ }
182
+ });
183
+ }); }))
184
+ .subscribe(function (ev) {
185
+ var _a, _b;
186
+ if ((_a = ev.action) === null || _a === void 0 ? void 0 : _a.resolve) {
187
+ ev.action.resolve((_b = _this.auth) === null || _b === void 0 ? void 0 : _b.getAuthStatus(ev.tokenData));
188
+ }
189
+ });
190
+ // on error
191
+ authResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
192
+ var _a;
193
+ if (e.error && e.error.action && e.error.action.resolve) {
194
+ var response = {
195
+ authStatus: types_1.RetterAuthStatus.AUTH_FAILED,
196
+ message: (_a = e.error.responseError.response) === null || _a === void 0 ? void 0 : _a.data,
197
+ };
198
+ e.error.action.resolve(response);
199
+ }
200
+ });
201
+ this.authStatus.subscribe();
202
+ };
203
+ Retter.prototype.processActionQueue = function () {
204
+ var _this = this;
205
+ var actionResult = this.actionQueue.asObservable().pipe(
206
+ // Get current token data if exists and store it in action
207
+ (0, operators_1.concatMap)(this.getActionWithTokenData.bind(this)),
208
+ // Fire auth status event
209
+ (0, operators_1.tap)(this.fireAuthStatus.bind(this)),
210
+ // Make sure we have a token
211
+ (0, operators_1.filter)(function (ev) { return ev.tokenData !== null; }),
212
+ // Store token data
213
+ (0, operators_1.switchMap)(function (ev) { return __awaiter(_this, void 0, void 0, function () {
214
+ return __generator(this, function (_a) {
215
+ switch (_a.label) {
216
+ case 0: return [4 /*yield*/, this.storeTokenData(ev)];
217
+ case 1:
218
+ _a.sent();
219
+ return [2 /*return*/, ev];
220
+ }
221
+ });
222
+ }); }),
223
+ // Process action
224
+ (0, operators_1.mergeMap)(this.processAction.bind(this)), (0, operators_1.share)());
225
+ actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue && r.kind === 'N'; })).subscribe(function (e) {
226
+ if (e.value && e.value.action && e.value.action.resolve && e.value.response) {
227
+ e.value.action.resolve(e.value.response);
228
+ }
229
+ });
230
+ actionResult.pipe((0, operators_1.filter)(function (r) { return r.hasValue === false && r.kind === 'E'; })).subscribe(function (e) {
231
+ if (e.error && e.error.action && e.error.action.reject && e.error.responseError) {
232
+ e.error.action.reject(e.error.responseError);
233
+ }
234
+ });
235
+ };
236
+ //
237
+ Retter.prototype.sendToAuthQueue = function (action) {
238
+ return __awaiter(this, void 0, void 0, function () {
239
+ var _this = this;
240
+ return __generator(this, function (_a) {
241
+ return [2 /*return*/, new Promise(function (resolve, reject) {
242
+ _this.authQueue.next(__assign(__assign({}, action), { reject: reject, resolve: resolve }));
243
+ })];
244
+ });
245
+ });
246
+ };
247
+ Retter.prototype.sendToActionQueue = function (action) {
248
+ return __awaiter(this, void 0, void 0, function () {
249
+ var _this = this;
250
+ return __generator(this, function (_a) {
251
+ return [2 /*return*/, new Promise(function (resolve, reject) {
252
+ _this.actionQueue.next(__assign(__assign({}, action), { reject: reject, resolve: resolve }));
253
+ })];
254
+ });
255
+ });
256
+ };
257
+ //
258
+ Retter.prototype.getActionWithTokenData = function (action) {
259
+ return __awaiter(this, void 0, void 0, function () {
260
+ var ev, error_2;
261
+ var _a;
262
+ return __generator(this, function (_b) {
263
+ switch (_b.label) {
264
+ case 0:
265
+ _b.trys.push([0, 3, , 5]);
266
+ _a = { action: action };
267
+ return [4 /*yield*/, this.auth.getTokenData()];
268
+ case 1:
269
+ ev = (_a.tokenData = _b.sent(), _a);
270
+ return [4 /*yield*/, this.initFirebase(ev)];
271
+ case 2:
272
+ _b.sent();
273
+ return [2 /*return*/, ev];
274
+ case 3:
275
+ error_2 = _b.sent();
276
+ return [4 /*yield*/, this.signOut()];
277
+ case 4:
278
+ _b.sent();
279
+ return [2 /*return*/, { action: action }];
280
+ case 5: return [2 /*return*/];
281
+ }
282
+ });
283
+ });
284
+ };
285
+ Retter.prototype.fireAuthStatus = function (actionWrapper) {
286
+ var event = this.auth.getAuthStatus(actionWrapper.tokenData);
287
+ this.authStatusSubject.next(event);
288
+ };
289
+ Retter.prototype.storeTokenData = function (actionWrapper) {
290
+ return __awaiter(this, void 0, void 0, function () {
291
+ return __generator(this, function (_a) {
292
+ switch (_a.label) {
293
+ case 0: return [4 /*yield*/, this.auth.storeTokenData(actionWrapper.tokenData)];
294
+ case 1:
295
+ _a.sent();
296
+ return [2 /*return*/];
297
+ }
298
+ });
299
+ });
300
+ };
301
+ Retter.prototype.processAction = function (actionWrapper) {
302
+ var _this = this;
303
+ var _a;
304
+ if (((_a = actionWrapper.action) === null || _a === void 0 ? void 0 : _a.action) === types_1.RetterActions.EMPTY) {
305
+ return (0, rxjs_1.defer)(function () { return (0, rxjs_1.of)(__assign(__assign({}, actionWrapper), { response: true })); }).pipe((0, operators_1.materialize)());
306
+ }
307
+ return (0, rxjs_1.defer)(function () { return __awaiter(_this, void 0, void 0, function () {
308
+ var endpoint, response, error_3;
309
+ return __generator(this, function (_a) {
310
+ switch (_a.label) {
311
+ case 0:
312
+ _a.trys.push([0, 2, , 3]);
313
+ endpoint = this.getCosEndpoint(actionWrapper);
314
+ return [4 /*yield*/, this.http.call(this.clientConfig.projectId, endpoint.path, endpoint.params)];
315
+ case 1:
316
+ response = _a.sent();
317
+ return [2 /*return*/, __assign(__assign({}, actionWrapper), { response: response })];
318
+ case 2:
319
+ error_3 = _a.sent();
320
+ if (error_3.response &&
321
+ error_3.response.status === 403 &&
322
+ error_3.response.data &&
323
+ error_3.response.data.code === 'ACCESS_DENIED') {
324
+ this.signOut();
325
+ }
326
+ throw __assign(__assign({}, actionWrapper), { responseError: error_3 });
327
+ case 3: return [2 /*return*/];
328
+ }
329
+ });
330
+ }); }).pipe((0, operators_1.materialize)());
331
+ };
332
+ // Firebase
333
+ Retter.prototype.initFirebase = function (actionWrapper) {
334
+ var _a;
335
+ return __awaiter(this, void 0, void 0, function () {
336
+ var firebaseConfig;
337
+ return __generator(this, function (_b) {
338
+ switch (_b.label) {
339
+ case 0:
340
+ firebaseConfig = (_a = actionWrapper.tokenData) === null || _a === void 0 ? void 0 : _a.firebase;
341
+ if (!firebaseConfig || this.firebase)
342
+ return [2 /*return*/, actionWrapper];
343
+ this.firebase = (0, app_1.initializeApp)({
344
+ apiKey: firebaseConfig.apiKey,
345
+ authDomain: firebaseConfig.projectId + '.firebaseapp.com',
346
+ projectId: firebaseConfig.projectId,
347
+ }, this.clientConfig.projectId);
348
+ this.firestore = (0, firestore_1.getFirestore)(this.firebase);
349
+ this.firebaseAuth = (0, auth_1.getAuth)(this.firebase);
350
+ return [4 /*yield*/, (0, auth_1.signInWithCustomToken)(this.firebaseAuth, firebaseConfig.customToken)];
351
+ case 1:
352
+ _b.sent();
353
+ return [2 /*return*/, actionWrapper];
354
+ }
355
+ });
356
+ });
357
+ };
358
+ Retter.prototype.clearFirebase = function () {
359
+ this.firebase = undefined;
360
+ this.firestore = undefined;
361
+ this.firebaseAuth = undefined;
362
+ };
363
+ // Cloud Objects
364
+ Retter.prototype.getCosEndpoint = function (ev) {
365
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
366
+ var action = ev.action;
367
+ var data = action.data;
368
+ var queryParams = {};
369
+ for (var key in data.queryStringParams || []) {
370
+ queryParams[key] = data.queryStringParams[key];
371
+ }
372
+ queryParams['__culture'] = (_a = data.culture) !== null && _a !== void 0 ? _a : (((_b = this.clientConfig) === null || _b === void 0 ? void 0 : _b.culture) || 'en-us');
373
+ if (data.platform || ((_c = this.clientConfig) === null || _c === void 0 ? void 0 : _c.platform)) {
374
+ queryParams['__platform'] = (_d = data.platform) !== null && _d !== void 0 ? _d : (_e = this.clientConfig) === null || _e === void 0 ? void 0 : _e.platform;
375
+ }
376
+ var params = {
377
+ params: queryParams,
378
+ method: (_f = data.httpMethod) !== null && _f !== void 0 ? _f : 'post',
379
+ data: data.body,
380
+ base64Encode: (_g = data.base64Encode) !== null && _g !== void 0 ? _g : true,
381
+ headers: __assign({}, data.headers),
382
+ };
383
+ var accessToken = (_h = data.token) !== null && _h !== void 0 ? _h : (_j = ev.tokenData) === null || _j === void 0 ? void 0 : _j.accessToken;
384
+ if (accessToken) {
385
+ params.headers['Authorization'] = "Bearer ".concat(accessToken);
386
+ }
387
+ if (action.action === types_1.RetterActions.COS_INSTANCE) {
388
+ var instanceId = data.key ? "".concat(data.key.name, "!").concat(data.key.value) : data.instanceId;
389
+ return {
390
+ path: "INSTANCE/".concat(data.classId).concat(instanceId ? "/".concat(instanceId) : ''),
391
+ params: params,
392
+ };
393
+ }
394
+ else if (action.action === types_1.RetterActions.COS_STATE) {
395
+ return {
396
+ path: "STATE/".concat(data.classId, "/").concat(data.instanceId),
397
+ params: params,
398
+ };
399
+ }
400
+ else if (action.action === types_1.RetterActions.COS_LIST) {
401
+ return {
402
+ path: "LIST/".concat(data.classId),
403
+ params: params,
404
+ };
405
+ }
406
+ else if (action.action === types_1.RetterActions.COS_STATIC_CALL) {
407
+ return {
408
+ path: "CALL/".concat(data.classId, "/").concat(data.method).concat(data.pathParams ? "/".concat(data.pathParams) : ''),
409
+ params: params,
410
+ };
411
+ }
412
+ else {
413
+ return {
414
+ path: "CALL/".concat(data.classId, "/").concat(data.method, "/").concat(data.instanceId).concat(data.pathParams ? "/".concat(data.pathParams) : ''),
415
+ params: params,
416
+ };
417
+ }
418
+ };
419
+ Retter.prototype.getFirebaseListener = function (queue, collection, documentId) {
420
+ var document = (0, firestore_2.doc)(this.firestore, collection, documentId);
421
+ return (0, firestore_2.onSnapshot)(document, function (doc) {
422
+ var data = Object.assign({}, doc.data());
423
+ for (var _i = 0, _a = Object.keys(data); _i < _a.length; _i++) {
424
+ var key = _a[_i];
425
+ if (key.startsWith('__'))
426
+ delete data[key];
427
+ }
428
+ queue.next(data);
429
+ });
430
+ };
431
+ Retter.prototype.getFirebaseState = function (config) {
432
+ return __awaiter(this, void 0, void 0, function () {
433
+ var projectId, user, unsubscribers, queues, state;
434
+ var _this = this;
435
+ return __generator(this, function (_a) {
436
+ switch (_a.label) {
437
+ case 0:
438
+ projectId = this.clientConfig.projectId;
439
+ return [4 /*yield*/, this.auth.getCurrentUser()];
440
+ case 1:
441
+ user = _a.sent();
442
+ unsubscribers = [];
443
+ queues = {
444
+ role: new rxjs_1.ReplaySubject(1),
445
+ user: new rxjs_1.ReplaySubject(1),
446
+ public: new rxjs_1.ReplaySubject(1),
447
+ };
448
+ state = {
449
+ role: {
450
+ queue: queues.role,
451
+ subscribe: function (observer) {
452
+ if (!_this.listeners["".concat(projectId, "_").concat(config.classId, "_").concat(config.instanceId, "_role")]) {
453
+ var listener = _this.getFirebaseListener(queues.role, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances/").concat(config.instanceId, "/roleState"), user.identity);
454
+ unsubscribers.push(listener);
455
+ _this.listeners["".concat(projectId, "_").concat(config.classId, "_").concat(config.instanceId, "_role")] = listener;
456
+ }
457
+ return queues.role.subscribe(observer);
458
+ },
459
+ },
460
+ user: {
461
+ queue: queues.user,
462
+ subscribe: function (observer) {
463
+ if (!_this.listeners["".concat(projectId, "_").concat(config.classId, "_").concat(config.instanceId, "_user")]) {
464
+ var listener = _this.getFirebaseListener(queues.user, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances/").concat(config.instanceId, "/userState"), user.userId);
465
+ unsubscribers.push(listener);
466
+ _this.listeners["".concat(projectId, "_").concat(config.classId, "_").concat(config.instanceId, "_user")] = listener;
467
+ }
468
+ return queues.user.subscribe(observer);
469
+ },
470
+ },
471
+ public: {
472
+ queue: queues.public,
473
+ subscribe: function (observer) {
474
+ if (!_this.listeners["".concat(projectId, "_").concat(config.classId, "_").concat(config.instanceId, "_public")]) {
475
+ var listener = _this.getFirebaseListener(queues.public, "/projects/".concat(projectId, "/classes/").concat(config.classId, "/instances"), config.instanceId);
476
+ unsubscribers.push(listener);
477
+ _this.listeners["".concat(projectId, "_").concat(config.classId, "_").concat(config.instanceId, "_public")] = listener;
478
+ }
479
+ return queues.public.subscribe(observer);
480
+ },
481
+ },
482
+ };
483
+ return [2 /*return*/, { state: state, unsubscribers: unsubscribers }];
484
+ }
485
+ });
486
+ });
487
+ };
488
+ Retter.prototype.clearCloudObjects = function () {
489
+ return __awaiter(this, void 0, void 0, function () {
490
+ var listeners;
491
+ return __generator(this, function (_a) {
492
+ switch (_a.label) {
493
+ case 0:
494
+ listeners = Object.values(this.listeners);
495
+ if (listeners.length > 0) {
496
+ listeners.map(function (i) { return i(); });
497
+ this.cloudObjects.map(function (i) {
498
+ var _a, _b, _c, _d, _e, _f;
499
+ (_b = (_a = i.state) === null || _a === void 0 ? void 0 : _a.role.queue) === null || _b === void 0 ? void 0 : _b.complete();
500
+ (_d = (_c = i.state) === null || _c === void 0 ? void 0 : _c.user.queue) === null || _d === void 0 ? void 0 : _d.complete();
501
+ (_f = (_e = i.state) === null || _e === void 0 ? void 0 : _e.public.queue) === null || _f === void 0 ? void 0 : _f.complete();
502
+ });
503
+ }
504
+ this.listeners = {};
505
+ this.cloudObjects.map(function (i) { return i.unsubscribers.map(function (u) { return u(); }); });
506
+ this.cloudObjects = [];
507
+ if (!this.firebaseAuth) return [3 /*break*/, 2];
508
+ return [4 /*yield*/, (0, auth_1.signOut)(this.firebaseAuth)];
509
+ case 1:
510
+ _a.sent();
511
+ _a.label = 2;
512
+ case 2:
513
+ this.clearFirebase();
514
+ return [2 /*return*/];
515
+ }
516
+ });
517
+ });
518
+ };
519
+ // Public Methods
520
+ Retter.prototype.authenticateWithCustomToken = function (token) {
521
+ return __awaiter(this, void 0, void 0, function () {
522
+ return __generator(this, function (_a) {
523
+ switch (_a.label) {
524
+ case 0:
525
+ if (!this.initialized)
526
+ throw new Error('Retter SDK not initialized.');
527
+ return [4 /*yield*/, this.sendToAuthQueue({ action: types_1.RetterActions.SIGN_IN, data: token })];
528
+ case 1: return [2 /*return*/, _a.sent()];
529
+ }
530
+ });
531
+ });
532
+ };
533
+ Retter.prototype.signOut = function () {
534
+ return __awaiter(this, void 0, void 0, function () {
535
+ return __generator(this, function (_a) {
536
+ switch (_a.label) {
537
+ case 0:
538
+ if (!this.initialized)
539
+ throw new Error('Retter SDK not initialized.');
540
+ return [4 /*yield*/, this.clearCloudObjects()];
541
+ case 1:
542
+ _a.sent();
543
+ return [4 /*yield*/, this.auth.signOut()];
544
+ case 2:
545
+ _a.sent();
546
+ return [4 /*yield*/, this.auth.clearTokenData()
547
+ // Fire auth status after all tokens cleared
548
+ ];
549
+ case 3:
550
+ _a.sent();
551
+ // Fire auth status after all tokens cleared
552
+ this.fireAuthStatus({});
553
+ return [2 /*return*/];
554
+ }
555
+ });
556
+ });
557
+ };
558
+ Retter.prototype.getCurrentUser = function () {
559
+ return __awaiter(this, void 0, void 0, function () {
560
+ return __generator(this, function (_a) {
561
+ switch (_a.label) {
562
+ case 0: return [4 /*yield*/, this.auth.getCurrentUser()];
563
+ case 1: return [2 /*return*/, _a.sent()];
564
+ }
565
+ });
566
+ });
567
+ };
568
+ Retter.prototype.getCloudObject = function (config) {
569
+ var _a, _b, _c, _d;
570
+ return __awaiter(this, void 0, void 0, function () {
571
+ var instance, data, seekedObject, _e, state, unsubscribers, call, getState, listInstances, retVal;
572
+ var _this = this;
573
+ return __generator(this, function (_f) {
574
+ switch (_f.label) {
575
+ case 0:
576
+ if (!this.initialized)
577
+ throw new Error('Retter SDK not initialized.');
578
+ if (!(config.instanceId && config.useLocal)) return [3 /*break*/, 2];
579
+ return [4 /*yield*/, this.sendToActionQueue({ action: types_1.RetterActions.EMPTY })];
580
+ case 1:
581
+ _f.sent();
582
+ return [3 /*break*/, 4];
583
+ case 2: return [4 /*yield*/, this.sendToActionQueue({ action: types_1.RetterActions.COS_INSTANCE, data: config })];
584
+ case 3:
585
+ data = (_f.sent()).data;
586
+ instance = data;
587
+ config.instanceId = instance.instanceId;
588
+ _f.label = 4;
589
+ case 4:
590
+ seekedObject = this.cloudObjects.find(function (r) { return r.config.classId === config.classId && r.config.instanceId === config.instanceId; });
591
+ if (seekedObject) {
592
+ return [2 /*return*/, {
593
+ call: seekedObject.call,
594
+ state: seekedObject.state,
595
+ listInstances: seekedObject.listInstances,
596
+ getState: seekedObject.getState,
597
+ methods: (_a = instance === null || instance === void 0 ? void 0 : instance.methods) !== null && _a !== void 0 ? _a : [],
598
+ instanceId: config.instanceId,
599
+ response: seekedObject.response,
600
+ isNewInstance: false,
601
+ }];
602
+ }
603
+ return [4 /*yield*/, this.getFirebaseState(config)];
604
+ case 5:
605
+ _e = _f.sent(), state = _e.state, unsubscribers = _e.unsubscribers;
606
+ call = function (params) { return __awaiter(_this, void 0, void 0, function () {
607
+ var error_4;
608
+ return __generator(this, function (_a) {
609
+ switch (_a.label) {
610
+ case 0:
611
+ params.retryConfig = __assign(__assign({}, this.clientConfig.retryConfig), params.retryConfig);
612
+ _a.label = 1;
613
+ case 1:
614
+ _a.trys.push([1, 3, , 8]);
615
+ return [4 /*yield*/, this.sendToActionQueue({
616
+ action: types_1.RetterActions.COS_CALL,
617
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
618
+ })];
619
+ case 2: return [2 /*return*/, _a.sent()];
620
+ case 3:
621
+ error_4 = _a.sent();
622
+ --params.retryConfig.count;
623
+ params.retryConfig.delay *= params.retryConfig.rate;
624
+ if (!(error_4.response && error_4.response.status === 570 && params.retryConfig.count > 0)) return [3 /*break*/, 6];
625
+ return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, params.retryConfig.delay); })];
626
+ case 4:
627
+ _a.sent();
628
+ return [4 /*yield*/, call(params)];
629
+ case 5: return [2 /*return*/, _a.sent()];
630
+ case 6: throw error_4;
631
+ case 7: return [3 /*break*/, 8];
632
+ case 8: return [2 /*return*/];
633
+ }
634
+ });
635
+ }); };
636
+ getState = function (params) { return __awaiter(_this, void 0, void 0, function () {
637
+ return __generator(this, function (_a) {
638
+ switch (_a.label) {
639
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
640
+ action: types_1.RetterActions.COS_STATE,
641
+ data: __assign(__assign({}, params), { classId: config.classId, instanceId: config.instanceId }),
642
+ })];
643
+ case 1: return [2 /*return*/, _a.sent()];
644
+ }
645
+ });
646
+ }); };
647
+ listInstances = function (params) { return __awaiter(_this, void 0, void 0, function () {
648
+ var data;
649
+ return __generator(this, function (_a) {
650
+ switch (_a.label) {
651
+ case 0: return [4 /*yield*/, this.sendToActionQueue({
652
+ action: types_1.RetterActions.COS_LIST,
653
+ data: __assign(__assign({}, params), { classId: config.classId }),
654
+ })];
655
+ case 1:
656
+ data = (_a.sent()).data;
657
+ return [2 /*return*/, data.instanceIds];
658
+ }
659
+ });
660
+ }); };
661
+ retVal = {
662
+ call: call,
663
+ state: state,
664
+ getState: getState,
665
+ listInstances: listInstances,
666
+ methods: (_b = instance === null || instance === void 0 ? void 0 : instance.methods) !== null && _b !== void 0 ? _b : [],
667
+ response: (_c = instance === null || instance === void 0 ? void 0 : instance.response) !== null && _c !== void 0 ? _c : null,
668
+ instanceId: config.instanceId,
669
+ isNewInstance: (_d = instance === null || instance === void 0 ? void 0 : instance.newInstance) !== null && _d !== void 0 ? _d : false,
670
+ };
671
+ this.cloudObjects.push(__assign(__assign({}, retVal), { config: config, unsubscribers: unsubscribers }));
672
+ return [2 /*return*/, retVal];
673
+ }
674
+ });
675
+ });
676
+ };
677
+ Retter.prototype.makeStaticCall = function (params) {
678
+ return __awaiter(this, void 0, void 0, function () {
679
+ return __generator(this, function (_a) {
680
+ switch (_a.label) {
681
+ case 0:
682
+ if (!this.initialized)
683
+ throw new Error('Retter SDK not initialized.');
684
+ return [4 /*yield*/, this.sendToActionQueue({
685
+ action: types_1.RetterActions.COS_STATIC_CALL,
686
+ data: __assign(__assign({}, params), { classId: params.classId }),
687
+ })];
688
+ case 1: return [2 /*return*/, _a.sent()];
689
+ }
690
+ });
691
+ });
692
+ };
693
+ Object.defineProperty(Retter.prototype, "authStatus", {
694
+ get: function () {
695
+ 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; }));
696
+ },
697
+ enumerable: false,
698
+ configurable: true
699
+ });
700
+ Retter.instances = [];
701
+ return Retter;
702
+ }());
703
+ exports.default = Retter;
704
+ //# sourceMappingURL=index.js.map