qiscus-sdk-core 2.14.0 → 2.14.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/qiscus-sdk-core.js +130 -14
- package/dist/qiscus-sdk-core.js.map +1 -1
- package/dist/qiscus-sdk-core.min.js +3 -3
- package/dist/qiscus-sdk-core.min.js.map +1 -1
- package/lib/index.js +14 -3
- package/lib/lib/adapters/expired-token.js +4 -5
- package/lib/lib/adapters/mqtt.js +25 -2
- package/lib/lib/adapters/sync.js +71 -2
- package/lib/lib/utils.js +14 -0
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -475,9 +475,12 @@ var QiscusSDK = /*#__PURE__*/function () {
|
|
|
475
475
|
return _this2._retrySendComment(m);
|
|
476
476
|
});
|
|
477
477
|
});
|
|
478
|
+
this.syncAdapter.on('last-message-id.new', function (id) {
|
|
479
|
+
_this2.last_received_comment_id = id;
|
|
480
|
+
});
|
|
478
481
|
this.customEventAdapter = (0, _customEvent["default"])(this.realtimeAdapter, this.user_id);
|
|
479
482
|
this.setEventListeners();
|
|
480
|
-
case
|
|
483
|
+
case 57:
|
|
481
484
|
case "end":
|
|
482
485
|
return _context3.stop();
|
|
483
486
|
}
|
|
@@ -661,20 +664,28 @@ var QiscusSDK = /*#__PURE__*/function () {
|
|
|
661
664
|
});
|
|
662
665
|
_this3.HTTPAdapter.setToken(_this3.userData.token);
|
|
663
666
|
var user = response.user;
|
|
667
|
+
_this3._delayedSync = (0, _utils.delayed)(function () {
|
|
668
|
+
_this3.synchronize();
|
|
669
|
+
_this3.synchronizeEvent();
|
|
670
|
+
}, 500);
|
|
664
671
|
_this3.expiredTokenAdapter = new _expiredToken.ExpiredTokenAdapter({
|
|
665
672
|
httpAdapter: _this3.HTTPAdapter,
|
|
666
673
|
refreshToken: user.refresh_token,
|
|
667
674
|
expiredAt: user.token_expires_at,
|
|
668
675
|
userId: _this3.user_id,
|
|
669
|
-
onTokenRefreshed: function onTokenRefreshed(token, refreshToken, expiredAt) {
|
|
676
|
+
onTokenRefreshed: function onTokenRefreshed(token, refreshToken, expiredAt, oldToken) {
|
|
670
677
|
_this3.userData.token = token;
|
|
671
678
|
_this3.userData.refresh_token = refreshToken;
|
|
672
679
|
_this3.userData.token_expires_at = expiredAt === null || expiredAt === void 0 ? void 0 : expiredAt.toJSON();
|
|
673
680
|
_this3.events.emit('token-refreshed', {
|
|
674
681
|
token: token,
|
|
675
682
|
refreshToken: refreshToken,
|
|
676
|
-
expiredAt: expiredAt
|
|
683
|
+
expiredAt: expiredAt,
|
|
684
|
+
oldToken: oldToken
|
|
677
685
|
});
|
|
686
|
+
_this3.realtimeAdapter.unsusbcribeUserChannelByToken(oldToken);
|
|
687
|
+
_this3.realtimeAdapter.subscribeUserChannelByToken(token);
|
|
688
|
+
_this3._delayedSync();
|
|
678
689
|
},
|
|
679
690
|
getAuthenticationStatus: function getAuthenticationStatus() {
|
|
680
691
|
return _this3.user_id != null && _this3.isLogin;
|
|
@@ -21,7 +21,7 @@ var ExpiredTokenAdapter = exports.ExpiredTokenAdapter = /*#__PURE__*/function ()
|
|
|
21
21
|
* userId: string,
|
|
22
22
|
* refreshToken: string | null,
|
|
23
23
|
* expiredAt: string | null,
|
|
24
|
-
* onTokenRefreshed: (token: string, refreshToken: string, expiredAt: Date) => void
|
|
24
|
+
* onTokenRefreshed: (token: string, refreshToken: string, expiredAt: Date, oldToken: string) => void
|
|
25
25
|
* getAuthenticationStatus: () => boolean,
|
|
26
26
|
* }} param
|
|
27
27
|
*/
|
|
@@ -41,7 +41,7 @@ var ExpiredTokenAdapter = exports.ExpiredTokenAdapter = /*#__PURE__*/function ()
|
|
|
41
41
|
(0, _defineProperty2["default"])(this, "_expiredAt", null);
|
|
42
42
|
/** @type {import('./http').default} */
|
|
43
43
|
(0, _defineProperty2["default"])(this, "_http", void 0);
|
|
44
|
-
/** @type {(token: string, refreshToken: string, expiredAt: Date) => void | undefined} */
|
|
44
|
+
/** @type {(token: string, refreshToken: string, expiredAt: Date, oldToken: string) => void | undefined} */
|
|
45
45
|
(0, _defineProperty2["default"])(this, "_onTokenRefreshed", void 0);
|
|
46
46
|
/** @type {any} */
|
|
47
47
|
(0, _defineProperty2["default"])(this, "_timerId", void 0);
|
|
@@ -107,13 +107,12 @@ var ExpiredTokenAdapter = exports.ExpiredTokenAdapter = /*#__PURE__*/function ()
|
|
|
107
107
|
var res = r.body.results;
|
|
108
108
|
var token = res.token;
|
|
109
109
|
_this2._refreshToken = res.refresh_token;
|
|
110
|
+
// @ts-ignore
|
|
111
|
+
(_this2$_onTokenRefres = _this2._onTokenRefreshed) === null || _this2$_onTokenRefres === void 0 || _this2$_onTokenRefres.call(_this2, token, _this2._refreshToken, _this2._expiredAt, _this2._http.token);
|
|
110
112
|
_this2._http.setToken(res.token);
|
|
111
113
|
if (res.token_expires_at != null) {
|
|
112
114
|
_this2._expiredAt = new Date(res.token_expires_at);
|
|
113
115
|
}
|
|
114
|
-
|
|
115
|
-
// @ts-ignore
|
|
116
|
-
(_this2$_onTokenRefres = _this2._onTokenRefreshed) === null || _this2$_onTokenRefres === void 0 || _this2$_onTokenRefres.call(_this2, token, _this2._refreshToken, _this2._expiredAt);
|
|
117
116
|
_this2._setTimer(_this2._expiredAt);
|
|
118
117
|
return res;
|
|
119
118
|
}));
|
package/lib/lib/adapters/mqtt.js
CHANGED
|
@@ -222,7 +222,7 @@ var MqttAdapter = exports["default"] = /*#__PURE__*/function () {
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
/**
|
|
225
|
-
* @return {Promise<boolean}
|
|
225
|
+
* @return {Promise<boolean>}
|
|
226
226
|
*/
|
|
227
227
|
}, {
|
|
228
228
|
key: "openConnection",
|
|
@@ -312,12 +312,12 @@ var MqttAdapter = exports["default"] = /*#__PURE__*/function () {
|
|
|
312
312
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
313
313
|
args[_key2] = arguments[_key2];
|
|
314
314
|
}
|
|
315
|
-
this.logger('subscribe to', args);
|
|
316
315
|
this.subscribtionBuffer.push(args);
|
|
317
316
|
while (this.mqtt != null && this.subscribtionBuffer.length > 0) {
|
|
318
317
|
var subs = this.subscribtionBuffer.shift();
|
|
319
318
|
if (subs != null) {
|
|
320
319
|
var _this$mqtt;
|
|
320
|
+
this.logger('subscribe topic', subs);
|
|
321
321
|
(_this$mqtt = this.mqtt).subscribe.apply(_this$mqtt, (0, _toConsumableArray2["default"])(subs));
|
|
322
322
|
}
|
|
323
323
|
}
|
|
@@ -333,6 +333,7 @@ var MqttAdapter = exports["default"] = /*#__PURE__*/function () {
|
|
|
333
333
|
var subs = this.unsubscribtionBuffer.shift();
|
|
334
334
|
if (subs != null) {
|
|
335
335
|
var _this$mqtt2;
|
|
336
|
+
this.logger('unsubscribe topic', subs);
|
|
336
337
|
(_this$mqtt2 = this.mqtt).unsubscribe.apply(_this$mqtt2, (0, _toConsumableArray2["default"])(subs));
|
|
337
338
|
}
|
|
338
339
|
}
|
|
@@ -349,6 +350,7 @@ var MqttAdapter = exports["default"] = /*#__PURE__*/function () {
|
|
|
349
350
|
while (this.mqtt != null && this.publishBuffer.length > 0) {
|
|
350
351
|
var data = this.publishBuffer.shift();
|
|
351
352
|
if (data != null) {
|
|
353
|
+
this.logger('publish to', data.topic, data.payload, data.options);
|
|
352
354
|
this.mqtt.publish(data.topic, data.payload.toString(), data.options);
|
|
353
355
|
}
|
|
354
356
|
}
|
|
@@ -630,6 +632,27 @@ var MqttAdapter = exports["default"] = /*#__PURE__*/function () {
|
|
|
630
632
|
this.subscribe("".concat(this.core.userData.token, "/n"));
|
|
631
633
|
this.subscribe("".concat(this.core.userData.token, "/update"));
|
|
632
634
|
}
|
|
635
|
+
}, {
|
|
636
|
+
key: "subscribeUserChannelByToken",
|
|
637
|
+
value: function subscribeUserChannelByToken(token) {
|
|
638
|
+
this.subscribe("".concat(token, "/c"));
|
|
639
|
+
this.subscribe("".concat(token, "/n"));
|
|
640
|
+
this.subscribe("".concat(token, "/update"));
|
|
641
|
+
}
|
|
642
|
+
}, {
|
|
643
|
+
key: "unsubscribeUserChannel",
|
|
644
|
+
value: function unsubscribeUserChannel() {
|
|
645
|
+
this.unsubscribe("".concat(this.core.userData.token, "/c"));
|
|
646
|
+
this.unsubscribe("".concat(this.core.userData.token, "/n"));
|
|
647
|
+
this.unsubscribe("".concat(this.core.userData.token, "/update"));
|
|
648
|
+
}
|
|
649
|
+
}, {
|
|
650
|
+
key: "unsusbcribeUserChannelByToken",
|
|
651
|
+
value: function unsusbcribeUserChannelByToken(token) {
|
|
652
|
+
this.unsubscribe("".concat(token, "/c"));
|
|
653
|
+
this.unsubscribe("".concat(token, "/n"));
|
|
654
|
+
this.unsubscribe("".concat(token, "/update"));
|
|
655
|
+
}
|
|
633
656
|
}, {
|
|
634
657
|
key: "publishPresence",
|
|
635
658
|
value: function publishPresence(userId) {
|
package/lib/lib/adapters/sync.js
CHANGED
|
@@ -11,6 +11,9 @@ var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpe
|
|
|
11
11
|
var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
|
|
12
12
|
var _mitt = _interopRequireDefault(require("mitt"));
|
|
13
13
|
var _urlBuilder = _interopRequireDefault(require("../url-builder"));
|
|
14
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
15
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
16
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
14
17
|
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
|
|
15
18
|
function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(r) { var n = this.s["return"]; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, "throw": function _throw(r) { var n = this.s["return"]; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
|
|
16
19
|
var noop = function noop() {};
|
|
@@ -417,10 +420,76 @@ function SyncAdapter(getHttpAdapter, _ref) {
|
|
|
417
420
|
return enableSync();
|
|
418
421
|
},
|
|
419
422
|
synchronize: function synchronize() {
|
|
420
|
-
|
|
423
|
+
return (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
424
|
+
var _result$messages, _result$lastMessageId;
|
|
425
|
+
var id, result, messages, lastMessageId, _iterator3, _step3, message;
|
|
426
|
+
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
427
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
428
|
+
case 0:
|
|
429
|
+
id = lastCommentId();
|
|
430
|
+
_context5.next = 3;
|
|
431
|
+
return syncFactory.synchronize(id);
|
|
432
|
+
case 3:
|
|
433
|
+
result = _context5.sent;
|
|
434
|
+
messages = (_result$messages = result === null || result === void 0 ? void 0 : result.messages) !== null && _result$messages !== void 0 ? _result$messages : [];
|
|
435
|
+
lastMessageId = (_result$lastMessageId = result === null || result === void 0 ? void 0 : result.lastMessageId) !== null && _result$lastMessageId !== void 0 ? _result$lastMessageId : -1;
|
|
436
|
+
_iterator3 = _createForOfIteratorHelper(messages);
|
|
437
|
+
try {
|
|
438
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
439
|
+
message = _step3.value;
|
|
440
|
+
emitter.emit('message.new', message);
|
|
441
|
+
}
|
|
442
|
+
} catch (err) {
|
|
443
|
+
_iterator3.e(err);
|
|
444
|
+
} finally {
|
|
445
|
+
_iterator3.f();
|
|
446
|
+
}
|
|
447
|
+
if (lastMessageId > 0) {
|
|
448
|
+
emitter.emit('last-message-id.new', lastMessageId);
|
|
449
|
+
}
|
|
450
|
+
case 9:
|
|
451
|
+
case "end":
|
|
452
|
+
return _context5.stop();
|
|
453
|
+
}
|
|
454
|
+
}, _callee5);
|
|
455
|
+
}))();
|
|
421
456
|
},
|
|
422
457
|
synchronizeEvent: function synchronizeEvent() {
|
|
423
|
-
|
|
458
|
+
return (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
459
|
+
var result, eventId;
|
|
460
|
+
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
461
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
462
|
+
case 0:
|
|
463
|
+
_context6.next = 2;
|
|
464
|
+
return syncEventFactory.synchronize(lastEventId);
|
|
465
|
+
case 2:
|
|
466
|
+
result = _context6.sent;
|
|
467
|
+
try {
|
|
468
|
+
eventId = result.lastId;
|
|
469
|
+
if (eventId > getId()) {
|
|
470
|
+
emitter.emit('last-event-id.new', eventId);
|
|
471
|
+
result.messageDelivered.forEach(function (it) {
|
|
472
|
+
return emitter.emit('message.delivered', it);
|
|
473
|
+
});
|
|
474
|
+
result.messageDeleted.forEach(function (it) {
|
|
475
|
+
return emitter.emit('message.deleted', it);
|
|
476
|
+
});
|
|
477
|
+
result.messageRead.forEach(function (it) {
|
|
478
|
+
return emitter.emit('message.read', it);
|
|
479
|
+
});
|
|
480
|
+
result.roomCleared.forEach(function (it) {
|
|
481
|
+
return emitter.emit('room.cleared', it);
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
} catch (e) {
|
|
485
|
+
logger('error when sync event', e.message);
|
|
486
|
+
}
|
|
487
|
+
case 4:
|
|
488
|
+
case "end":
|
|
489
|
+
return _context6.stop();
|
|
490
|
+
}
|
|
491
|
+
}, _callee6);
|
|
492
|
+
}))();
|
|
424
493
|
}
|
|
425
494
|
};
|
|
426
495
|
}
|
package/lib/lib/utils.js
CHANGED
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.GroupChatBuilder = void 0;
|
|
8
|
+
exports.delayed = delayed;
|
|
8
9
|
exports.escapeHTML = escapeHTML;
|
|
9
10
|
exports.scrollToBottom = scrollToBottom;
|
|
10
11
|
exports.searchAndReplace = searchAndReplace;
|
|
@@ -106,4 +107,17 @@ function scrollToBottom(latestCommentId) {
|
|
|
106
107
|
// on entering the room, wait for data processed then focus on comment form
|
|
107
108
|
document.getElementsByClassName('qcw-comment-form').item(0).getElementsByTagName('textarea').item(0).focus();
|
|
108
109
|
});
|
|
110
|
+
}
|
|
111
|
+
function delayed(cb, timeout) {
|
|
112
|
+
var timer = null;
|
|
113
|
+
return function () {
|
|
114
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
115
|
+
args[_key2] = arguments[_key2];
|
|
116
|
+
}
|
|
117
|
+
if (timer != null) clearTimeout(timer);
|
|
118
|
+
timer = setTimeout(function () {
|
|
119
|
+
cb.apply(void 0, args);
|
|
120
|
+
timer = null;
|
|
121
|
+
}, timeout);
|
|
122
|
+
};
|
|
109
123
|
}
|