@subiz/widget-v4 4.0.92 → 4.0.93

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.
Files changed (169) hide show
  1. package/compiled_src/bot.js +0 -11
  2. package/compiled_src/call/call.js +0 -61
  3. package/compiled_src/call/css.js +0 -2
  4. package/compiled_src/chatbox/AgentsAvatar.js +0 -16
  5. package/compiled_src/chatbox/AudioAttachments.js +0 -14
  6. package/compiled_src/chatbox/ButtonAttachments.js +1 -14
  7. package/compiled_src/chatbox/Buttons.js +0 -13
  8. package/compiled_src/chatbox/ChatButton.js +1 -78
  9. package/compiled_src/chatbox/DropdownSelect.js +3 -44
  10. package/compiled_src/chatbox/Emoji.js +0 -7
  11. package/compiled_src/chatbox/Event.js +0 -59
  12. package/compiled_src/chatbox/Events.js +4 -44
  13. package/compiled_src/chatbox/FileAttachments.js +0 -14
  14. package/compiled_src/chatbox/FormAttachment.js +1 -52
  15. package/compiled_src/chatbox/FormAttachments.js +0 -14
  16. package/compiled_src/chatbox/FormSubmitAttachments.js +0 -11
  17. package/compiled_src/chatbox/GenericTemplateAttachments.js +1 -20
  18. package/compiled_src/chatbox/Header.js +1 -46
  19. package/compiled_src/chatbox/ImageAttachments.js +0 -16
  20. package/compiled_src/chatbox/InfoMessage.js +0 -13
  21. package/compiled_src/chatbox/ListField.js +0 -16
  22. package/compiled_src/chatbox/MessageInput.js +1 -47
  23. package/compiled_src/chatbox/Order.js +0 -35
  24. package/compiled_src/chatbox/OrderAttachments.js +1 -23
  25. package/compiled_src/chatbox/PoweredBy.js +0 -7
  26. package/compiled_src/chatbox/ProductAttachments.js +0 -19
  27. package/compiled_src/chatbox/QuickReplies.js +0 -18
  28. package/compiled_src/chatbox/Rating.js +0 -37
  29. package/compiled_src/chatbox/ShadowDomRoot.js +0 -9
  30. package/compiled_src/chatbox/TextMessage.js +0 -64
  31. package/compiled_src/chatbox/Typing.js +0 -15
  32. package/compiled_src/chatbox/VideoAttachments.js +0 -14
  33. package/compiled_src/chatbox/Widget.js +6 -167
  34. package/compiled_src/chatbox/css.js +0 -2
  35. package/compiled_src/chatbox/dragscroll.js +1 -5
  36. package/compiled_src/chatbox/main.js +1 -40
  37. package/compiled_src/chatbox/releaseAnimation.js +0 -11
  38. package/compiled_src/chatbox/spinner.js +0 -10
  39. package/compiled_src/chatbox/time.js +0 -22
  40. package/compiled_src/chatbox/touchscroll.js +0 -7
  41. package/compiled_src/common.js +0 -22
  42. package/compiled_src/contact/contact.js +2 -52
  43. package/compiled_src/contact/css.js +0 -2
  44. package/compiled_src/lib.js +19 -46
  45. package/compiled_src/notif/css.js +0 -2
  46. package/compiled_src/notif/notif.js +0 -63
  47. package/compiled_src/order/address_picker.js +4 -38
  48. package/compiled_src/order/icon.js +0 -16
  49. package/compiled_src/order/index.js +1 -34
  50. package/compiled_src/order/order.js +2 -156
  51. package/compiled_src/plugin.js +1 -77
  52. package/compiled_src/popup/countdown.js +2 -33
  53. package/compiled_src/popup/css.js +0 -2
  54. package/compiled_src/popup/popup.js +2 -165
  55. package/compiled_src/popup/tick.core.commonjs.js +72 -222
  56. package/compiled_src/popup/tick.view.flip.commonjs.js +23 -31
  57. package/compiled_src/store/api.js +99 -65
  58. package/compiled_src/store/api_fake.js +3 -39
  59. package/compiled_src/store/realtime_fake.js +0 -6
  60. package/compiled_src/store/store.js +42 -248
  61. package/compiled_src/util/campaign.js +0 -13
  62. package/compiled_src/util/common.js +15 -185
  63. package/compiled_src/util/common.test.js +0 -4
  64. package/compiled_src/util/extractor.js +1 -21
  65. package/compiled_src/util/extractor.test.js +0 -3
  66. package/compiled_src/util/gate.js +0 -7
  67. package/compiled_src/util/gate.test.js +1 -2
  68. package/compiled_src/util/index.js +1 -7
  69. package/compiled_src/util/mutex.js +31 -0
  70. package/compiled_src/util/op.js +1 -14
  71. package/compiled_src/util/pubsub.js +0 -6
  72. package/compiled_src/util/pubsub.test.js +0 -2
  73. package/package.json +11 -11
  74. package/src/lib.js +24 -2
  75. package/src/store/api.js +110 -21
  76. package/src/store/api_fake.js +5 -6
  77. package/src/store/store.js +31 -5
  78. package/src/util/index.js +1 -0
  79. package/src/util/mutex.js +27 -0
  80. package/dist/132.js +0 -7092
  81. package/dist/178.js +0 -406
  82. package/dist/18364d15f37.132.js +0 -1
  83. package/dist/18364d15f37.178.js +0 -1
  84. package/dist/18364d15f37.213.js +0 -1
  85. package/dist/18364d15f37.335.js +0 -1
  86. package/dist/18364d15f37.362.js +0 -1
  87. package/dist/18364d15f37.441.js +0 -1
  88. package/dist/18364d15f37.605.js +0 -1
  89. package/dist/18364d15f37.678.js +0 -1
  90. package/dist/18364d15f37.782.js +0 -1
  91. package/dist/18364d15f37.app.js +0 -1
  92. package/dist/18364d15f37.index.html +0 -26
  93. package/dist/18364d15f37.library.html +0 -26
  94. package/dist/18364d15f37.library.js +0 -1
  95. package/dist/18364d15f37.preview.html +0 -759
  96. package/dist/18364d15f37.preview.js +0 -1
  97. package/dist/18364d15f37.screenshoot.js +0 -1
  98. package/dist/213.js +0 -3215
  99. package/dist/335.js +0 -411
  100. package/dist/362.js +0 -107
  101. package/dist/441.js +0 -2834
  102. package/dist/605.js +0 -328
  103. package/dist/678.js +0 -107
  104. package/dist/782.js +0 -107
  105. package/dist/HASH +0 -1
  106. package/dist/assets/img/Facebook.64607ec.png +0 -0
  107. package/dist/assets/img/Zalo.6845707.png +0 -0
  108. package/dist/assets/img/award1a.1a58e10.png +0 -0
  109. package/dist/assets/img/award3a.3b74423.png +0 -0
  110. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  111. package/dist/assets/img/award5.39eb7ae.png +0 -0
  112. package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
  113. package/dist/assets/img/caret.998eb8f.svg +0 -1
  114. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  115. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  116. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  117. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  118. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  119. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  120. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  121. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  122. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  123. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  124. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  125. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  126. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  127. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  128. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  129. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  130. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  131. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  132. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  133. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  134. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  135. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  136. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  137. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  138. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  139. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  140. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  141. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  142. package/dist/assets/img/empty.29bed2d.svg +0 -23
  143. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  144. package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
  145. package/dist/assets/img/external-link.90577cc.svg +0 -1
  146. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  147. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  148. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  149. package/dist/assets/img/image_default.be0698b.png +0 -0
  150. package/dist/assets/img/info.ebce7ea.svg +0 -1
  151. package/dist/assets/img/loader.37000a7.svg +0 -1
  152. package/dist/assets/img/loading_static.8f403ae.svg +0 -10
  153. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  154. package/dist/assets/img/main-service2.9b99549.png +0 -0
  155. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  156. package/dist/assets/img/package.8d37d0f.svg +0 -5
  157. package/dist/assets/img/package_fade.763c001.svg +0 -1
  158. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  159. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  160. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  161. package/dist/assets/img/search.f9705ff.svg +0 -1
  162. package/dist/assets/img/send.6db52a9.svg +0 -3
  163. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  164. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  165. package/dist/assets/img/subiz-mono.877e9f5.svg +0 -3
  166. package/dist/assets/img/x.26fdfa3.svg +0 -5
  167. package/dist/malicious-app.js +0 -13
  168. package/dist/screenshoot.html +0 -7
  169. package/dist/screenshoot.js +0 -5953
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  const test = require('tape');
4
-
5
4
  const util = require('./common.js');
