@nlabs/reaktor 0.3.0 → 0.4.0

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 (56) hide show
  1. package/lib/config.js +153 -0
  2. package/lib/data/conversations.js +311 -0
  3. package/lib/data/dynamodb.js +206 -0
  4. package/lib/data/email.js +222 -0
  5. package/lib/data/files.js +525 -0
  6. package/lib/data/groups.js +435 -0
  7. package/lib/data/images.d.ts +3 -2
  8. package/lib/data/images.js +1051 -0
  9. package/lib/data/index.js +266 -0
  10. package/lib/data/ios.js +355 -0
  11. package/lib/data/locations.js +172 -0
  12. package/lib/data/messages.js +299 -0
  13. package/lib/data/notifications.d.ts +2 -2
  14. package/lib/data/notifications.js +59 -0
  15. package/lib/data/payments.js +771 -0
  16. package/lib/data/posts.d.ts +1 -1
  17. package/lib/data/posts.js +766 -0
  18. package/lib/data/reactions.js +529 -0
  19. package/lib/data/s3.js +155 -0
  20. package/lib/data/search.js +155 -0
  21. package/lib/data/sms.js +83 -0
  22. package/lib/data/subscription.js +337 -0
  23. package/lib/data/tags.js +397 -0
  24. package/lib/data/users.d.ts +7 -4
  25. package/lib/data/users.js +470 -0
  26. package/lib/data/websockets.js +250 -0
  27. package/lib/index.js +45 -0
  28. package/lib/types/apps.js +2 -0
  29. package/lib/types/arangodb.js +2 -0
  30. package/lib/types/auth.js +2 -0
  31. package/lib/types/conversations.d.ts +2 -0
  32. package/lib/types/conversations.js +2 -0
  33. package/lib/types/email.js +2 -0
  34. package/lib/types/files.js +2 -0
  35. package/lib/types/google.js +2 -0
  36. package/lib/types/groups.js +2 -0
  37. package/lib/types/images.js +2 -0
  38. package/lib/types/index.js +227 -0
  39. package/lib/types/locations.js +2 -0
  40. package/lib/types/messages.js +2 -0
  41. package/lib/types/notifications.js +2 -0
  42. package/lib/types/payments.js +2 -0
  43. package/lib/types/posts.js +2 -0
  44. package/lib/types/reactions.d.ts +2 -0
  45. package/lib/types/reactions.js +2 -0
  46. package/lib/types/tags.js +2 -0
  47. package/lib/types/users.d.ts +1 -0
  48. package/lib/types/users.js +2 -0
  49. package/lib/utils/analytics.js +83 -0
  50. package/lib/utils/arangodb.js +143 -0
  51. package/lib/utils/auth.js +75 -0
  52. package/lib/utils/graphql.js +21 -0
  53. package/lib/utils/index.js +84 -0
  54. package/lib/utils/objects.js +62 -0
  55. package/lib/utils/redis.js +36 -0
  56. package/package.json +30 -30
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _conversations = require("./conversations");
8
+
9
+ Object.keys(_conversations).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _conversations[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _conversations[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _dynamodb = require("./dynamodb");
21
+
22
+ Object.keys(_dynamodb).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _dynamodb[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function get() {
28
+ return _dynamodb[key];
29
+ }
30
+ });
31
+ });
32
+
33
+ var _email = require("./email");
34
+
35
+ Object.keys(_email).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _email[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function get() {
41
+ return _email[key];
42
+ }
43
+ });
44
+ });
45
+
46
+ var _files = require("./files");
47
+
48
+ Object.keys(_files).forEach(function (key) {
49
+ if (key === "default" || key === "__esModule") return;
50
+ if (key in exports && exports[key] === _files[key]) return;
51
+ Object.defineProperty(exports, key, {
52
+ enumerable: true,
53
+ get: function get() {
54
+ return _files[key];
55
+ }
56
+ });
57
+ });
58
+
59
+ var _groups = require("./groups");
60
+
61
+ Object.keys(_groups).forEach(function (key) {
62
+ if (key === "default" || key === "__esModule") return;
63
+ if (key in exports && exports[key] === _groups[key]) return;
64
+ Object.defineProperty(exports, key, {
65
+ enumerable: true,
66
+ get: function get() {
67
+ return _groups[key];
68
+ }
69
+ });
70
+ });
71
+
72
+ var _images = require("./images");
73
+
74
+ Object.keys(_images).forEach(function (key) {
75
+ if (key === "default" || key === "__esModule") return;
76
+ if (key in exports && exports[key] === _images[key]) return;
77
+ Object.defineProperty(exports, key, {
78
+ enumerable: true,
79
+ get: function get() {
80
+ return _images[key];
81
+ }
82
+ });
83
+ });
84
+
85
+ var _ios = require("./ios");
86
+
87
+ Object.keys(_ios).forEach(function (key) {
88
+ if (key === "default" || key === "__esModule") return;
89
+ if (key in exports && exports[key] === _ios[key]) return;
90
+ Object.defineProperty(exports, key, {
91
+ enumerable: true,
92
+ get: function get() {
93
+ return _ios[key];
94
+ }
95
+ });
96
+ });
97
+
98
+ var _locations = require("./locations");
99
+
100
+ Object.keys(_locations).forEach(function (key) {
101
+ if (key === "default" || key === "__esModule") return;
102
+ if (key in exports && exports[key] === _locations[key]) return;
103
+ Object.defineProperty(exports, key, {
104
+ enumerable: true,
105
+ get: function get() {
106
+ return _locations[key];
107
+ }
108
+ });
109
+ });
110
+
111
+ var _messages = require("./messages");
112
+
113
+ Object.keys(_messages).forEach(function (key) {
114
+ if (key === "default" || key === "__esModule") return;
115
+ if (key in exports && exports[key] === _messages[key]) return;
116
+ Object.defineProperty(exports, key, {
117
+ enumerable: true,
118
+ get: function get() {
119
+ return _messages[key];
120
+ }
121
+ });
122
+ });
123
+
124
+ var _notifications = require("./notifications");
125
+
126
+ Object.keys(_notifications).forEach(function (key) {
127
+ if (key === "default" || key === "__esModule") return;
128
+ if (key in exports && exports[key] === _notifications[key]) return;
129
+ Object.defineProperty(exports, key, {
130
+ enumerable: true,
131
+ get: function get() {
132
+ return _notifications[key];
133
+ }
134
+ });
135
+ });
136
+
137
+ var _payments = require("./payments");
138
+
139
+ Object.keys(_payments).forEach(function (key) {
140
+ if (key === "default" || key === "__esModule") return;
141
+ if (key in exports && exports[key] === _payments[key]) return;
142
+ Object.defineProperty(exports, key, {
143
+ enumerable: true,
144
+ get: function get() {
145
+ return _payments[key];
146
+ }
147
+ });
148
+ });
149
+
150
+ var _posts = require("./posts");
151
+
152
+ Object.keys(_posts).forEach(function (key) {
153
+ if (key === "default" || key === "__esModule") return;
154
+ if (key in exports && exports[key] === _posts[key]) return;
155
+ Object.defineProperty(exports, key, {
156
+ enumerable: true,
157
+ get: function get() {
158
+ return _posts[key];
159
+ }
160
+ });
161
+ });
162
+
163
+ var _reactions = require("./reactions");
164
+
165
+ Object.keys(_reactions).forEach(function (key) {
166
+ if (key === "default" || key === "__esModule") return;
167
+ if (key in exports && exports[key] === _reactions[key]) return;
168
+ Object.defineProperty(exports, key, {
169
+ enumerable: true,
170
+ get: function get() {
171
+ return _reactions[key];
172
+ }
173
+ });
174
+ });
175
+
176
+ var _s = require("./s3");
177
+
178
+ Object.keys(_s).forEach(function (key) {
179
+ if (key === "default" || key === "__esModule") return;
180
+ if (key in exports && exports[key] === _s[key]) return;
181
+ Object.defineProperty(exports, key, {
182
+ enumerable: true,
183
+ get: function get() {
184
+ return _s[key];
185
+ }
186
+ });
187
+ });
188
+
189
+ var _search = require("./search");
190
+
191
+ Object.keys(_search).forEach(function (key) {
192
+ if (key === "default" || key === "__esModule") return;
193
+ if (key in exports && exports[key] === _search[key]) return;
194
+ Object.defineProperty(exports, key, {
195
+ enumerable: true,
196
+ get: function get() {
197
+ return _search[key];
198
+ }
199
+ });
200
+ });
201
+
202
+ var _sms = require("./sms");
203
+
204
+ Object.keys(_sms).forEach(function (key) {
205
+ if (key === "default" || key === "__esModule") return;
206
+ if (key in exports && exports[key] === _sms[key]) return;
207
+ Object.defineProperty(exports, key, {
208
+ enumerable: true,
209
+ get: function get() {
210
+ return _sms[key];
211
+ }
212
+ });
213
+ });
214
+
215
+ var _subscription = require("./subscription");
216
+
217
+ Object.keys(_subscription).forEach(function (key) {
218
+ if (key === "default" || key === "__esModule") return;
219
+ if (key in exports && exports[key] === _subscription[key]) return;
220
+ Object.defineProperty(exports, key, {
221
+ enumerable: true,
222
+ get: function get() {
223
+ return _subscription[key];
224
+ }
225
+ });
226
+ });
227
+
228
+ var _tags = require("./tags");
229
+
230
+ Object.keys(_tags).forEach(function (key) {
231
+ if (key === "default" || key === "__esModule") return;
232
+ if (key in exports && exports[key] === _tags[key]) return;
233
+ Object.defineProperty(exports, key, {
234
+ enumerable: true,
235
+ get: function get() {
236
+ return _tags[key];
237
+ }
238
+ });
239
+ });
240
+
241
+ var _users = require("./users");
242
+
243
+ Object.keys(_users).forEach(function (key) {
244
+ if (key === "default" || key === "__esModule") return;
245
+ if (key in exports && exports[key] === _users[key]) return;
246
+ Object.defineProperty(exports, key, {
247
+ enumerable: true,
248
+ get: function get() {
249
+ return _users[key];
250
+ }
251
+ });
252
+ });
253
+
254
+ var _websockets = require("./websockets");
255
+
256
+ Object.keys(_websockets).forEach(function (key) {
257
+ if (key === "default" || key === "__esModule") return;
258
+ if (key in exports && exports[key] === _websockets[key]) return;
259
+ Object.defineProperty(exports, key, {
260
+ enumerable: true,
261
+ get: function get() {
262
+ return _websockets[key];
263
+ }
264
+ });
265
+ });
266
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29udmVyc2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2R5bmFtb2RiJztcbmV4cG9ydCAqIGZyb20gJy4vZW1haWwnO1xuZXhwb3J0ICogZnJvbSAnLi9maWxlcyc7XG5leHBvcnQgKiBmcm9tICcuL2dyb3Vwcyc7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlcyc7XG5leHBvcnQgKiBmcm9tICcuL2lvcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3BheW1lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vcG9zdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zMyc7XG5leHBvcnQgKiBmcm9tICcuL3NlYXJjaCc7XG5leHBvcnQgKiBmcm9tICcuL3Ntcyc7XG5leHBvcnQgKiBmcm9tICcuL3N1YnNjcmlwdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3RhZ3MnO1xuZXhwb3J0ICogZnJvbSAnLi91c2Vycyc7XG5leHBvcnQgKiBmcm9tICcuL3dlYnNvY2tldHMnO1xuIl19
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol");
4
+
5
+ require("core-js/modules/es.array.filter");
6
+
7
+ require("core-js/modules/es.array.for-each");
8
+
9
+ require("core-js/modules/es.array.slice");
10
+
11
+ require("core-js/modules/es.date.now");
12
+
13
+ require("core-js/modules/es.date.to-string");
14
+
15
+ require("core-js/modules/es.object.define-properties");
16
+
17
+ require("core-js/modules/es.object.define-property");
18
+
19
+ require("core-js/modules/es.object.freeze");
20
+
21
+ require("core-js/modules/es.object.get-own-property-descriptor");
22
+
23
+ require("core-js/modules/es.object.get-own-property-descriptors");
24
+
25
+ require("core-js/modules/es.object.keys");
26
+
27
+ require("core-js/modules/web.dom-collections.for-each");
28
+
29
+ Object.defineProperty(exports, "__esModule", {
30
+ value: true
31
+ });
32
+ exports.getIosInApp = exports.addIosInApp = exports.getIosSubscription = exports.iosSubscriptionUpdate = exports.getIosInAppError = void 0;
33
+
34
+ var _utils = require("@nlabs/utils");
35
+
36
+ var _arangojs = require("arangojs");
37
+
38
+ var _utils2 = require("../utils");
39
+
40
+ function _templateObject4() {
41
+ var data = _taggedTemplateLiteral(["FOR s IN subscription\n FILTER s.userId == ", " && s.type == \"ios\"\n LIMIT 1\n RETURN s"]);
42
+
43
+ _templateObject4 = function _templateObject4() {
44
+ return data;
45
+ };
46
+
47
+ return data;
48
+ }
49
+
50
+ function _templateObject3() {
51
+ var data = _taggedTemplateLiteral(["INSERT ", " IN subscriptions RETURN NEW"]);
52
+
53
+ _templateObject3 = function _templateObject3() {
54
+ return data;
55
+ };
56
+
57
+ return data;
58
+ }
59
+
60
+ function _templateObject2() {
61
+ var data = _taggedTemplateLiteral(["FOR s IN subscriptions\n FILTER s.userId == ", " && s.type == \"ios_payment\"\n LIMIT 1\n RETURN s"]);
62
+
63
+ _templateObject2 = function _templateObject2() {
64
+ return data;
65
+ };
66
+
67
+ return data;
68
+ }
69
+
70
+ function _templateObject() {
71
+ var data = _taggedTemplateLiteral(["UPSERT {transactionId: ", "}\n INSERT ", "\n UPDATE ", " IN subscriptions\n LIMIT 1"]);
72
+
73
+ _templateObject = function _templateObject() {
74
+ return data;
75
+ };
76
+
77
+ return data;
78
+ }
79
+
80
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
81
+
82
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
83
+
84
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
85
+
86
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
87
+
88
+ var eventCategory = 'ios';
89
+
90
+ var getIosInAppError = function getIosInAppError(statusCode) {
91
+ var _codes;
92
+
93
+ var codes = (_codes = {}, _defineProperty(_codes, 0, {
94
+ error: false,
95
+ message: 'Active',
96
+ valid: true
97
+ }), _defineProperty(_codes, 21000, {
98
+ error: true,
99
+ id: 'payment_receipt_unreadable',
100
+ message: 'App store could not read',
101
+ valid: false
102
+ }), _defineProperty(_codes, 21002, {
103
+ error: true,
104
+ id: 'payment_data_malformed',
105
+ message: 'Data was malformed',
106
+ valid: false
107
+ }), _defineProperty(_codes, 21003, {
108
+ error: true,
109
+ id: 'payment_receipt_unauthorized',
110
+ message: 'Receipt not authenticated',
111
+ valid: false
112
+ }), _defineProperty(_codes, 21004, {
113
+ error: true,
114
+ id: 'payment_invalid_secret',
115
+ message: 'Shared secret does not match',
116
+ valid: false
117
+ }), _defineProperty(_codes, 21005, {
118
+ error: true,
119
+ id: 'payment_server_unavailable',
120
+ message: 'Receipt server unavailable',
121
+ valid: false
122
+ }), _defineProperty(_codes, 21006, {
123
+ error: false,
124
+ id: 'payment_subscription_expired',
125
+ message: 'Receipt valid but sub expired',
126
+ valid: true
127
+ }), _defineProperty(_codes, 21007, {
128
+ error: true,
129
+ id: 'payment_invalid_server',
130
+ message: 'Sandbox receipt sent to Production environment',
131
+ redirect: true,
132
+ valid: false
133
+ }), _defineProperty(_codes, 21008, {
134
+ error: true,
135
+ id: 'payment_invalid_server',
136
+ message: 'Production receipt sent to Sandbox environment',
137
+ valid: false
138
+ }), _codes);
139
+ return codes[statusCode] || {};
140
+ };
141
+
142
+ exports.getIosInAppError = getIosInAppError;
143
+
144
+ var iosSubscriptionUpdate = function iosSubscriptionUpdate(database, subscriptionUpdate) {
145
+ var action = 'iosSubscriptionUpdate';
146
+ var planId = subscriptionUpdate.auto_renew_adam_id,
147
+ cancelDate = subscriptionUpdate.cancellation_date,
148
+ status = subscriptionUpdate.notification_type,
149
+ latestReceipt = subscriptionUpdate.latest_receipt,
150
+ latestInfo = subscriptionUpdate.latest_receipt_info,
151
+ expiredReceipt = subscriptionUpdate.latest_expired_receipt,
152
+ expiredInfo = subscriptionUpdate.latest_expired_receipt_info,
153
+ transactionId = subscriptionUpdate.original_transaction_id;
154
+ var formatStatus = (status || '').toLowerCase();
155
+ var now = Date.now();
156
+ var receiptInfo = latestInfo || expiredInfo;
157
+ var id = (0, _utils.createHash)("payment-".concat(transactionId));
158
+ var update = {
159
+ cancelDate: cancelDate,
160
+ isValid: receiptInfo[0].expires_date_ms > now,
161
+ modified: now,
162
+ planId: planId,
163
+ receipt: latestReceipt || expiredReceipt,
164
+ status: formatStatus
165
+ };
166
+
167
+ var insert = _objectSpread(_objectSpread({}, update), {}, {
168
+ _key: id,
169
+ added: now,
170
+ type: 'ios_payment'
171
+ });
172
+
173
+ var aqlQry = (0, _arangojs.aql)(_templateObject(), transactionId, insert, update);
174
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function () {
175
+ return null;
176
+ })["catch"](function (dbError) {
177
+ return (0, _utils2.logError)({
178
+ action: action,
179
+ category: eventCategory,
180
+ label: 'db_error'
181
+ }, dbError, {}).then(function () {
182
+ return null;
183
+ });
184
+ });
185
+ }; // export const addIosInApp = (
186
+ // context: ApiContext,
187
+ // app,
188
+ // subscription: PaymentSubscription
189
+ // ): Promise<PaymentSubscription> => {
190
+ // const action: string = 'addIosInApp';
191
+ // const {isProduction, receipt} = subscription;
192
+ // const {database, userId: sessionId} = context;
193
+ // const productionHost: string = 'buy.itunes.apple.com';
194
+ // const sandboxHost: string = 'sandbox.itunes.apple.com';
195
+ // const endpoint: string = isProduction ? productionHost : sandboxHost;
196
+ // const verifyUrl: string = `https://${endpoint}/verifyReceipt`;
197
+ // const payload: object = {
198
+ // password: app.iap,
199
+ // 'receipt-data': decodeURIComponent(receipt)
200
+ // };
201
+ // const options: object = {
202
+ // headers: {
203
+ // 'Content-Type': 'application/x-www-form-urlencoded'
204
+ // }
205
+ // };
206
+ // return post(verifyUrl, payload, options)
207
+ // .then((results) => {
208
+ // const json = JSON.parse(results);
209
+ // const {
210
+ // latest_receipt: latestReceipt,
211
+ // latest_receipt_info: latestInfo,
212
+ // status
213
+ // } = json;
214
+ // const {
215
+ // is_trial_period: trialPeriod,
216
+ // original_purchase_date_ms: added,
217
+ // expires_date: expires,
218
+ // product_id: planId,
219
+ // transaction_id: transactionId
220
+ // } = latestInfo;
221
+ // if(status === 0 || status === 21006) {
222
+ // const id: string = createHash(`payment-${transactionId}`);
223
+ // const now: number = Date.now();
224
+ // const update: PaymentSubscription = {
225
+ // expires,
226
+ // isTrial: trialPeriod === 'true',
227
+ // isValid: expires > now,
228
+ // modified: now,
229
+ // planId,
230
+ // receipt: latestReceipt,
231
+ // transactionId,
232
+ // userId: sessionId
233
+ // };
234
+ // const insert: PaymentSubscription = {
235
+ // ...update,
236
+ // _key: id,
237
+ // added,
238
+ // type: 'ios_payment'
239
+ // };
240
+ // const aqlQry: AqlQuery = aql`UPSERT {transactionId: ${transactionId}}
241
+ // INSERT ${insert}
242
+ // UPDATE ${update} IN subscriptions
243
+ // RETURN NEW`;
244
+ // return useDb(database).query(aqlQry)
245
+ // .then((cursor: ArrayCursor) => cursor.next())
246
+ // .then((updatedSubscription: PaymentSubscription = {}) => updatedSubscription)
247
+ // .catch((dbError: Error) => logError({
248
+ // action,
249
+ // category: eventCategory,
250
+ // label: 'db_error'
251
+ // }, dbError, context).then(() => null));
252
+ // }
253
+ // // Errors
254
+ // const error: PaymentIOSInAppError = getIosInAppError(results.status);
255
+ // return logException({
256
+ // action,
257
+ // category: eventCategory,
258
+ // label: 'payment_error',
259
+ // message: error.message,
260
+ // value: error.id
261
+ // }, context).then(() => null);
262
+ // });
263
+ // };
264
+
265
+
266
+ exports.iosSubscriptionUpdate = iosSubscriptionUpdate;
267
+
268
+ var getIosSubscription = function getIosSubscription(context) {
269
+ var action = 'getIosSubscription';
270
+ var database = context.database,
271
+ sessionId = context.userId;
272
+ var aqlQry = (0, _arangojs.aql)(_templateObject2(), sessionId);
273
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
274
+ return cursor.next();
275
+ }).then(function () {
276
+ var subscription = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
277
+ return subscription;
278
+ })["catch"](function (error) {
279
+ return (0, _utils2.logError)({
280
+ action: action,
281
+ category: eventCategory,
282
+ label: 'db_error'
283
+ }, error, context).then(function () {
284
+ return null;
285
+ });
286
+ });
287
+ };
288
+
289
+ exports.getIosSubscription = getIosSubscription;
290
+
291
+ var addIosInApp = function addIosInApp(context, subscription) {
292
+ var action = 'addIosInApp';
293
+ var database = context.database,
294
+ sessionId = context.userId;
295
+ var now = Date.now();
296
+ var _subscription$added = subscription.added,
297
+ added = _subscription$added === void 0 ? now : _subscription$added,
298
+ planId = subscription.planId,
299
+ receipt = subscription.receipt,
300
+ transactionId = subscription.transactionId,
301
+ trialEnd = subscription.trialEnd;
302
+ var subscriptionId = (0, _utils.createHash)("subscription-".concat(transactionId));
303
+ var insert = {
304
+ _key: subscriptionId,
305
+ added: added,
306
+ modified: now,
307
+ planId: planId,
308
+ receipt: receipt,
309
+ transactionId: transactionId,
310
+ trialEnd: trialEnd,
311
+ type: 'ios_subscription',
312
+ userId: sessionId
313
+ };
314
+ var aqlQry = (0, _arangojs.aql)(_templateObject3(), insert);
315
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
316
+ return cursor.next();
317
+ }).then(function () {
318
+ var updatedSubscription = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
319
+ return updatedSubscription;
320
+ })["catch"](function (error) {
321
+ return (0, _utils2.logError)({
322
+ action: action,
323
+ category: eventCategory,
324
+ label: 'db_error'
325
+ }, error, context).then(function () {
326
+ return null;
327
+ });
328
+ });
329
+ };
330
+
331
+ exports.addIosInApp = addIosInApp;
332
+
333
+ var getIosInApp = function getIosInApp(context) {
334
+ var action = 'getIosInApp';
335
+ var database = context.database,
336
+ sessionId = context.userId;
337
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), sessionId);
338
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
339
+ return cursor.next();
340
+ }).then(function () {
341
+ var subscription = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
342
+ return subscription;
343
+ })["catch"](function (error) {
344
+ return (0, _utils2.logError)({
345
+ action: action,
346
+ category: eventCategory,
347
+ label: 'db_error'
348
+ }, error, context).then(function () {
349
+ return null;
350
+ });
351
+ });
352
+ };
353
+
354
+ exports.getIosInApp = getIosInApp;
355
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2lvcy50cyJdLCJuYW1lcyI6WyJldmVudENhdGVnb3J5IiwiZ2V0SW9zSW5BcHBFcnJvciIsInN0YXR1c0NvZGUiLCJjb2RlcyIsImVycm9yIiwibWVzc2FnZSIsInZhbGlkIiwiaWQiLCJyZWRpcmVjdCIsImlvc1N1YnNjcmlwdGlvblVwZGF0ZSIsImRhdGFiYXNlIiwic3Vic2NyaXB0aW9uVXBkYXRlIiwiYWN0aW9uIiwicGxhbklkIiwiYXV0b19yZW5ld19hZGFtX2lkIiwiY2FuY2VsRGF0ZSIsImNhbmNlbGxhdGlvbl9kYXRlIiwic3RhdHVzIiwibm90aWZpY2F0aW9uX3R5cGUiLCJsYXRlc3RSZWNlaXB0IiwibGF0ZXN0X3JlY2VpcHQiLCJsYXRlc3RJbmZvIiwibGF0ZXN0X3JlY2VpcHRfaW5mbyIsImV4cGlyZWRSZWNlaXB0IiwibGF0ZXN0X2V4cGlyZWRfcmVjZWlwdCIsImV4cGlyZWRJbmZvIiwibGF0ZXN0X2V4cGlyZWRfcmVjZWlwdF9pbmZvIiwidHJhbnNhY3Rpb25JZCIsIm9yaWdpbmFsX3RyYW5zYWN0aW9uX2lkIiwiZm9ybWF0U3RhdHVzIiwidG9Mb3dlckNhc2UiLCJub3ciLCJEYXRlIiwicmVjZWlwdEluZm8iLCJ1cGRhdGUiLCJpc1ZhbGlkIiwiZXhwaXJlc19kYXRlX21zIiwibW9kaWZpZWQiLCJyZWNlaXB0IiwiaW5zZXJ0IiwiX2tleSIsImFkZGVkIiwidHlwZSIsImFxbFFyeSIsImFxbCIsInF1ZXJ5IiwidGhlbiIsImRiRXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiZ2V0SW9zU3Vic2NyaXB0aW9uIiwiY29udGV4dCIsInNlc3Npb25JZCIsInVzZXJJZCIsImN1cnNvciIsIm5leHQiLCJzdWJzY3JpcHRpb24iLCJhZGRJb3NJbkFwcCIsInRyaWFsRW5kIiwic3Vic2NyaXB0aW9uSWQiLCJ1cGRhdGVkU3Vic2NyaXB0aW9uIiwiZ2V0SW9zSW5BcHAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7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K0Q7QUFHaEYsTUFBTVYsTUFBZ0IsT0FBR0MsYUFBSCxzQkFDR1EsU0FESCxDQUF0QjtBQUtBLFNBQU8sbUJBQU0xQyxRQUFOLEVBQWdCbUMsS0FBaEIsQ0FBc0JGLE1BQXRCLEVBQ0pHLElBREksQ0FDQyxVQUFDUSxNQUFEO0FBQUEsV0FBeUJBLE1BQU0sQ0FBQ0MsSUFBUCxFQUF6QjtBQUFBLEdBREQsRUFFSlQsSUFGSSxDQUVDO0FBQUEsUUFBQ1UsWUFBRCx1RUFBcUMsRUFBckM7QUFBQSxXQUE0Q0EsWUFBNUM7QUFBQSxHQUZELFdBR0UsVUFBQ3BELEtBQUQ7QUFBQSxXQUFrQixzQkFBUztBQUNoQ1EsTUFBQUEsTUFBTSxFQUFOQSxNQURnQztBQUVoQ29DLE1BQUFBLFFBQVEsRUFBRWhELGFBRnNCO0FBR2hDaUQsTUFBQUEsS0FBSyxFQUFFO0FBSHlCLEtBQVQsRUFJdEI3QyxLQUpzQixFQUlmK0MsT0FKZSxFQUlOTCxJQUpNLENBSUQ7QUFBQSxhQUFNLElBQU47QUFBQSxLQUpDLENBQWxCO0FBQUEsR0FIRixDQUFQO0FBUUQsQ0FoQk0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NyZWF0ZUhhc2h9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5cbmltcG9ydCB7XG4gIEFwaUNvbnRleHQsXG4gIFBheW1lbnRJT1NJbkFwcEVycm9yLFxuICBQYXltZW50SU9TU3Vic2NyaXB0aW9uSW5mbyxcbiAgUGF5bWVudElPU1N1YnNjcmlwdGlvblVwZGF0ZSxcbiAgUGF5bWVudFN1YnNjcmlwdGlvblxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAnaW9zJztcblxuZXhwb3J0IGNvbnN0IGdldElvc0luQXBwRXJyb3IgPSAoc3RhdHVzQ29kZTogc3RyaW5nKTogUGF5bWVudElPU0luQXBwRXJyb3IgPT4ge1xuICBjb25zdCBjb2RlcyA9IHtcbiAgICBbMF06IHtlcnJvcjogZmFsc2UsIG1lc3NhZ2U6ICdBY3RpdmUnLCB2YWxpZDogdHJ1ZX0sXG4gICAgWzIxMDAwXToge2Vycm9yOiB0cnVlLCBpZDogJ3BheW1lbnRfcmVjZWlwdF91bnJlYWRhYmxlJywgbWVzc2FnZTogJ0FwcCBzdG9yZSBjb3VsZCBub3QgcmVhZCcsIHZhbGlkOiBmYWxzZX0sXG4gICAgWzIxMDAyXToge2Vycm9yOiB0cnVlLCBpZDogJ3BheW1lbnRfZGF0YV9tYWxmb3JtZWQnLCBtZXNzYWdlOiAnRGF0YSB3YXMgbWFsZm9ybWVkJywgdmFsaWQ6IGZhbHNlfSxcbiAgICBbMjEwMDNdOiB7ZXJyb3I6IHRydWUsIGlkOiAncGF5bWVudF9yZWNlaXB0X3VuYXV0aG9yaXplZCcsIG1lc3NhZ2U6ICdSZWNlaXB0IG5vdCBhdXRoZW50aWNhdGVkJywgdmFsaWQ6IGZhbHNlfSxcbiAgICBbMjEwMDRdOiB7ZXJyb3I6IHRydWUsIGlkOiAncGF5bWVudF9pbnZhbGlkX3NlY3JldCcsIG1lc3NhZ2U6ICdTaGFyZWQgc2VjcmV0IGRvZXMgbm90IG1hdGNoJywgdmFsaWQ6IGZhbHNlfSxcbiAgICBbMjEwMDVdOiB7ZXJyb3I6IHRydWUsIGlkOiAncGF5bWVudF9zZXJ2ZXJfdW5hdmFpbGFibGUnLCBtZXNzYWdlOiAnUmVjZWlwdCBzZXJ2ZXIgdW5hdmFpbGFibGUnLCB2YWxpZDogZmFsc2V9LFxuICAgIFsyMTAwNl06IHtcbiAgICAgIGVycm9yOiBmYWxzZSxcbiAgICAgIGlkOiAncGF5bWVudF9zdWJzY3JpcHRpb25fZXhwaXJlZCcsXG4gICAgICBtZXNzYWdlOiAnUmVjZWlwdCB2YWxpZCBidXQgc3ViIGV4cGlyZWQnLFxuICAgICAgdmFsaWQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNwZWNpYWwgY2FzZSBmb3IgYXBwIHJldmlldyBoYW5kbGluZyAtIGZvcndhcmQgYW55IHJlcXVlc3QgdGhhdCBpcyBpbnRlbmRlZCBmb3IgdGhlIFNhbmRib3ggYnV0IHdhcyBzZW50IHRvXG4gICAgICogUHJvZHVjdGlvbiwgdGhpcyBpcyB3aGF0IHRoZSBhcHAgcmV2aWV3IHRlYW0gZG9lc1xuICAgICAqL1xuICAgIFsyMTAwN106IHtcbiAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgaWQ6ICdwYXltZW50X2ludmFsaWRfc2VydmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTYW5kYm94IHJlY2VpcHQgc2VudCB0byBQcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgIHJlZGlyZWN0OiB0cnVlLFxuICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgfSxcbiAgICBbMjEwMDhdOiB7XG4gICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgIGlkOiAncGF5bWVudF9pbnZhbGlkX3NlcnZlcicsXG4gICAgICBtZXNzYWdlOiAnUHJvZHVjdGlvbiByZWNlaXB0IHNlbnQgdG8gU2FuZGJveCBlbnZpcm9ubWVudCcsXG4gICAgICB2YWxpZDogZmFsc2VcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvZGVzW3N0YXR1c0NvZGVdIHx8IHt9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlvc1N1YnNjcmlwdGlvblVwZGF0ZSA9IChcbiAgZGF0YWJhc2U6IHN0cmluZyxcbiAgc3Vic2NyaXB0aW9uVXBkYXRlOiBQYXltZW50SU9TU3Vic2NyaXB0aW9uVXBkYXRlXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnaW9zU3Vic2NyaXB0aW9uVXBkYXRlJztcbiAgY29uc3Qge1xuICAgIGF1dG9fcmVuZXdfYWRhbV9pZDogcGxhbklkLFxuICAgIGNhbmNlbGxhdGlvbl9kYXRlOiBjYW5jZWxEYXRlLFxuICAgIG5vdGlmaWNhdGlvbl90eXBlOiBzdGF0dXMsXG4gICAgbGF0ZXN0X3JlY2VpcHQ6IGxhdGVzdFJlY2VpcHQsXG4gICAgbGF0ZXN0X3JlY2VpcHRfaW5mbzogbGF0ZXN0SW5mbyxcbiAgICBsYXRlc3RfZXhwaXJlZF9yZWNlaXB0OiBleHBpcmVkUmVjZWlwdCxcbiAgICBsYXRlc3RfZXhwaXJlZF9yZWNlaXB0X2luZm86IGV4cGlyZWRJbmZvLFxuICAgIG9yaWdpbmFsX3RyYW5zYWN0aW9uX2lkOiB0cmFuc2FjdGlvbklkXG4gIH0gPSBzdWJzY3JpcHRpb25VcGRhdGU7XG4gIGNvbnN0IGZvcm1hdFN0YXR1czogc3RyaW5nID0gKHN0YXR1cyB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCByZWNlaXB0SW5mbzogUGF5bWVudElPU1N1YnNjcmlwdGlvbkluZm9bXSA9IGxhdGVzdEluZm8gfHwgZXhwaXJlZEluZm87XG4gIGNvbnN0IGlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBwYXltZW50LSR7dHJhbnNhY3Rpb25JZH1gKTtcblxuICBjb25zdCB1cGRhdGU6IFBheW1lbnRTdWJzY3JpcHRpb24gPSB7XG4gICAgY2FuY2VsRGF0ZSxcbiAgICBpc1ZhbGlkOiByZWNlaXB0SW5mb1swXS5leHBpcmVzX2RhdGVfbXMgPiBub3csXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBwbGFuSWQsXG4gICAgcmVjZWlwdDogbGF0ZXN0UmVjZWlwdCB8fCBleHBpcmVkUmVjZWlwdCxcbiAgICBzdGF0dXM6IGZvcm1hdFN0YXR1c1xuICB9O1xuICBjb25zdCBpbnNlcnQ6IFBheW1lbnRTdWJzY3JpcHRpb24gPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IGlkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdHlwZTogJ2lvc19wYXltZW50J1xuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7dHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfX1cbiAgICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgICBVUERBVEUgJHt1cGRhdGV9IElOIHN1YnNjcmlwdGlvbnNcbiAgICAgTElNSVQgMWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKCkgPT4gbnVsbClcbiAgICAuY2F0Y2goKGRiRXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZGJFcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGFkZElvc0luQXBwID0gKFxuLy8gICBjb250ZXh0OiBBcGlDb250ZXh0LFxuLy8gICBhcHAsXG4vLyAgIHN1YnNjcmlwdGlvbjogUGF5bWVudFN1YnNjcmlwdGlvblxuLy8gKTogUHJvbWlzZTxQYXltZW50U3Vic2NyaXB0aW9uPiA9PiB7XG4vLyAgIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZElvc0luQXBwJztcbi8vICAgY29uc3Qge2lzUHJvZHVjdGlvbiwgcmVjZWlwdH0gPSBzdWJzY3JpcHRpb247XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcblxuLy8gICBjb25zdCBwcm9kdWN0aW9uSG9zdDogc3RyaW5nID0gJ2J1eS5pdHVuZXMuYXBwbGUuY29tJztcbi8vICAgY29uc3Qgc2FuZGJveEhvc3Q6IHN0cmluZyA9ICdzYW5kYm94Lml0dW5lcy5hcHBsZS5jb20nO1xuLy8gICBjb25zdCBlbmRwb2ludDogc3RyaW5nID0gaXNQcm9kdWN0aW9uID8gcHJvZHVjdGlvbkhvc3QgOiBzYW5kYm94SG9zdDtcbi8vICAgY29uc3QgdmVyaWZ5VXJsOiBzdHJpbmcgPSBgaHR0cHM6Ly8ke2VuZHBvaW50fS92ZXJpZnlSZWNlaXB0YDtcbi8vICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuLy8gICAgIHBhc3N3b3JkOiBhcHAuaWFwLFxuLy8gICAgICdyZWNlaXB0LWRhdGEnOiBkZWNvZGVVUklDb21wb25lbnQocmVjZWlwdClcbi8vICAgfTtcbi8vICAgY29uc3Qgb3B0aW9uczogb2JqZWN0ID0ge1xuLy8gICAgIGhlYWRlcnM6IHtcbi8vICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuLy8gICAgIH1cbi8vICAgfTtcblxuLy8gICByZXR1cm4gcG9zdCh2ZXJpZnlVcmwsIHBheWxvYWQsIG9wdGlvbnMpXG4vLyAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbi8vICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJlc3VsdHMpO1xuLy8gICAgICAgY29uc3Qge1xuLy8gICAgICAgICBsYXRlc3RfcmVjZWlwdDogbGF0ZXN0UmVjZWlwdCxcbi8vICAgICAgICAgbGF0ZXN0X3JlY2VpcHRfaW5mbzogbGF0ZXN0SW5mbyxcbi8vICAgICAgICAgc3RhdHVzXG4vLyAgICAgICB9ID0ganNvbjtcblxuLy8gICAgICAgY29uc3Qge1xuLy8gICAgICAgICBpc190cmlhbF9wZXJpb2Q6IHRyaWFsUGVyaW9kLFxuLy8gICAgICAgICBvcmlnaW5hbF9wdXJjaGFzZV9kYXRlX21zOiBhZGRlZCxcbi8vICAgICAgICAgZXhwaXJlc19kYXRlOiBleHBpcmVzLFxuLy8gICAgICAgICBwcm9kdWN0X2lkOiBwbGFuSWQsXG4vLyAgICAgICAgIHRyYW5zYWN0aW9uX2lkOiB0cmFuc2FjdGlvbklkXG4vLyAgICAgICB9ID0gbGF0ZXN0SW5mbztcblxuLy8gICAgICAgaWYoc3RhdHVzID09PSAwIHx8IHN0YXR1cyA9PT0gMjEwMDYpIHtcbi8vICAgICAgICAgY29uc3QgaWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHBheW1lbnQtJHt0cmFuc2FjdGlvbklkfWApO1xuLy8gICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4vLyAgICAgICAgIGNvbnN0IHVwZGF0ZTogUGF5bWVudFN1YnNjcmlwdGlvbiA9IHtcbi8vICAgICAgICAgICBleHBpcmVzLFxuLy8gICAgICAgICAgIGlzVHJpYWw6IHRyaWFsUGVyaW9kID09PSAndHJ1ZScsXG4vLyAgICAgICAgICAgaXNWYWxpZDogZXhwaXJlcyA+IG5vdyxcbi8vICAgICAgICAgICBtb2RpZmllZDogbm93LFxuLy8gICAgICAgICAgIHBsYW5JZCxcbi8vICAgICAgICAgICByZWNlaXB0OiBsYXRlc3RSZWNlaXB0LFxuLy8gICAgICAgICAgIHRyYW5zYWN0aW9uSWQsXG4vLyAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbi8vICAgICAgICAgfTtcbi8vICAgICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50U3Vic2NyaXB0aW9uID0ge1xuLy8gICAgICAgICAgIC4uLnVwZGF0ZSxcbi8vICAgICAgICAgICBfa2V5OiBpZCxcbi8vICAgICAgICAgICBhZGRlZCxcbi8vICAgICAgICAgICB0eXBlOiAnaW9zX3BheW1lbnQnXG4vLyAgICAgICAgIH07XG5cbi8vICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge3RyYW5zYWN0aW9uSWQ6ICR7dHJhbnNhY3Rpb25JZH19XG4vLyAgICAgICAgICAgICAgIElOU0VSVCAke2luc2VydH1cbi8vICAgICAgICAgICAgICAgVVBEQVRFICR7dXBkYXRlfSBJTiBzdWJzY3JpcHRpb25zXG4vLyAgICAgICAgICAgICAgIFJFVFVSTiBORVdgO1xuXG4vLyAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuLy8gICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuLy8gICAgICAgICAgIC50aGVuKCh1cGRhdGVkU3Vic2NyaXB0aW9uOiBQYXltZW50U3Vic2NyaXB0aW9uID0ge30pID0+IHVwZGF0ZWRTdWJzY3JpcHRpb24pXG4vLyAgICAgICAgICAgLmNhdGNoKChkYkVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuLy8gICAgICAgICAgICAgYWN0aW9uLFxuLy8gICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4vLyAgICAgICAgICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuLy8gICAgICAgICAgIH0sIGRiRXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICAvLyBFcnJvcnNcbi8vICAgICAgIGNvbnN0IGVycm9yOiBQYXltZW50SU9TSW5BcHBFcnJvciA9IGdldElvc0luQXBwRXJyb3IocmVzdWx0cy5zdGF0dXMpO1xuXG4vLyAgICAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbi8vICAgICAgICAgYWN0aW9uLFxuLy8gICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbi8vICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJyxcbi8vICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbi8vICAgICAgICAgdmFsdWU6IGVycm9yLmlkXG4vLyAgICAgICB9LCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldElvc1N1YnNjcmlwdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxQYXltZW50U3Vic2NyaXB0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldElvc1N1YnNjcmlwdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcyBJTiBzdWJzY3JpcHRpb25zXG4gICAgICBGSUxURVIgcy51c2VySWQgPT0gJHtzZXNzaW9uSWR9ICYmIHMudHlwZSA9PSBcImlvc19wYXltZW50XCJcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiBzYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoc3Vic2NyaXB0aW9uOiBQYXltZW50U3Vic2NyaXB0aW9uID0ge30pID0+IHN1YnNjcmlwdGlvbilcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRJb3NJbkFwcCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBzdWJzY3JpcHRpb246IFBheW1lbnRTdWJzY3JpcHRpb24pOiBQcm9taXNlPFBheW1lbnRTdWJzY3JpcHRpb24+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkSW9zSW5BcHAnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge2FkZGVkID0gbm93LCBwbGFuSWQsIHJlY2VpcHQsIHRyYW5zYWN0aW9uSWQsIHRyaWFsRW5kfSA9IHN1YnNjcmlwdGlvbjtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHN1YnNjcmlwdGlvbi0ke3RyYW5zYWN0aW9uSWR9YCk7XG4gIGNvbnN0IGluc2VydDogUGF5bWVudFN1YnNjcmlwdGlvbiA9IHtcbiAgICBfa2V5OiBzdWJzY3JpcHRpb25JZCxcbiAgICBhZGRlZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIHBsYW5JZCxcbiAgICByZWNlaXB0LFxuICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgdHJpYWxFbmQsXG4gICAgdHlwZTogJ2lvc19zdWJzY3JpcHRpb24nLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBzdWJzY3JpcHRpb25zIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkU3Vic2NyaXB0aW9uOiBQYXltZW50U3Vic2NyaXB0aW9uID0ge30pID0+IHVwZGF0ZWRTdWJzY3JpcHRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW9zSW5BcHAgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8UGF5bWVudFN1YnNjcmlwdGlvbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJb3NJbkFwcCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcyBJTiBzdWJzY3JpcHRpb25cbiAgICAgIEZJTFRFUiBzLnVzZXJJZCA9PSAke3Nlc3Npb25JZH0gJiYgcy50eXBlID09IFwiaW9zXCJcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiBzYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoc3Vic2NyaXB0aW9uOiBQYXltZW50U3Vic2NyaXB0aW9uID0ge30pID0+IHN1YnNjcmlwdGlvbilcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG4iXX0=