@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
package/lib/config.js ADDED
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.array.concat");
4
+
5
+ require("core-js/modules/es.array.iterator");
6
+
7
+ require("core-js/modules/es.object.define-property");
8
+
9
+ require("core-js/modules/es.object.to-string");
10
+
11
+ require("core-js/modules/web.dom-collections.iterator");
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+ exports.Config = void 0;
17
+
18
+ var _get2 = _interopRequireDefault(require("lodash/get"));
19
+
20
+ var _merge = _interopRequireDefault(require("lodash/merge"));
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
23
+
24
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
25
+
26
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
27
+
28
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
29
+
30
+ 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; }
31
+
32
+ var appPackage = require('../package.json');
33
+
34
+ var _process$env = process.env,
35
+ _process$env$arangodb = _process$env.arangodbDatabase,
36
+ arangodbDatabase = _process$env$arangodb === void 0 ? 'reaktor' : _process$env$arangodb,
37
+ arangodbPassword = _process$env.arangodbPassword,
38
+ _process$env$arangodb2 = _process$env.arangodbPort,
39
+ arangodbPort = _process$env$arangodb2 === void 0 ? '8529' : _process$env$arangodb2,
40
+ _process$env$arangodb3 = _process$env.arangodbUrl,
41
+ arangodbUrl = _process$env$arangodb3 === void 0 ? 'db.reaktor.io' : _process$env$arangodb3,
42
+ _process$env$arangodb4 = _process$env.arangodbUsername,
43
+ arangodbUsername = _process$env$arangodb4 === void 0 ? 'reaktor' : _process$env$arangodb4;
44
+
45
+ var Config = /*#__PURE__*/function () {
46
+ function Config() {
47
+ _classCallCheck(this, Config);
48
+ }
49
+
50
+ _createClass(Config, null, [{
51
+ key: "get",
52
+ value: function get(path) {
53
+ var environment = process.env.stage || 'dev';
54
+ var configValues = (0, _merge["default"])(this.values["default"], this.values[environment], {
55
+ environment: environment
56
+ });
57
+ return (0, _get2["default"])(configValues, path);
58
+ }
59
+ }]);
60
+
61
+ return Config;
62
+ }();
63
+
64
+ exports.Config = Config;
65
+
66
+ _defineProperty(Config, "values", {
67
+ "default": {
68
+ app: {
69
+ name: 'reaktor',
70
+ url: 'reaktor.io',
71
+ version: appPackage.version
72
+ },
73
+ arangodb: {
74
+ database: arangodbDatabase,
75
+ dump: '/Applications/ArangoDB-CLI.app/Contents/MacOS/arangodump',
76
+ password: arangodbPassword,
77
+ port: arangodbPort,
78
+ restore: '/Applications/ArangoDB-CLI.app/Contents/MacOS/arangorestore',
79
+ url: "".concat(arangodbUrl, ":").concat(arangodbPort),
80
+ username: arangodbUsername
81
+ },
82
+ aws: {
83
+ Bucket: 'dev.reaktor.io',
84
+ accessKeyId: 'AKIAJIYDT3EA2ZFMTJNA',
85
+ maxRetries: 3,
86
+ region: 'us-east-1',
87
+ secretAccessKey: 'bUssQRtJTZC7geF9RDH5KCn8CalVnf2VT34yqS+9',
88
+ signatureVersion: 'v4'
89
+ },
90
+ giphy: {
91
+ key: 'dc6zaTOxFJmzC'
92
+ },
93
+ google: {
94
+ analytics: {
95
+ accountId: '78158717',
96
+ trackingId: 'UA-78158717-1'
97
+ },
98
+ geocode: {
99
+ key: 'AIzaSyBwjmpBjWhiJoBCZiYzRurM9m4WnCxslv0',
100
+ url: 'https://maps.googleapis.com/maps/api/geocode/json'
101
+ },
102
+ key: 'AIzaSyC3_f2Us3y0qjbyMJ-4t5ObtCzfq_FHIgQ'
103
+ },
104
+ image: {
105
+ imgQuality: 90,
106
+ imgSize: 1500,
107
+ thmQuality: 80,
108
+ thmSize: 150
109
+ },
110
+ redis: {
111
+ host: '127.0.0.1',
112
+ port: 6379
113
+ },
114
+ stripe: {
115
+ token: 'sk_test_LS956be57YUXTB5a4sLGb5BQ'
116
+ },
117
+ twilio: {
118
+ number: '+15005550006',
119
+ sid: 'AC6bd7f513cbed2e5134c650be06cc732e',
120
+ token: '520ae739e761bab759b147f1ad28278f'
121
+ }
122
+ },
123
+ dev: {
124
+ aws: {
125
+ Bucket: 'dev.reaktor.io'
126
+ },
127
+ redis: {
128
+ host: 'nl-redis.ehcvnt.ng.0001.use1.cache.amazonaws.com'
129
+ }
130
+ },
131
+ prod: {
132
+ arangodb: {
133
+ dump: '/usr/bin/arangodump',
134
+ restore: '/usr/bin/arangorestore'
135
+ },
136
+ aws: {
137
+ Bucket: 'box.reaktor.io'
138
+ },
139
+ redis: {
140
+ host: 'nl-redis.ehcvnt.ng.0001.use1.cache.amazonaws.com'
141
+ },
142
+ stripe: {
143
+ token: 'sk_live_bElZl8RLhMCJy33KG4lyLD4o'
144
+ },
145
+ twilio: {
146
+ number: '+18554165227',
147
+ sid: 'AC90b0528a911e652d643329a4d7b4d2c7',
148
+ token: 'a7941d173bd4846d0966a186e9865b72'
149
+ }
150
+ },
151
+ test: {}
152
+ });
153
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWcudHMiXSwibmFtZXMiOlsiYXBwUGFja2FnZSIsInJlcXVpcmUiLCJwcm9jZXNzIiwiZW52IiwiYXJhbmdvZGJEYXRhYmFzZSIsImFyYW5nb2RiUGFzc3dvcmQiLCJhcmFuZ29kYlBvcnQiLCJhcmFuZ29kYlVybCIsImFyYW5nb2RiVXNlcm5hbWUiLCJDb25maWciLCJwYXRoIiwiZW52aXJvbm1lbnQiLCJzdGFnZSIsImNvbmZpZ1ZhbHVlcyIsInZhbHVlcyIsImFwcCIsIm5hbWUiLCJ1cmwiLCJ2ZXJzaW9uIiwiYXJhbmdvZGIiLCJkYXRhYmFzZSIsImR1bXAiLCJwYXNzd29yZCIsInBvcnQiLCJyZXN0b3JlIiwidXNlcm5hbWUiLCJhd3MiLCJCdWNrZXQiLCJhY2Nlc3NLZXlJZCIsIm1heFJldHJpZXMiLCJyZWdpb24iLCJzZWNyZXRBY2Nlc3NLZXkiLCJzaWduYXR1cmVWZXJzaW9uIiwiZ2lwaHkiLCJrZXkiLCJnb29nbGUiLCJhbmFseXRpY3MiLCJhY2NvdW50SWQiLCJ0cmFja2luZ0lkIiwiZ2VvY29kZSIsImltYWdlIiwiaW1nUXVhbGl0eSIsImltZ1NpemUiLCJ0aG1RdWFsaXR5IiwidGhtU2l6ZSIsInJlZGlzIiwiaG9zdCIsInN0cmlwZSIsInRva2VuIiwidHdpbGlvIiwibnVtYmVyIiwic2lkIiwiZGV2IiwicHJvZCIsInRlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUE7O0FBQ0E7Ozs7Ozs7Ozs7OztBQXFCQSxJQUFNQSxVQUFlLEdBQUdDLE9BQU8sQ0FBQyxpQkFBRCxDQUEvQjs7bUJBUUlDLE9BQU8sQ0FBQ0MsRzt5Q0FMVkMsZ0I7SUFBQUEsZ0Isc0NBQW1CLFM7SUFDbkJDLGdCLGdCQUFBQSxnQjswQ0FDQUMsWTtJQUFBQSxZLHVDQUFlLE07MENBQ2ZDLFc7SUFBQUEsVyx1Q0FBYyxlOzBDQUNkQyxnQjtJQUFBQSxnQix1Q0FBbUIsUzs7SUFHUkMsTTs7Ozs7Ozt3QkEwRkFDLEksRUFBOEI7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QURMLEtBTEQ7QUFRSmtCLElBQUFBLEtBQUssRUFBRTtBQUNMQyxNQUFBQSxJQUFJLEVBQUU7QUFERCxLQVJIO0FBV0pDLElBQUFBLE1BQU0sRUFBRTtBQUNOQyxNQUFBQSxLQUFLLEVBQUU7QUFERCxLQVhKO0FBY0pDLElBQUFBLE1BQU0sRUFBRTtBQUNOQyxNQUFBQSxNQUFNLEVBQUUsY0FERjtBQUVOQyxNQUFBQSxHQUFHLEVBQUUsb0NBRkM7QUFHTkgsTUFBQUEsS0FBSyxFQUFFO0FBSEQ7QUFkSixHQWpFbUI7QUFxRnpCTSxFQUFBQSxJQUFJLEVBQUU7QUFyRm1CLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvbWVyZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZyB7XG4gIHJlYWRvbmx5IGFwcD86IG9iamVjdDtcbiAgcmVhZG9ubHkgYXJhbmdvZGI/OiBvYmplY3Q7XG4gIHJlYWRvbmx5IGF3cz86IG9iamVjdDtcbiAgcmVhZG9ubHkgZ2lwaHk/OiBvYmplY3Q7XG4gIHJlYWRvbmx5IGdvb2dsZT86IG9iamVjdDtcbiAgcmVhZG9ubHkgaW1hZ2U/OiBvYmplY3Q7XG4gIHJlYWRvbmx5IHJlZGlzPzogb2JqZWN0O1xuICByZWFkb25seSBzdHJpcGU/OiBvYmplY3Q7XG4gIHJlYWRvbmx5IHR3aWxpbz86IG9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZDb25maWcge1xuICByZWFkb25seSBkZWZhdWx0OiBBcHBDb25maWc7XG4gIHJlYWRvbmx5IGRldjogQXBwQ29uZmlnO1xuICByZWFkb25seSBwcm9kOiBBcHBDb25maWc7XG4gIHJlYWRvbmx5IHRlc3Q6IEFwcENvbmZpZztcbn1cblxuY29uc3QgYXBwUGFja2FnZTogYW55ID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5cbmNvbnN0IHtcbiAgYXJhbmdvZGJEYXRhYmFzZSA9ICdyZWFrdG9yJyxcbiAgYXJhbmdvZGJQYXNzd29yZCxcbiAgYXJhbmdvZGJQb3J0ID0gJzg1MjknLFxuICBhcmFuZ29kYlVybCA9ICdkYi5yZWFrdG9yLmlvJyxcbiAgYXJhbmdvZGJVc2VybmFtZSA9ICdyZWFrdG9yJ1xufSA9IHByb2Nlc3MuZW52O1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgc3RhdGljIHZhbHVlczogRW52Q29uZmlnID0ge1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFwcDoge1xuICAgICAgICBuYW1lOiAncmVha3RvcicsXG4gICAgICAgIHVybDogJ3JlYWt0b3IuaW8nLFxuICAgICAgICB2ZXJzaW9uOiBhcHBQYWNrYWdlLnZlcnNpb25cbiAgICAgIH0sXG4gICAgICBhcmFuZ29kYjoge1xuICAgICAgICBkYXRhYmFzZTogYXJhbmdvZGJEYXRhYmFzZSxcbiAgICAgICAgZHVtcDogJy9BcHBsaWNhdGlvbnMvQXJhbmdvREItQ0xJLmFwcC9Db250ZW50cy9NYWNPUy9hcmFuZ29kdW1wJyxcbiAgICAgICAgcGFzc3dvcmQ6IGFyYW5nb2RiUGFzc3dvcmQsXG4gICAgICAgIHBvcnQ6IGFyYW5nb2RiUG9ydCxcbiAgICAgICAgcmVzdG9yZTogJy9BcHBsaWNhdGlvbnMvQXJhbmdvREItQ0xJLmFwcC9Db250ZW50cy9NYWNPUy9hcmFuZ29yZXN0b3JlJyxcbiAgICAgICAgdXJsOiBgJHthcmFuZ29kYlVybH06JHthcmFuZ29kYlBvcnR9YCxcbiAgICAgICAgdXNlcm5hbWU6IGFyYW5nb2RiVXNlcm5hbWVcbiAgICAgIH0sXG4gICAgICBhd3M6IHtcbiAgICAgICAgQnVja2V0OiAnZGV2LnJlYWt0b3IuaW8nLFxuICAgICAgICBhY2Nlc3NLZXlJZDogJ0FLSUFKSVlEVDNFQTJaRk1USk5BJyxcbiAgICAgICAgbWF4UmV0cmllczogMyxcbiAgICAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiAnYlVzc1FSdEpUWkM3Z2VGOVJESDVLQ244Q2FsVm5mMlZUMzR5cVMrOScsXG4gICAgICAgIHNpZ25hdHVyZVZlcnNpb246ICd2NCdcbiAgICAgIH0sXG4gICAgICBnaXBoeToge1xuICAgICAgICBrZXk6ICdkYzZ6YVRPeEZKbXpDJ1xuICAgICAgfSxcbiAgICAgIGdvb2dsZToge1xuICAgICAgICBhbmFseXRpY3M6IHtcbiAgICAgICAgICBhY2NvdW50SWQ6ICc3ODE1ODcxNycsXG4gICAgICAgICAgdHJhY2tpbmdJZDogJ1VBLTc4MTU4NzE3LTEnXG4gICAgICAgIH0sXG4gICAgICAgIGdlb2NvZGU6IHtcbiAgICAgICAgICBrZXk6ICdBSXphU3lCd2ptcEJqV2hpSm9CQ1ppWXpSdXJNOW00V25DeHNsdjAnLFxuICAgICAgICAgIHVybDogJ2h0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9nZW9jb2RlL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIGtleTogJ0FJemFTeUMzX2YyVXMzeTBxamJ5TUotNHQ1T2J0Q3pmcV9GSElnUSdcbiAgICAgIH0sXG4gICAgICBpbWFnZToge1xuICAgICAgICBpbWdRdWFsaXR5OiA5MCxcbiAgICAgICAgaW1nU2l6ZTogMTUwMCxcbiAgICAgICAgdGhtUXVhbGl0eTogODAsXG4gICAgICAgIHRobVNpemU6IDE1MFxuICAgICAgfSxcbiAgICAgIHJlZGlzOiB7XG4gICAgICAgIGhvc3Q6ICcxMjcuMC4wLjEnLFxuICAgICAgICBwb3J0OiA2Mzc5XG4gICAgICB9LFxuICAgICAgc3RyaXBlOiB7XG4gICAgICAgIHRva2VuOiAnc2tfdGVzdF9MUzk1NmJlNTdZVVhUQjVhNHNMR2I1QlEnXG4gICAgICB9LFxuICAgICAgdHdpbGlvOiB7XG4gICAgICAgIG51bWJlcjogJysxNTAwNTU1MDAwNicsXG4gICAgICAgIHNpZDogJ0FDNmJkN2Y1MTNjYmVkMmU1MTM0YzY1MGJlMDZjYzczMmUnLFxuICAgICAgICB0b2tlbjogJzUyMGFlNzM5ZTc2MWJhYjc1OWIxNDdmMWFkMjgyNzhmJ1xuICAgICAgfVxuICAgIH0sXG4gICAgZGV2OiB7XG4gICAgICBhd3M6IHtcbiAgICAgICAgQnVja2V0OiAnZGV2LnJlYWt0b3IuaW8nXG4gICAgICB9LFxuICAgICAgcmVkaXM6IHtcbiAgICAgICAgaG9zdDogJ25sLXJlZGlzLmVoY3ZudC5uZy4wMDAxLnVzZTEuY2FjaGUuYW1hem9uYXdzLmNvbSdcbiAgICAgIH1cbiAgICB9LFxuICAgIHByb2Q6IHtcbiAgICAgIGFyYW5nb2RiOiB7XG4gICAgICAgIGR1bXA6ICcvdXNyL2Jpbi9hcmFuZ29kdW1wJyxcbiAgICAgICAgcmVzdG9yZTogJy91c3IvYmluL2FyYW5nb3Jlc3RvcmUnXG4gICAgICB9LFxuICAgICAgYXdzOiB7XG4gICAgICAgIEJ1Y2tldDogJ2JveC5yZWFrdG9yLmlvJ1xuICAgICAgfSxcbiAgICAgIHJlZGlzOiB7XG4gICAgICAgIGhvc3Q6ICdubC1yZWRpcy5laGN2bnQubmcuMDAwMS51c2UxLmNhY2hlLmFtYXpvbmF3cy5jb20nXG4gICAgICB9LFxuICAgICAgc3RyaXBlOiB7XG4gICAgICAgIHRva2VuOiAnc2tfbGl2ZV9iRWxabDhSTGhNQ0p5MzNLRzRseUxENG8nXG4gICAgICB9LFxuICAgICAgdHdpbGlvOiB7XG4gICAgICAgIG51bWJlcjogJysxODU1NDE2NTIyNycsXG4gICAgICAgIHNpZDogJ0FDOTBiMDUyOGE5MTFlNjUyZDY0MzMyOWE0ZDdiNGQyYzcnLFxuICAgICAgICB0b2tlbjogJ2E3OTQxZDE3M2JkNDg0NmQwOTY2YTE4NmU5ODY1YjcyJ1xuICAgICAgfVxuICAgIH0sXG4gICAgdGVzdDoge1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBlbnZpcm9ubWVudDogc3RyaW5nID0gcHJvY2Vzcy5lbnYuc3RhZ2UgfHwgJ2Rldic7XG4gICAgY29uc3QgY29uZmlnVmFsdWVzOiBvYmplY3QgPSBtZXJnZSh0aGlzLnZhbHVlcy5kZWZhdWx0LCB0aGlzLnZhbHVlc1tlbnZpcm9ubWVudF0sIHtlbnZpcm9ubWVudH0pO1xuICAgIHJldHVybiBnZXQoY29uZmlnVmFsdWVzLCBwYXRoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.symbol");
4
+
5
+ require("core-js/modules/es.array.concat");
6
+
7
+ require("core-js/modules/es.array.filter");
8
+
9
+ require("core-js/modules/es.array.for-each");
10
+
11
+ require("core-js/modules/es.array.map");
12
+
13
+ require("core-js/modules/es.array.slice");
14
+
15
+ require("core-js/modules/es.date.now");
16
+
17
+ require("core-js/modules/es.date.to-string");
18
+
19
+ require("core-js/modules/es.function.name");
20
+
21
+ require("core-js/modules/es.object.define-properties");
22
+
23
+ require("core-js/modules/es.object.define-property");
24
+
25
+ require("core-js/modules/es.object.freeze");
26
+
27
+ require("core-js/modules/es.object.get-own-property-descriptor");
28
+
29
+ require("core-js/modules/es.object.get-own-property-descriptors");
30
+
31
+ require("core-js/modules/es.object.keys");
32
+
33
+ require("core-js/modules/es.string.sub");
34
+
35
+ require("core-js/modules/web.dom-collections.for-each");
36
+
37
+ Object.defineProperty(exports, "__esModule", {
38
+ value: true
39
+ });
40
+ exports.removeUserToConversation = exports.addUserToConversation = exports.updateConversation = exports.getConversation = exports.getDirectConversation = exports.getConversationList = void 0;
41
+
42
+ var _utils = require("@nlabs/utils");
43
+
44
+ var _arangojs = require("arangojs");
45
+
46
+ var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
47
+
48
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
49
+
50
+ var _utils2 = require("../utils");
51
+
52
+ var _analytics = require("../utils/analytics");
53
+
54
+ var _images = require("./images");
55
+
56
+ var _users = require("./users");
57
+
58
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
59
+
60
+ function _templateObject5() {
61
+ var data = _taggedTemplateLiteral(["FOR c IN hasConversations\n FILTER c._from == ", " && c._to == ", "\n LIMIT 1\n REMOVE c IN hasConversations\n RETURN OLD"]);
62
+
63
+ _templateObject5 = function _templateObject5() {
64
+ return data;
65
+ };
66
+
67
+ return data;
68
+ }
69
+
70
+ function _templateObject4() {
71
+ var data = _taggedTemplateLiteral(["FOR c IN hasConversations\n FILTER c._from == ", " && c._to == ", "\n LIMIT 1\n RETURN c"]);
72
+
73
+ _templateObject4 = function _templateObject4() {
74
+ return data;
75
+ };
76
+
77
+ return data;
78
+ }
79
+
80
+ function _templateObject3() {
81
+ var data = _taggedTemplateLiteral(["UPSERT {_key: ", " }\n INSERT ", "\n UPDATE ", "\n IN conversations RETURN NEW"]);
82
+
83
+ _templateObject3 = function _templateObject3() {
84
+ return data;
85
+ };
86
+
87
+ return data;
88
+ }
89
+
90
+ 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; }
91
+
92
+ 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; }
93
+
94
+ 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; }
95
+
96
+ function _templateObject2() {
97
+ var data = _taggedTemplateLiteral(["FOR c, e IN 1..1 OUTBOUND ", " hasConversations\n FILTER c._id == ", "\n LET u = (\n FOR inUser, inEdge IN 1..1 INBOUND ", " hasConversations\n RETURN inUser\n )\n LIMIT 1\n RETURN MERGE(c, {users: u})"]);
98
+
99
+ _templateObject2 = function _templateObject2() {
100
+ return data;
101
+ };
102
+
103
+ return data;
104
+ }
105
+
106
+ function _templateObject() {
107
+ var data = _taggedTemplateLiteral(["LET from = (\n FOR c, e IN 1..1 OUTBOUND ", " hasConversations\n FILTER c.direct == true\n RETURN c\n )\n LET to = (\n FOR c, e IN 1..1 OUTBOUND ", " hasConversations\n FILTER c.direct == true\n RETURN c\n )\n LET conversation = FIRST(INTERSECTION(from, to))\n LET users = !IS_NULL(conversation) && (\n FOR g IN[", ", ", "]\n FOR u IN users\n FILTER g == u._id\n RETURN u\n )\n RETURN IS_NULL(conversation) ? null : MERGE(conversation, {users: users})"]);
108
+
109
+ _templateObject = function _templateObject() {
110
+ return data;
111
+ };
112
+
113
+ return data;
114
+ }
115
+
116
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
117
+
118
+ var eventCategory = 'conversations';
119
+
120
+ var getConversationList = function getConversationList(context, from, to) {
121
+ var action = 'getList';
122
+ var database = context.database,
123
+ sessionId = context.userId;
124
+ var limit = (0, _utils2.getLimit)(from, to);
125
+ var sessionDocId = "users/".concat(sessionId);
126
+ var aqlQry = "FOR c, e IN 1..1 OUTBOUND \"".concat(sessionDocId, "\" hasConversations\n ").concat(limit.aql, "\n LET users = (\n FOR u, uc IN 1..1 INBOUND c._id hasConversations\n FILTER u._id != \"").concat(sessionDocId, "\"\n RETURN u\n )\n RETURN MERGE(c, {users: users})");
127
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
128
+ return cursor.all();
129
+ })["catch"](function (error) {
130
+ return (0, _analytics.logError)({
131
+ action: action,
132
+ category: eventCategory,
133
+ label: 'db_error'
134
+ }, error, context).then(function () {
135
+ return null;
136
+ });
137
+ });
138
+ };
139
+
140
+ exports.getConversationList = getConversationList;
141
+
142
+ var getDirectConversation = function getDirectConversation(context, userId) {
143
+ var action = 'getDirectConversation';
144
+ var database = context.database,
145
+ sessionId = context.userId;
146
+ var sessionDocId = "users/".concat(sessionId);
147
+ var userDocId = "users/".concat((0, _utils.parseId)(userId));
148
+ var aqlQry = (0, _arangojs.aql)(_templateObject(), sessionDocId, userDocId, sessionDocId, userDocId);
149
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
150
+ return cursor.next();
151
+ })["catch"](function (error) {
152
+ return (0, _analytics.logError)({
153
+ action: action,
154
+ category: eventCategory,
155
+ label: 'db_error'
156
+ }, error, context).then(function () {
157
+ return null;
158
+ });
159
+ });
160
+ };
161
+
162
+ exports.getDirectConversation = getDirectConversation;
163
+
164
+ var getConversation = function getConversation(context, convoId) {
165
+ var action = 'getItem';
166
+ var database = context.database,
167
+ sessionId = context.userId;
168
+ var sessionDocId = "users/".concat(sessionId);
169
+ var convoDocId = "conversations/".concat((0, _utils.parseId)(convoId));
170
+ var aqlQry = (0, _arangojs.aql)(_templateObject2(), sessionDocId, convoDocId, convoDocId);
171
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
172
+ return cursor.next();
173
+ }).then(function () {
174
+ var conversation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
175
+
176
+ if (!(0, _isEmpty["default"])(conversation)) {
177
+ conversation.users = conversation.users.map(function (user) {
178
+ var imgId = user.imgId,
179
+ sub = user.sub;
180
+ var thumbUrlData = {
181
+ imgId: imgId,
182
+ isThumb: true,
183
+ sub: sub
184
+ };
185
+ return _objectSpread(_objectSpread({}, user), {}, {
186
+ name: (0, _users.getDisplayName)(user),
187
+ thumb: (0, _images.getUserImageUrl)(thumbUrlData)
188
+ });
189
+ });
190
+ return conversation;
191
+ }
192
+
193
+ return {};
194
+ })["catch"](function (error) {
195
+ return (0, _analytics.logError)({
196
+ action: action,
197
+ category: eventCategory,
198
+ label: 'db_error'
199
+ }, error, context).then(function () {
200
+ return null;
201
+ });
202
+ });
203
+ };
204
+
205
+ exports.getConversation = getConversation;
206
+
207
+ var updateConversation = function updateConversation(context, conversation) {
208
+ var action = 'updateConversation';
209
+ var database = context.database,
210
+ sessionId = context.userId;
211
+ var direct = conversation.direct,
212
+ _conversation$convoId = conversation.convoId,
213
+ convoId = _conversation$convoId === void 0 ? (0, _utils.createHash)("convo - ".concat(sessionId, " ")) : _conversation$convoId,
214
+ name = conversation.name;
215
+ var formatConvoId = (0, _utils.parseId)(convoId);
216
+ var now = Date.now();
217
+ var update = {
218
+ // Direct message
219
+ direct: direct,
220
+ modified: now,
221
+ name: name
222
+ };
223
+
224
+ var insert = _objectSpread(_objectSpread({}, (0, _cloneDeep["default"])(update)), {}, {
225
+ _key: formatConvoId,
226
+ added: now
227
+ });
228
+
229
+ var aqlQry = (0, _arangojs.aql)(_templateObject3(), formatConvoId, insert, update);
230
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
231
+ return cursor.next();
232
+ }).then(function () {
233
+ var conversation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
234
+ return conversation;
235
+ })["catch"](function (error) {
236
+ return (0, _analytics.logError)({
237
+ action: action,
238
+ category: eventCategory,
239
+ label: 'db_error'
240
+ }, error, context).then(function () {
241
+ return null;
242
+ });
243
+ });
244
+ };
245
+
246
+ exports.updateConversation = updateConversation;
247
+
248
+ var addUserToConversation = function addUserToConversation(context, convoId, userId) {
249
+ var action = 'addUserToConversation';
250
+ var database = context.database;
251
+ var formatConvoId = (0, _utils.parseId)(convoId);
252
+ var formatUserId = (0, _utils.parseId)(userId);
253
+ var convoDocId = "conversations/".concat(formatConvoId, " ");
254
+ var userDocId = "users/".concat(formatUserId, " ");
255
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), userDocId, convoDocId);
256
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
257
+ return cursor.next();
258
+ }).then(function (conversationEdge) {
259
+ if (!!conversationEdge) {
260
+ return conversationEdge;
261
+ }
262
+
263
+ var edgeCollection = (0, _utils2.useDb)(database).collection('hasConversations');
264
+ var edgeId = (0, _utils.createHash)("convo - ".concat(formatConvoId, " -").concat(formatUserId, " "));
265
+ var edge = {
266
+ _from: userDocId,
267
+ _key: edgeId,
268
+ _to: convoDocId,
269
+ added: Date.now()
270
+ };
271
+ return edgeCollection.save(edge, {
272
+ returnNew: true
273
+ }).then(function () {
274
+ return edge;
275
+ });
276
+ })["catch"](function (error) {
277
+ return (0, _analytics.logError)({
278
+ action: action,
279
+ category: eventCategory,
280
+ label: 'db_error'
281
+ }, error, context).then(function () {
282
+ return null;
283
+ });
284
+ });
285
+ };
286
+
287
+ exports.addUserToConversation = addUserToConversation;
288
+
289
+ var removeUserToConversation = function removeUserToConversation(context, convoId, userId) {
290
+ var action = 'addUserToConversation';
291
+ var database = context.database;
292
+ var formatConvoId = (0, _utils.parseId)(convoId);
293
+ var formatUserId = (0, _utils.parseId)(userId);
294
+ var convoDocId = "conversations / ".concat(formatConvoId, " ");
295
+ var userDocId = "users/".concat(formatUserId, " ");
296
+ var aqlQry = (0, _arangojs.aql)(_templateObject5(), userDocId, convoDocId);
297
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
298
+ return cursor.next();
299
+ })["catch"](function (error) {
300
+ return (0, _analytics.logError)({
301
+ action: action,
302
+ category: eventCategory,
303
+ label: 'db_error'
304
+ }, error, context).then(function () {
305
+ return null;
306
+ });
307
+ });
308
+ };
309
+
310
+ exports.removeUserToConversation = removeUserToConversation;
311
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2NvbnZlcnNhdGlvbnMudHMiXSwibmFtZXMiOlsiZXZlbnRDYXRlZ29yeSIsImdldENvbnZlcnNhdGlvbkxpc3QiLCJjb250ZXh0IiwiZnJvbSIsInRvIiwiYWN0aW9uIiwiZGF0YWJhc2UiLCJzZXNzaW9uSWQiLCJ1c2VySWQiLCJsaW1pdCIsInNlc3Npb25Eb2NJZCIsImFxbFFyeSIsImFxbCIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImFsbCIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsImdldERpcmVjdENvbnZlcnNhdGlvbiIsInVzZXJEb2NJZCIsIm5leHQiLCJnZXRDb252ZXJzYXRpb24iLCJjb252b0lkIiwiY29udm9Eb2NJZCIsImNvbnZlcnNhdGlvbiIsInVzZXJzIiwibWFwIiwidXNlciIsImltZ0lkIiwic3ViIiwidGh1bWJVcmxEYXRhIiwiaXNUaHVtYiIsIm5hbWUiLCJ0aHVtYiIsInVwZGF0ZUNvbnZlcnNhdGlvbiIsImRpcmVjdCIsImZvcm1hdENvbnZvSWQiLCJub3ciLCJEYXRlIiwidXBkYXRlIiwibW9kaWZpZWQiLCJpbnNlcnQiLCJfa2V5IiwiYWRkZWQiLCJhZGRVc2VyVG9Db252ZXJzYXRpb24iLCJmb3JtYXRVc2VySWQiLCJjb252ZXJzYXRpb25FZGdlIiwiZWRnZUNvbGxlY3Rpb24iLCJjb2xsZWN0aW9uIiwiZWRnZUlkIiwiZWRnZSIsIl9mcm9tIiwiX3RvIiwic2F2ZSIsInJldHVybk5ldyIsInJlbW92ZVVzZXJUb0NvbnZlcnNhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxhQUFxQixHQUFHLGVBQTlCOztBQUVP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QUFILHNCQUNBUyxTQURBLEVBQ3lCSSxVQUR6QixDQUF0QjtBQU1BLFNBQU8sbUJBQU1uQixRQUFOLEVBQWdCTyxLQUFoQixDQUFzQkYsTUFBdEIsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDTyxJQUFQLEVBQXpCO0FBQUEsR0FERCxXQUVFLFVBQUNMLEtBQUQ7QUFBQSxXQUFrQix5QkFBUztBQUNoQ1osTUFBQUEsTUFBTSxFQUFOQSxNQURnQztBQUVoQ2EsTUFBQUEsUUFBUSxFQUFFbEIsYUFGc0I7QUFHaENtQixNQUFBQSxLQUFLLEVBQUU7QUFIeUIsS0FBVCxFQUl0QkYsS0FKc0IsRUFJZmYsT0FKZSxFQUlOWSxJQUpNLENBSUQ7QUFBQSxhQUFNLElBQU47QUFBQSxLQUpDLENBQWxCO0FBQUEsR0FGRixDQUFQO0FBT0QsQ0FyQk0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICd0eXBlcy9hdXRoJztcblxuaW1wb3J0IHtBcmFuZ29EQkxpbWl0LCBDb252ZXJzYXRpb25UeXBlLCBJbWFnZVVybERhdGEsIFVzZXJUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2dldExpbWl0LCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzJztcbmltcG9ydCB7Z2V0VXNlckltYWdlVXJsfSBmcm9tICcuL2ltYWdlcyc7XG5pbXBvcnQge2dldERpc3BsYXlOYW1lfSBmcm9tICcuL3VzZXJzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ2NvbnZlcnNhdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9uTGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCBcIiR7c2Vzc2lvbkRvY0lkfVwiIGhhc0NvbnZlcnNhdGlvbnNcbiAgICAke2xpbWl0LmFxbH1cbiAgICBMRVQgdXNlcnMgPSAoXG4gICAgICBGT1IgdSwgdWMgSU4gMS4uMSBJTkJPVU5EIGMuX2lkIGhhc0NvbnZlcnNhdGlvbnNcbiAgICAgIEZJTFRFUiB1Ll9pZCAhPSBcIiR7c2Vzc2lvbkRvY0lkfVwiXG4gICAgICBSRVRVUk4gdVxuICAgIClcbiAgICBSRVRVUk4gTUVSR0UoYywge3VzZXJzOiB1c2Vyc30pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpcmVjdENvbnZlcnNhdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlc3Npb25Eb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IHVzZXJEb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7cGFyc2VJZCh1c2VySWQpfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgZnJvbSA9IChcbiAgICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtzZXNzaW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvbnNcbiAgICAgIEZJTFRFUiBjLmRpcmVjdCA9PSB0cnVlXG4gICAgICBSRVRVUk4gY1xuICAgIClcbiAgICBMRVQgdG8gPSAoXG4gICAgICBGT1IgYywgZSBJTiAxLi4xIE9VVEJPVU5EICR7dXNlckRvY0lkfSBoYXNDb252ZXJzYXRpb25zXG4gICAgICBGSUxURVIgYy5kaXJlY3QgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIGNcbiAgICApXG4gICAgTEVUIGNvbnZlcnNhdGlvbiA9IEZJUlNUKElOVEVSU0VDVElPTihmcm9tLCB0bykpXG4gICAgTEVUIHVzZXJzID0gIUlTX05VTEwoY29udmVyc2F0aW9uKSAmJiAoXG4gICAgICBGT1IgZyBJTlske3Nlc3Npb25Eb2NJZH0sICR7dXNlckRvY0lkfV1cbiAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgZyA9PSB1Ll9pZFxuICAgICAgUkVUVVJOIHVcbiAgICApXG4gICAgUkVUVVJOIElTX05VTEwoY29udmVyc2F0aW9uKSA/IG51bGwgOiBNRVJHRShjb252ZXJzYXRpb24sIHt1c2VyczogdXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbnZvSWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBzZXNzaW9uRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBjb252b0RvY0lkOiBzdHJpbmcgPSBgY29udmVyc2F0aW9ucy8ke3BhcnNlSWQoY29udm9JZCl9YDtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtzZXNzaW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvbnNcbiAgICBGSUxURVIgYy5faWQgPT0gJHtjb252b0RvY0lkfVxuICAgIExFVCB1ID0gKFxuICAgICAgRk9SIGluVXNlciwgaW5FZGdlIElOIDEuLjEgSU5CT1VORCAke2NvbnZvRG9jSWR9IGhhc0NvbnZlcnNhdGlvbnNcbiAgICAgIFJFVFVSTiBpblVzZXJcbiAgICApXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBNRVJHRShjLCB7dXNlcnM6IHV9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSA9IHt9KSA9PiB7XG4gICAgICBpZighaXNFbXB0eShjb252ZXJzYXRpb24pKSB7XG4gICAgICAgIGNvbnZlcnNhdGlvbi51c2VycyA9IGNvbnZlcnNhdGlvbi51c2Vycy5tYXAoKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICAgICAgY29uc3Qge2ltZ0lkLCBzdWJ9ID0gdXNlcjtcbiAgICAgICAgICBjb25zdCB0aHVtYlVybERhdGE6IEltYWdlVXJsRGF0YSA9IHtcbiAgICAgICAgICAgIGltZ0lkLFxuICAgICAgICAgICAgaXNUaHVtYjogdHJ1ZSxcbiAgICAgICAgICAgIHN1YlxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnVzZXIsXG4gICAgICAgICAgICBuYW1lOiBnZXREaXNwbGF5TmFtZSh1c2VyKSxcbiAgICAgICAgICAgIHRodW1iOiBnZXRVc2VySW1hZ2VVcmwodGh1bWJVcmxEYXRhKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb252ZXJzYXRpb247XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDb252ZXJzYXRpb24gPSAoY29udGV4dDogQXBpQ29udGV4dCwgY29udmVyc2F0aW9uKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZUNvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGRpcmVjdCxcbiAgICBjb252b0lkID0gY3JlYXRlSGFzaChgY29udm8gLSAke3Nlc3Npb25JZH0gYCksXG4gICAgbmFtZVxuICB9ID0gY29udmVyc2F0aW9uO1xuICBjb25zdCBmb3JtYXRDb252b0lkOiBzdHJpbmcgPSBwYXJzZUlkKGNvbnZvSWQpO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHVwZGF0ZTogYW55ID0ge1xuICAgIC8vIERpcmVjdCBtZXNzYWdlXG4gICAgZGlyZWN0LFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLmNsb25lRGVlcCh1cGRhdGUpLFxuICAgIF9rZXk6IGZvcm1hdENvbnZvSWQsXG4gICAgYWRkZWQ6IG5vd1xuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdENvbnZvSWR9IH1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfVxuICAgIElOIGNvbnZlcnNhdGlvbnMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZSA9IHt9KSA9PiBjb252ZXJzYXRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvQ29udmVyc2F0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNvbnZvSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVXNlclRvQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENvbnZvSWQ6IHN0cmluZyA9IHBhcnNlSWQoY29udm9JZCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252b0RvY0lkOiBzdHJpbmcgPSBgY29udmVyc2F0aW9ucy8ke2Zvcm1hdENvbnZvSWR9IGA7XG4gIGNvbnN0IHVzZXJEb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfSBgO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gaGFzQ29udmVyc2F0aW9uc1xuICAgIEZJTFRFUiBjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBjLl90byA9PSAke2NvbnZvRG9jSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBjYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uRWRnZSkgPT4ge1xuICAgICAgaWYoISFjb252ZXJzYXRpb25FZGdlKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJzYXRpb25FZGdlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZSkuY29sbGVjdGlvbignaGFzQ29udmVyc2F0aW9ucycpO1xuICAgICAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBjb252byAtICR7Zm9ybWF0Q29udm9JZH0gLSR7Zm9ybWF0VXNlcklkfSBgKTtcblxuICAgICAgY29uc3QgZWRnZTogQ29udmVyc2F0aW9uVHlwZSA9IHtcbiAgICAgICAgX2Zyb206IHVzZXJEb2NJZCxcbiAgICAgICAgX2tleTogZWRnZUlkLFxuICAgICAgICBfdG86IGNvbnZvRG9jSWQsXG4gICAgICAgIGFkZGVkOiBEYXRlLm5vdygpXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBlZGdlKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVVzZXJUb0NvbnZlcnNhdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252b0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFVzZXJUb0NvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRDb252b0lkOiBzdHJpbmcgPSBwYXJzZUlkKGNvbnZvSWQpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3QgY29udm9Eb2NJZDogc3RyaW5nID0gYGNvbnZlcnNhdGlvbnMgLyAke2Zvcm1hdENvbnZvSWR9IGA7XG4gIGNvbnN0IHVzZXJEb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfSBgO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gaGFzQ29udmVyc2F0aW9uc1xuICAgIEZJTFRFUiBjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBjLl90byA9PSAke2NvbnZvRG9jSWR9XG4gICAgTElNSVQgMVxuICAgIFJFTU9WRSBjIElOIGhhc0NvbnZlcnNhdGlvbnNcbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG4iXX0=