6
-
7
5
  test('util.getNotiDescription', t => {
8
6
  var tcs = [{
9
7
  desc: 'not a message sent',
@@ -442,11 +440,9 @@ test('mapize', t => {
442
440
  value: 4
443
441
  }];
444
442
  var m = util.mapize(arr, 'id');
445
-
446
443
  for (var i = 0; i < arr.length; i++) {
447
444
  t.equal(m[i], arr[i]);
448
445
  }
449
-
450
446
  t.end();
451
447
  });
452
448
  test('convo id from topic', t => {
@@ -10,15 +10,11 @@ exports.extractLinks = extractLinks;
10
10
  exports.extractPhones = extractPhones;
11
11
  exports.extractText = extractText;
12
12
  exports.pipeExtracts = pipeExtracts;
13
-
14
13
  var common = require('./common.js');
15
-
16
14
  let emojis = ['like', 'unlike', 'wink', 'tongue-out', 'tired', 'surprised', 'smiling', 'sleepy', 'sad', 'neutral', 'heart-eyes', 'grinning', 'crying', 'confused', 'angry', 'cry', 'heart_eyes', 'neutral_face', 'emoji--disappointed', 'smile', 'open_mouth', 'tired_face', 'stuck_out_tongue', 'moyai', 'thumbsdown', 'dislike', 'thumbsup', 'ok_hand', 'octopus', 'pig2', 'wave', 'mouse', 'mouse2', 'rat'];
17
15
  emojis = common.map(emojis, e => ':' + e + ':');
18
-
19
16
  function extractEmojis(text) {
20
17
  var out = [];
21
-
22
18
  for (var i = 0; i < text.length; i++) {
23
19
  for (var e = 0; e < emojis.length; e++) {
24
20
  if (text.indexOf(emojis[e], i) !== i) continue;
@@ -30,77 +26,63 @@ function extractEmojis(text) {
30
26
  break;
31
27
  }
32
28
  }
33
-
34
29
  return out;
35
30
  }
36
-
37
31
  function extractLinks(text) {
38
32
  text = text || '';
39
33
  var reg = /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.,~#?&//=]*)/gim;
40
34
  var out = [];
41
35
  var match;
42
-
43
36
  while (match = reg.exec(text)) {
44
37
  out.push({
45
38
  index: match.index,
46
39
  length: reg.lastIndex - match.index
47
40
  });
48
41
  }
49
-
50
42
  return out;
51
43
  }
52
-
53
44
  function extractEmails(text) {
54
45
  text = text || '';
55
46
  var reg = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/gim;
56
47
  var out = [];
57
48
  var match;
58
-
59
49
  while (match = reg.exec(text)) {
60
50
  out.push({
61
51
  index: match.index,
62
52
  length: reg.lastIndex - match.index
63
53
  });
64
54
  }
65
-
66
55
  return out;
67
56
  }
68
-
69
57
  function extractPhones(msg) {
70
58
  msg = msg || '';
71
59
  var fgmsg = '';
72
- var realchmap = {};
73
60
 
61
+ var realchmap = {};
74
62
  for (var i = 0; i < msg.length; i++) {
75
63
  var ch = msg.charAt(i);
76
-
77
64
  if (ch !== '.' && ch !== '-' && ch !== ' ') {
78
65
  fgmsg += ch;
79
66
  realchmap[fgmsg.length - 1] = i;
80
67
  continue;
81
68
  }
82
-
83
69
  var prevCh = i > 0 ? msg.charAt(i - 1) : '-';
84
70
  var nextCh = i < msg.length - 1 ? msg.charAt(i + 1) : '-';
85
71
  if ('0123456789'.indexOf(prevCh) !== -1 && '0123456789'.indexOf(nextCh) !== -1) continue;
86
72
  fgmsg += ch;
87
73
  realchmap[fgmsg.length - 1] = i;
88
74
  }
89
-
90
75
  var reg = /([0-9]{8,13})/gim;
91
76
  var out = [];
92
77
  var match;
93
-
94
78
  while (match = reg.exec(fgmsg)) {
95
79
  out.push({
96
80
  index: realchmap[match.index],
97
81
  length: realchmap[reg.lastIndex - 1] - realchmap[match.index] + 1
98
82
  });
99
83
  }
100
-
101
84
  return out;
102
85
  }
103
-
104
86
  function extract(text, extractor, type) {
105
87
  if (!text) return [];
106
88
  var out = [];
@@ -128,7 +110,6 @@ function extract(text, extractor, type) {
128
110
  });
129
111
  return common.filter(out, o => o.text !== '');
130
112
  }
131
-
132
113
  function pipeExtracts(text, extractors) {
133
114
  var out = [];
134
115
  if (common.size(extractors) === 0) return [{
@@ -143,7 +124,6 @@ function pipeExtracts(text, extractors) {
143
124
  });
144
125
  return out;
145
126
  }
146
-
147
127
  function extractText(text) {
148
128
  var link = extractLinks;
149
129
  link.type = 'link';
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var test = require('tape');
4
-
5
4
  var lo = require('lodash');
6
-
7
5
  let {
8
6
  extractEmails,
9
7
  extractPhones,
@@ -12,7 +10,6 @@ let {
12
10
  extractEmojis,
13
11
  maskEmojis
14
12
  } = require('./extractor.js');
15
-
16
13
  test('extract emails', t => {
17
14
  var tcs = [{
18
15
  text: 'email',
@@ -4,13 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  class Gate {
9
8
  constructor(isOpen) {
10
9
  this.isOpen = isOpen === true;
11
10
  this.cbs = [];
12
11
  }
13
-
14
12
  open() {
15
13
  this.isOpen = true;
16
14
  let newcbs = [];
@@ -19,18 +17,15 @@ class Gate {
19
17
  });
20
18
  this.cbs = newcbs;
21
19
  }
22
-
23
20
  close() {
24
21
  this.isOpen = false;
25
22
  }
26
-
27
23
  entry(cb, lock) {
28
24
  if (this.isOpen) {
29
25
  if (lock) this.isOpen = false;
30
26
  cb && cb();
31
27
  return Promise.resolve();
32
28
  }
33
-
34
29
  return new Promise(resolve => {
35
30
  this.cbs.push(() => {
36
31
  if (lock) this.isOpen = false;
@@ -39,7 +34,5 @@ class Gate {
39
34
  });
40
35
  });
41
36
  }
42
-
43
37
  }
44
-
45
38
  exports.default = Gate;
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  var test = require('tape');
4
-
5
4
  var Gate = require('./gate.js');
6
-
7
5
  test('gate', async t => {
8
6
  var gate = new Gate();
7
+
9
8
  var flip = 0;
10
9
  setTimeout(function () {
11
10
  flip = 1;
@@ -4,23 +4,17 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var common = _interopRequireWildcard(require("./common.js"));
9
-
10
8
  var extractor = _interopRequireWildcard(require("./extractor.js"));
11
-
12
9
  var campaign = _interopRequireWildcard(require("./campaign.js"));
13
-
14
10
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
-
16
11
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
12
 
18
13
  var sb = {};
19
14
  sb = Object.assign(sb, common);
20
15
  sb.Gate = require('./gate.js').default;
21
-
16
+ sb.Mutex = require('./mutex.js').default;
22
17
  var op = require('./op.js');
23
-
24
18
  sb.get = op.get;
25
19
  sb.set = op.set;
26
20
  sb.Pubsub = require('./pubsub.js').default;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ class Mutex {
8
+ constructor() {
9
+ this.isOpen = true;
10
+ this.cbs = [];
11
+ }
12
+ _check() {
13
+ if (!this.isOpen) return;
14
+ let cb = this.cbs.pop();
15
+ if (!cb) return;
16
+ this.isOpen = false;
17
+ cb();
18
+ }
19
+ lock() {
20
+ return new Promise(resolve => {
21
+ this.cbs.push(resolve);
22
+ this._check();
23
+ });
24
+ }
25
+ unlock() {
26
+ if (this.isOpen) return;
27
+ this.isOpen = true;
28
+ this._check();
29
+ }
30
+ }
31
+ exports.default = Mutex;
@@ -5,65 +5,52 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.get = get;
7
7
  exports.set = set;
8
- var toStr = Object.prototype.toString;
9
8
 
9
+ var toStr = Object.prototype.toString;
10
10
  var isArray = Array.isArray || function (obj) {
11
11
  return toStr.call(obj) === '[object Array]';
12
12
  };
13
-
14
13
  function hasOwnProperty(obj, prop) {
15
14
  if (obj == null) return false;
16
15
  return Object.prototype.hasOwnProperty.call(obj, prop);
17
16
  }
18
-
19
17
  function getKey(key) {
20
18
  var intKey = parseInt(key);
21
19
  return intKey.toString() === key ? intKey : key;
22
20
  }
23
-
24
21
  function hasShallowProperty(obj, prop) {
25
22
  return typeof prop === 'number' && isArray(obj) || hasOwnProperty(obj, prop);
26
23
  }
27
-
28
24
  function getShallowProperty(obj, prop) {
29
25
  if (hasShallowProperty(obj, prop)) return obj[prop];
30
26
  }
31
-
32
27
  function get(obj, path, defaultValue) {
33
28
  if (typeof path === 'number') path = [path];
34
29
  if (!path || path.length === 0) return obj;
35
30
  if (obj == null) return defaultValue;
36
-
37
31
  if (typeof path === 'string') {
38
32
  return get(obj, path.split('.'), defaultValue);
39
33
  }
40
-
41
34
  var currentPath = getKey(path[0]);
42
35
  var nextObj = getShallowProperty(obj, currentPath);
43
36
  if (nextObj === void 0) return defaultValue;
44
37
  if (path.length === 1) return nextObj;
45
38
  return get(obj[currentPath], path.slice(1), defaultValue);
46
39
  }
47
-
48
40
  function set(obj, path, value) {
49
41
  if (typeof path === 'number') path = [path];
50
42
  if (!path || path.length === 0) return obj;
51
-
52
43
  if (typeof path === 'string') {
53
44
  return set(obj, path.split('.').map(getKey), value);
54
45
  }
55
-
56
46
  var currentPath = path[0];
57
47
  var currentValue = getShallowProperty(obj, currentPath);
58
-
59
48
  if (path.length === 1) {
60
49
  obj[currentPath] = value;
61
50
  return currentValue;
62
51
  }
63
-
64
52
  if (currentValue === void 0) {
65
53
  obj[currentPath] = typeof path[1] === 'number' ? [] : {};
66
54
  }
67
-
68
55
  return set(obj[currentPath], path.slice(1), value);
69
56
  }
@@ -4,17 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var {
9
8
  filter,
10
9
  map
11
10
  } = require('./common.js');
12
-
13
11
  class Pubsub {
14
12
  constructor() {
15
13
  this.listeners = {};
16
14
  }
17
-
18
15
  publish(topic, payload, payload2, payload3) {
19
16
  this.listeners[topic] = filter(this.listeners[topic], sub => sub.obj._isMounted);
20
17
  map(this.listeners[topic], _ref => {
@@ -24,7 +21,6 @@ class Pubsub {
24
21
  return cb(payload, payload2, payload3);
25
22
  });
26
23
  }
27
-
28
24
  on2(obj, topic, cb) {
29
25
  if (!this.listeners[topic]) this.listeners[topic] = [];
30
26
  this.listeners[topic].push({
@@ -32,7 +28,5 @@ class Pubsub {
32
28
  cb
33
29
  });
34
30
  }
35
-
36
31
  }
37
-
38
32
  exports.default = Pubsub;
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var test = require('tape');
4
-
5
4
  var Pubsub = require('./pubsub.js');
6
-
7
5
  test('pubsub simple', t => {
8
6
  var ps = new Pubsub();
9
7
  var msg = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.0.92",
3
+ "version": "4.0.93",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -14,27 +14,27 @@
14
14
  "@subiz/storage": "0.0.8",
15
15
  "@subiz/wsclient": "^3.1.7",
16
16
  "cookie_js": "1.4.2",
17
- "core-js": "^3.25.5",
17
+ "core-js": "^3.26.1",
18
18
  "css-loader": "5.2.7",
19
19
  "file-loader": "^6.2.0",
20
20
  "less": "^4.1.3",
21
- "less-loader": "^11.0.0",
22
- "marked": "^4.1.1",
23
- "preact": "^10.11.1"
21
+ "less-loader": "^11.1.0",
22
+ "marked": "^4.2.2",
23
+ "preact": "^10.11.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@babel/cli": "^7.19.3",
27
- "@babel/core": "^7.19.3",
27
+ "@babel/core": "^7.20.2",
28
28
  "@babel/plugin-proposal-class-properties": "^7.18.6",
29
29
  "@babel/plugin-transform-react-jsx": "^7.19.0",
30
- "@babel/preset-env": "^7.19.4",
31
- "babel-loader": "^8.2.5",
30
+ "@babel/preset-env": "^7.20.2",
31
+ "babel-loader": "^9.1.0",
32
32
  "babel-plugin-syntax-jsx": "^6.18.0",
33
33
  "html-webpack-plugin": "^5.5.0",
34
34
  "prettier": "^2.7.1",
35
- "puppeteer": "^18.2.1",
36
- "webpack": "^5.74.0",
37
- "webpack-bundle-analyzer": "^4.6.1",
35
+ "puppeteer": "^19.2.2",
36
+ "webpack": "^5.75.0",
37
+ "webpack-bundle-analyzer": "^4.7.0",
38
38
  "webpack-cli": "^4.10.0",
39
39
  "webpack-dev-server": "^4.11.1"
40
40
  }
package/src/lib.js CHANGED
@@ -10,9 +10,9 @@ document.head.append($link)
10
10
  sb.preloadWebfonts(['Roboto'], [400, 500])
11
11
 
12
12
  class Widget {
13
- constructor(ApiURL, FileURL, RealtimeURL, inmem, fake, agenttoken) {
13
+ constructor(ApiURL, FileURL, RealtimeURL, inmem, fake) {
14
14
  this.domGate = new sb.Gate()
15
- this.store = new Store(ApiURL, FileURL, RealtimeURL, inmem, fake, agenttoken)
15
+ this.store = new Store(ApiURL, FileURL, RealtimeURL, inmem, fake)
16
16
 
17
17
  // expose store for debugging purpose
18
18
  window.sbz_store = this.store
@@ -37,6 +37,28 @@ class Widget {
37
37
  cb()
38
38
  }
39
39
 
40
+ async cleanLogin(user_id, tokenGenerator) {}
41
+
42
+ async login(accid, user_id, tokenGenerator, $container) {
43
+ let user = await this.store.login(accid, user_id, tokenGenerator)
44
+
45
+ if (!$container) $container = document.body
46
+ this.pluginMgr = new PluginMgr(this, $container)
47
+
48
+ let clean = setInterval(() => {
49
+ // check if the dom is deleted
50
+ if ($container && $container.isConnected) return
51
+ this.pluginMgr.destroy()
52
+ clearInterval(clean)
53
+ }, 1000)
54
+ this.domGate.open()
55
+ return user
56
+ }
57
+
58
+ logout(accid) {
59
+ return this.store.logout()
60
+ }
61
+
40
62
  async setAccount(id, $container, mask, cb) {
41
63
  let outmask = await this.store.init(id, mask)
42
64
  // add container to client site
package/src/store/api.js CHANGED
@@ -13,6 +13,8 @@ function jsonifyTextPlain(param, done) {
13
13
 
14
14
  export default class {
15
15
  constructor(ApiURL, FileURL) {
16
+ this.refreshLock = new sb.Mutex()
17
+
16
18
  this.FileURL = FileURL
17
19
  this.ApiURL = ApiURL
18
20
  this.apireq = ajax
@@ -23,7 +25,19 @@ export default class {
23
25
  .beforeHook(jsonifyTextPlain)
24
26
  .setParser('json')
25
27
  .beforeHook((param, done) => {
26
- // attachAccessToken
28
+ if (this.token_generator) {
29
+ let user_id = this.profile_id
30
+ this.token_generator().then((token) => {
31
+ if (user_id != this.profile_id) return done(true) // outdated
32
+
33
+ if (!token) return done(false)
34
+ if (token == 'error') return done(false)
35
+ param.request = param.request.addQuery('x-access-token', token)
36
+ return done(true)
37
+ })
38
+ return
39
+ }
40
+
27
41
  if (this.mask) param.request = param.request.addQuery('x-user-mask', this.mask)
28
42
  return done(true)
29
43
  })
@@ -40,6 +54,101 @@ export default class {
40
54
  this.uid = obj.uid
41
55
  }
42
56
 
57
+ async setTokenGenerator(accid, uid, tokenGenerator) {
58
+ this.tokensession = this.tokensession || 0
59
+ this.tokensession++
60
+ let tokensession = this.tokensession
61
+
62
+ if (!accid || !sb.startsWith(accid, 'ac')) return {error: 'invalid_account_id'}
63
+ if (!uid) return {error: 'invalid_user_id'}
64
+ if (typeof tokenGenerator !== 'function') return {error: 'invalid_token_generator'}
65
+
66
+ this.accid = accid
67
+ this.profile_id = uid
68
+ this.token_generator = async (force) => {
69
+ await this.refreshLock.lock()
70
+ if (tokensession != this.tokensession) {
71
+ this.refreshLock.unlock()
72
+ return // outdated
73
+ }
74
+ let age = (sb.Date.now() - (this.last_token_at || 0)) / 1000
75
+
76
+ // very good token, use this one
77
+ if (!force && this.last_token && age < 1800) {
78
+ this.refreshLock.unlock()
79
+ return this.last_token
80
+ }
81
+
82
+ if (!force && this.last_token && age < 3000) {
83
+ // the token is still good, but should get new one
84
+ if (this.token_generator)
85
+ setTimeout(async () => {
86
+ let token, err
87
+ try {
88
+ token = await tokenGenerator(uid)
89
+ } catch (e) {
90
+ err = e
91
+ }
92
+ if (tokensession != this.tokensession) {
93
+ this.refreshLock.unlock()
94
+ return // outdated
95
+ }
96
+
97
+ if (err) this.last_token = 'error'
98
+ else this.last_token = token
99
+ this.last_token_at = sb.Date.now()
100
+ this.refreshLock.unlock()
101
+ })
102
+ return this.last_token
103
+ }
104
+
105
+ // the token is outdated, must get new one
106
+ let token
107
+ let err
108
+ try {
109
+ token = await tokenGenerator(uid)
110
+ } catch (e) {
111
+ err = e
112
+ }
113
+
114
+ if (tokensession != this.tokensession) {
115
+ this.refreshLock.unlock()
116
+ return // outdated
117
+ }
118
+
119
+ if (err) this.last_token = 'error'
120
+ else this.last_token = token
121
+ this.last_token_at = sb.Date.now()
122
+ this.refreshLock.unlock()
123
+ return this.last_token
124
+ }
125
+
126
+ let outuser
127
+ for (let i = 0; true; i++) {
128
+ await this.token_generator(true)
129
+ if (tokensession != this.tokensession) break // outdated
130
+ outuser = await ajax
131
+ .setBaseUrl(this.ApiURL)
132
+ .withCredentials(true)
133
+ .addQuery('v', '6')
134
+ .addQuery('x-access-token', this.last_token)
135
+ .setParser('json')
136
+ .get(`/accounts/${accid}/users/${uid}`)
137
+ if (!sb.get(outuser, 'body.id')) {
138
+ let sleeptime = Math.min(2000 + i * 100, 120000)
139
+ await sb.sleep(sleeptime)
140
+ continue
141
+ }
142
+ break
143
+ }
144
+ if (outuser.error) {
145
+ if (sb.get(outuser.body.code)) return {error: outuser.body.code}
146
+ return outuser
147
+ }
148
+ this.uid = outuser.body.id
149
+ return outuser.body
150
+ }
151
+
43
152
  listConversations = (_) =>
44
153
  this.apireq
45
154
  .addQuery('user_id', this.uid)
@@ -119,26 +228,6 @@ export default class {
119
228
 
120
229
  getChallenge = (accid) => this.apireq.post(`/accounts/${accid}/scrypt-challenges`)
121
230
 
122
- async createAgentUser(agenttoken) {
123
- for (var i = 0; i < 10; i++) {
124
- let {body, error} = await ajax
125
- .setBaseUrl(this.ApiURL)
126
- .setContentType('text/plain')
127
- .beforeHook(jsonifyTextPlain)
128
- .setParser('json')
129
- .addQuery('x-access-token', agenttoken)
130
- .post(`/agent-users`)
131
- if (error) {
132
- await sb.sleep(1000)
133
- continue
134
- }
135
-
136
- let userid = body ? body.id || '' : ''
137
- if (!userid) return ''
138
- return body.account_id + '@' + userid
139
- }
140
- }
141
-
142
231
  async createUser(accid) {
143
232
  for (var i = 0; i < 10; i++) {
144
233
  const {body: challenge} = await this.getChallenge(accid)
@@ -16,11 +16,7 @@ const OK200 = Promise.resolve({code: 200})
16
16
  export default class {
17
17
  constructor(ApiURL, FileURL) {
18
18
  this.FileURL = FileURL
19
- this.apireq = ajax
20
- .setBaseUrl(ApiURL)
21
- .setContentType('text/plain')
22
- .beforeHook(jsonifyTextPlain)
23
- .setParser('json')
19
+ this.apireq = ajax.setBaseUrl(ApiURL).setContentType('text/plain').beforeHook(jsonifyTextPlain).setParser('json')
24
20
  }
25
21
 
26
22
  // for faking data (optional for real api)
@@ -28,6 +24,10 @@ export default class {
28
24
  this.agentid = agid
29
25
  }
30
26
 
27
+ setTokenGenerator(accid, uid, tokenGenerator) {
28
+ this.accid = accid
29
+ }
30
+
31
31
  setAuth(obj) {
32
32
  this.accid = obj.accid
33
33
  this.mask = obj.mask
@@ -66,7 +66,6 @@ export default class {
66
66
  getChallenge = (accid) => OK200
67
67
 
68
68
  createUser = (accid) => Promise.resolve({account_id: accid, id: 'usqzgtgfake', mask: 'fakemask'})
69
- createAgentUser = (agenttoken) => Promise.resolve('fakemask')
70
69
 
71
70
  time = (_) => Promise.resolve({code: 200, body: new sb.Date().toISOString()})
72
71
  updateUser = (data) => OK200